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. three.js优化

    Three js 开发的一些知识整理,方便后期遇到类似的问题,能够及时查阅使用. three.js 性能优化方面,整理一下常用的优化方法或者方向,供大家一个优化思考的方向 尽量重用Material和G ...

  2. 一图归纳三大种类矩阵范数:诱导范数,元素范数,Schatten范数,涵盖谱范数,2范数

    转载自:https://blog.csdn.net/qq_27261889/article/details/87902480

  3. windows安装gitbook并部署发布到openEuler欧拉服务器

    1. 安装nodejs10 下载安装nvm https://github.com/coreybutler/nvm-windows/releases/download/1.1.9/nvm-setup.e ...

  4. 【Amadeus原创】群晖关闭局域网发现

    套件中心-媒体服务器,卸载.

  5. 【XML】学习笔记第二章-dtd

    目录 XML-DTD DTD语句 基本声明语句 引用外部DTD DTD元素 四种元素类型 元素定义关键字 修饰符号 DTD中的属性 属性修饰 属性类型 DTD中的实体和符号 符号 坑 XML-DTD ...

  6. How to Disable SELinux in Ubuntu Server/Desktop

    https://www.configserverfirewall.com/ubuntu-linux/disable-selinux-ubuntu/ In this tutorial I will ex ...

  7. 谈谈 HTTP/2 的协议协商机制

    在过去的几个月里,我写了很多有关 HTTP/2 的文章,也做过好几场相关分享.我在向大家介绍 HTTP/2 的过程中,有一些问题经常会被问到.例如要部署 HTTP/2 一定要先升级到 HTTPS 么? ...

  8. 区块链技术已经衰落了吗?(区块链已die)

    区块链技术已经好多年没有听到有人提了,不过比特币却一直是不是的又新闻出现,当然国内已经把比特币交易归入到了不合法的地位了.区块链技术是国家战略的技术,但是这个技术说实话确实不是很高深,或者说蛮easy ...

  9. 国产系统UOS上的视频监控系统

    一.功能特点 (一)软件模块 视频监控模块,各种停靠小窗体子模块,包括设备列表.图文警情.窗口信息.云台控制.预置位.巡航设置.设备控制.悬浮地图.网页浏览等. 视频回放模块,包括本地回放.远程回放. ...

  10. Qt通用方法及类库1

    函数名 //桌面宽度高度 static int deskWidth(); static int deskHeight(); //程序文件名称+当前所在路径 static QString appName ...