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)

效果:
在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐