langchain介绍

LangChain 是一个用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。 简单来说,它可以帮助你更轻松地构建利用 LLM(例如 OpenAI 的 GPT 模型、Google 的 PaLM 模型等)的应用程序。

实践

给大模型添加联网功能也就是添加一个搜索引擎。一种方式就是先经过搜索引擎再把信息传给大模型进行回答,另一种就是使用function calling + 搜索引擎API 让大模型自己决定是否需要使用联网功能。

而免费的搜索引擎指的是duckduckgo,可能效果上没有付费的搜索引擎比如必应api与谷歌api好就是了,但是单纯用于测试联网功能的实现那也足够了。

首先先简单过一遍langchain的使用。

接入OpenAI的大模型并使用非流式与流式响应:

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage api_key = "你的api_key" model = init_chat_model("gpt-4o-mini", model_provider="openai",api_key=api_key) print(model.invoke([HumanMessage(content="你是谁?")])) messages = [
HumanMessage("你是谁?"),
]
for token in model.stream(messages):
print(token.content, end="|")

再试一下接入国内的大模型并使用非流式与流式响应:

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage api_key = "你的api_key"
base_url = "https://api.siliconflow.cn/v1"
model = init_chat_model("Qwen/Qwen2.5-72B-Instruct", model_provider="openai",api_key=api_key,base_url=base_url) print(model.invoke([HumanMessage(content="你是谁?")])) messages = [
HumanMessage("你是谁?"),
]
for token in model.stream(messages):
print(token.content, end="|")

由于这个功能的实现,需要使用工具调用,现在来看看在langchain如何使用工具调用:

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from duckduckgo_search import DDGS @tool
def add(a: int, b: int) -> int:
"""Adds a and b."""
return a + b tools = [add] api_key = "你的api_key"
base_url = "https://api.siliconflow.cn/v1"
model = init_chat_model("Qwen/Qwen2.5-72B-Instruct", model_provider="openai",api_key=api_key,base_url=base_url) llm_with_tools = model.bind_tools(tools) query = "1+3等于几" messages = [HumanMessage(query)] ai_msg = llm_with_tools.invoke(messages) print(ai_msg.tool_calls) messages.append(ai_msg) for tool_call in ai_msg.tool_calls:
selected_tool = {"add": add}[tool_call["name"].lower()]
tool_msg = selected_tool.invoke(tool_call)
print(tool_msg)
messages.append(tool_msg) print(llm_with_tools.invoke(messages).content)

现在来使用duckduckgo:

from duckduckgo_search import DDGS

query = "mingupup是谁?"
results = DDGS().text(query, max_results=10)
print(results)

将搜索引擎与工具调用结合在一起:

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from duckduckgo_search import DDGS @tool
def add(a: int, b: int) -> int:
"""Adds a and b."""
return a + b @tool
def get_web_data(query:str) -> str:
"""使用DuckDuckGo搜索引擎进行搜索""" results = DDGS().text(query, max_results=10) return results tools = [add,get_web_data] api_key = "你的api_key"
base_url = "https://api.siliconflow.cn/v1"
model = init_chat_model("Qwen/Qwen2.5-72B-Instruct", model_provider="openai",api_key=api_key,base_url=base_url) llm_with_tools = model.bind_tools(tools) query = "mingupup是谁?" messages = [HumanMessage(query)] ai_msg = llm_with_tools.invoke(messages) print(ai_msg.tool_calls) messages.append(ai_msg) for tool_call in ai_msg.tool_calls:
selected_tool = {"add": add,"get_web_data":get_web_data}[tool_call["name"].lower()]
tool_msg = selected_tool.invoke(tool_call)
print(tool_msg)
messages.append(tool_msg) print(llm_with_tools.invoke(messages).content)

以上就快速实现了简单的联网功能,如果你还想快速创建一个对话应用来测试联网功能,可以使用chainlit:

import chainlit as cl
from datetime import datetime
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from duckduckgo_search import DDGS #@cl.step(type="tool") # type: ignore
@tool
def get_time() -> str:
"""获取当前时间"""
# 获取当前时间
now = datetime.now()
# 格式化时间为指定的字符串格式
formatted_time = now.strftime("当前时间是:%Y年%m月%d日 %H:%M。")
return formatted_time #@cl.step(type="tool") # type: ignore
@tool
def get_weather(city: str) -> str:
"""获取城市天气"""
return f" {city} 天气晴,25度。" #@cl.step(type="tool") # type: ignore
@tool
def get_web_data(query:str) -> str:
"""使用DuckDuckGo搜索引擎进行搜索"""
results = DDGS().text(query, max_results=10) return results tools = [get_time,get_weather,get_web_data] api_key = "你的api_key"
base_url = "https://api.siliconflow.cn/v1"
model = init_chat_model("Qwen/Qwen2.5-72B-Instruct", model_provider="openai",api_key=api_key,base_url=base_url) llm_with_tools = model.bind_tools(tools) @cl.on_chat_start
def on_chat_start():
print("A new chat session has started!")
# Set the assistant agent in the user session.
@cl.on_message
async def on_message(message: cl.Message): response = cl.Message(content="") messages = [HumanMessage(message.content)] ai_msg = llm_with_tools.invoke(messages) print(ai_msg.tool_calls) messages.append(ai_msg) for tool_call in ai_msg.tool_calls:
selected_tool = {"get_time": get_time,"get_weather": get_weather,"get_web_data":get_web_data}[tool_call["name"].lower()]
tool_msg = selected_tool.invoke(tool_call)
print(tool_msg)
messages.append(tool_msg) for token in llm_with_tools.stream(messages):
await response.stream_token(token.content) await response.send()
@cl.on_stop
def on_stop():
print("The user wants to stop the task!") @cl.on_chat_end
def on_chat_end():
print("The user disconnected!")

输入chainlit run 文件名 即可运行:

最后

以上就是今天的分享,介绍了如何自己动手快速且免费地为自己的AI应用添加联网功能,希望对你有所帮助。

给大模型添加联网功能的免费方案,以langchain为例的更多相关文章

  1. 【百度地图API】情人节求爱大作战——添加标注功能

    原文:[百度地图API]情人节求爱大作战--添加标注功能 任务描述: 2月2日是除夕,2月14立马来!即将到来的情人节,你想送TA一份什么礼物呢? 不如,在你们居住的地方,画个大大的桃心,表达你对TA ...

  2. 千亿参数开源大模型 BLOOM 背后的技术

    假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...

  3. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  4. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  5. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  6. 033医疗项目-模块三:药品供应商目录模块——供货商药品目录t添加查询功能----------Dao层和Service层和Action层和调试

    什么叫做供货商药品目录t添加查询功能?就是说我们前面的博客里面不是说供货商登录后看到了自己供应的药品了么如下: 现在供货商想要往里面添加别的药品,那么这个药品的来源就是卫生局提供的那个Ypxx表(药品 ...

  7. XMind十大最有用的功能

    XMind十大最有用的功能 XMind是一款顶级商业品质的思维导图软件和头脑风暴软件,在企业和教育领域都有很广泛的应用,XMind功能全面,易上手,在此小编给大家整理出了XMind十大最有用的功能以供 ...

  8. 为Spring添加REST功能

    1 关于REST 我的理解,REST就是将资源以最合适的形式在服务端和客户端之间传递. 系统中资源采用URL进行标识(可以理解为URL路径中带参数) 使用HTTP方法进行资源的管理(GET,PUT,P ...

  9. 011.Adding Search to an ASP.NET Core MVC app --【给程序添加搜索功能】

    Adding Search to an ASP.NET Core MVC app 给程序添加搜索功能 2017-3-7 7 分钟阅读时长 作者 本文内容 1.Adding Search by genr ...

  10. hexo next主题为博客添加分享功能

    title: hexo next主题为博客添加分享功能 date: 2018-01-06 20:20:02 tags: [hexo博客, 博客配置] categories: hexo next主题配置 ...

随机推荐

  1. IO介绍-下

    中断 由外部设备引起的中断,称为外中断. 由内部错误引起的中断,称为内中断,或者是陷入.例如:非法指令,地址越界,电源故障等.   中断向量表 中断优先级 多中断源的处理方式 屏蔽中断 嵌套中断 根据 ...

  2. django admin 后台管理 新手学习步骤记录 (2)

    学习使用django admin后台管理. 参考.Django基础之Admin后台数据管理_django admin_马航行的博客-CSDN博客

  3. Qt在linux下实现程序编译后版本号自增的脚本

    #! /bin/bash rm -rf temp.cpp num=0 while read line do if [ $num -eq 3 ];then array=(`echo $line | tr ...

  4. 腾讯技术岗位笔试&面试题(五)

    说在前面 本篇文章是腾讯技术面试题目汇总第五篇. 后续将持续推出互联网大厂,如阿里,腾讯,百度,美团,头条等技术面试题目,以及答案和分析. 欢迎大家点赞关注转发. 1.define.const.typ ...

  5. CentOS7.8安装k8s

    1, 安装 docker / kubelet # 在 master 节点和 worker 节点都要执行 \# 最后一个参数 1.20.6 用于指定 kubenetes 版本,支持所有 1.20.x 版 ...

  6. Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框

    一.前言 近期收到一个用户需求,要求音视频组件能够切换声卡,首先要在vlc上实现,于是马不停蹄的研究起来,马上查阅对应vlc有没有自带的api接口,查看接口前,先打开vlc播放器,看下能不能切换,因为 ...

  7. Qt编写地图综合应用47-经纬度地址互相转换

    一.前言 地址经纬度互换的功能只有在线地图有,因为需要去服务器查询对应的数据,拿到返回的数据,百度地图中需要用到BMap.Geocoder来实现这两个功能的互换,他内置了getPoint函数负责将地址 ...

  8. U盘或光盘启动的Win7-8-10的PE系统制作步骤

    U盘或光盘启动的Win7-8-10的PE系统制作步骤 1.打开http://www.ushendu.com/下载PE制作工具 2.下载完成后安装到我的电脑, 把准备好的U盘插到电脑上,打开U深度PE制 ...

  9. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  10. NVM及NODE开发环境搭建

    NVM及NODE开发环境搭建 1. 安装NVM 1.1 下载安装包 下载地址 1.2 安装 双击安装包,一路下一步即可.安装完成后在终端输入nvm version,能查到版本号说明安装成功了. 2. ...