给大模型添加联网功能的免费方案,以langchain为例
创作时间:
作者:
@小白创作中心
给大模型添加联网功能的免费方案,以langchain为例
引用
1
来源
1.
https://www.cnblogs.com/mingupupu/p/18735430
在大模型应用开发中,为模型添加联网功能可以显著提升其获取实时信息的能力。本文将介绍如何使用langchain框架结合免费的duckduckgo搜索引擎,快速实现这一功能。
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应用添加联网功能,希望对你有所帮助。
热门推荐
田馥甄妈妈回应引争议,70岁台湾老艺人方芳成两岸交流榜样
人口贩卖犯罪的打击行为与法律框架
美国国家全景解析之一:人口结构和发展趋势
心理提升:保持好心态的16个快乐心法
玫瑰痤疮患者不能吃哪些食物
甲状腺分泌什么激素?详解甲状腺激素功能与异常治疗
真实的东汉末年:乱世之痛与恐惧的深渊
北京户口的好处有哪些
经典价值投资案例参考,价值投资的成功典范解析
北人参,南桂圆!益气养血、养心安神别错过
为什么冰箱是柜子,而冰柜是箱子?
买已经出租的二手房需要注意哪些问题?
160斤的人能跳绳减肥吗?医生:这样做可能伤膝盖
决胜巅峰输出怎么选 强势输出英雄选择推荐
沙孟海先生为杭州灵隐寺书“大雄宝殿”四字的故事
巴西红耳龟的正确饲养方法(让你的新宠物健康快乐的关键)
2024年资产剥离研究报告
遭遇造谣诽谤如何维权?法律途径全解析
降本增效VS形式主义:2025年中国企业的生死突围战
如何选择适合自己的驾照类型
父母赠房妙招:如何确保子女独享房产权益?
房贷年利率计算指南:三种主流方法详解及实际应用
松骨峰大战多惨烈?敌我战损6比1,斯大林感叹:一支无敌的部队
拟募资额从36亿元降至18亿,云从科技的定增还是终止了
肠炎患者接受左氧氟沙星治疗有效吗
2024年补牙纳入医保了吗?一文详解口腔治疗医保报销政策
手机无线充电器利用了什么原理
深度学习降噪技术有助于提高短周期密集地震台阵地壳结构成像分辨率
抽血前抽烟会影响什么指标
更换固态硬盘(SSD)对电脑性能提升有多大影响?