LangChain调用多个tools
LangChain调用多个tools
·
1.使用单个tools
使用serpapi实现联网搜索,代码实现:
import os
from langchain_classic.agents import initialize_agent, AgentType
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_community.llms import Tongyi # 导入通义千问Tongyi模型
import dashscope
# 你需要在环境变量中添加 OPENAI_API_KEY 和 SERPAPI_API_KEY(注意:在windows10环境,配置完环境变量,需要重启PyCharm)
# serpapi:serpapi.com
# os.environ["OPENAI_API_KEY"] = '*******'
# os.environ["SERPAPI_API_KEY"] = '*******'
# 从环境变量获取 dashscope 的 API Key(Qwen大模型)
api_key = os.environ.get('DASHSCOPE_API_KEY')
dashscope.api_key = api_key
# 加载模型
llm = Tongyi(model_name="qwen3-max", dashscope_api_key=api_key)
# 加载 serpapi 工具
tools = load_tools(["serpapi"])
"""
agent:代理类型
zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用)
react-docstore: 使用 ReAct 框架和 docstore 交互, 使用Search 和Lookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具
self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具
conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存
"""
# 工具加载后需要初始化,verbose=True 代表打印执行详情
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运行 agent。
# 注意:需要补充“可以分成多步调用。”,要不无法实现:第一步,查询日期;第二步,基于日期查询历史名人。
agent.invoke("今天是几月几号?历史上的今天有哪些名人出生。可以分成多步调用。")
效果:

2.使用多个tools
问题:当前北京的温度是多少华氏度,这个温度的1/4是多少?
Serpapi,搜索当前北京的温度;
llm-math,计算这个温度的1/4。
代码实现:
import os
import re
from langchain_classic.agents import initialize_agent, AgentType
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_community.llms import Tongyi # 导入通义千问Tongyi模型
import dashscope
from langchain_core.tools import Tool
# 你需要在环境变量中添加 OPENAI_API_KEY 和 SERPAPI_API_KEY
# os.environ["OPENAI_API_KEY"] = '*******'
# os.environ["SERPAPI_API_KEY"] = '*******'
# 从环境变量获取 dashscope 的 API Key
api_key = os.environ.get('DASHSCOPE_API_KEY')
dashscope.api_key = api_key
# 加载 Tongyi 模型
llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=api_key)
# 加载 serpapi 工具
tools = load_tools(["serpapi"], llm=llm)
# 创建自定义数学计算工具
def calculator(expression: str) -> str:
"""执行简单的数学计算"""
try:
# 清理表达式,只保留数字和基本运算符
cleaned_expression = re.sub(r'[^0-9+\-*/(). ]', '', expression)
# 计算结果
result = eval(cleaned_expression)
return str(result)
except Exception as e:
return f"计算错误: {str(e)}"
math_tool = Tool(
name="Calculator",
func=calculator,
description="用于执行数学计算。只输入数学表达式,如: 11 / 4"
)
# 添加数学工具到工具列表
tools.append(math_tool)
# 工具加载后需要初始化,verbose=True 代表打印执行详情
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运行 agent
result = agent.invoke({"input": "当前上海的温度是多少摄氏度?这个温度的1/4是多少摄氏度?"})
print(result)
效果:
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)