【动手学Langchain】初级篇4-Agent

Posted by Orchid on February 19, 2025

什么是 Agent

在 LangChain 中,Agent 是一个核心组件,用于动态管理和执行任务,通过调用语言模型(LLM)和工具(Tools)来完成复杂的任务。Agent 的主要作用是根据用户输入的任务描述,智能地选择并调用合适的工具,逐步解决问题,最终生成答案。

Agent的简单使用

假设,我们的需求是:agent 能够使用网络搜索的工具,来回答关于“三天后上海的天气如何”的问题

  • LangChain 内置 GoogleSearch 的网络搜索工具 serpapi,但是国内不方便使用
  • 这里使用国内的 Bocha Web Search API 来替代,但是需要自己定义工具
  • Bocha Web Search API 密钥获取与充值:博查AI开放平台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.agents import Tool
from langchain.tools import tool
import requests

BOCHA_API_KEY = "sk-27f1a75797c64f3fa044d35afd3cbd27"

# 定义Bocha Web Search工具
@tool
def bocha_web_search_tool(query: str, count: int = 8) -> str:
    """
    使用Bocha Web Search API进行联网搜索,返回搜索结果的字符串。
    
    参数:
    - query: 搜索关键词
    - count: 返回的搜索结果数量

    返回:
    - 搜索结果的字符串形式
    """
    url = 'https://api.bochaai.com/v1/web-search'
    headers = {
        'Authorization': f'Bearer {BOCHA_API_KEY}',  # 请替换为你的API密钥
        'Content-Type': 'application/json'
    }
    data = {
        "query": query,
        "freshness": "noLimit", # 搜索的时间范围,例如 "oneDay", "oneWeek", "oneMonth", "oneYear", "noLimit"
        "summary": True, # 是否返回长文本摘要总结
        "count": count
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        # 返回给大模型的格式化的搜索结果文本
        # 可以自己对博查的搜索结果进行自定义处理
        return str(response.json())
    else:
        raise Exception(f"API请求失败,状态码: {response.status_code}, 错误信息: {response.text}")

# 创建LangChain工具
bocha_tool = Tool(
    name="BochaWebSearch",
    func=bocha_web_search_tool,
    description="使用Bocha Web Search API进行网络搜索"
)

# 加载一些工具
tools = [bocha_tool]

# 初始化 agent
agent = initialize_agent(
    tools=tools,                                    # 工具列表,Agent 可以调用的工具。
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,    # Agent 类型,决定了 Agent 的行为模式。
    llm=tongyi_chat,                                # 语言模型实例,用于任务解析和生成。
    verbose=True                                    # 是否输出详细的日志信息,用于调试。
)

# 测试 agent
agent.run("what will be the weather in Shanghai three days from now?")

通过上述操作,我们成功创建并运行了一个 Agent,它能够帮助我们从网络上获取信息,并根据获取到的信息对我们的问题做出回答。