Langchain之Agent代理的使用
目录:
- 1、简介
- 2、Agent 的核心概念与使用模式
- 1. 工具
- 2. 代理类型
- 3. 关键组件
- 3、案例分析
- 4、疑点解答
1、简介
在人工智能领域,一个 Agent 是一个能够感知环境、自主决策并执行行动以实现目标的系统。相比于单纯根据输入生成输出的模型,Agent 具备 主动性、持续性和目标导向性。
2、Agent 的核心概念与使用模式
1. 工具
这是 Agent 与外界交互的桥梁。任何可以被调用的函数都可以封装成工具,例如:
- 搜索工具:Tavily、Google Search
- 计算工具:Python REPL(代码执行环境)
- 信息查询工具:SQL 数据库查询、Wolfram Alpha
- 软件工具:发送邮件、操作文件、调用 API
2. 代理类型
代理的类型决定了其决策逻辑,常见的有:
- Zero-shot ReAct:根据当前状态,无需示例,直接决定下一步动作。最通用灵活。
- Structured Chat ReAct:适用于动作复杂或有多个输入的场景,能更好地处理结构化输入。
- OpenAI Functions / Assistant:专为适配 OpenAI 的 Function Calling 能力设计,高效可靠。
3. 关键组件
- AgentExecutor:这是 Agent 的运行时环境。它负责调用 Agent,执行其选择的工具,处理错误,并将结果反馈给 Agent 进行下一步决策,直到任务完成或达到步骤限制。
3、案例分析
案例一:复杂数据分析与可视化 Agent
这个案例展示了一个更强大的、能链式调用多个工具的 Agent。
目标:“获取特斯拉过去一周的股价数据,计算其每日涨跌幅,并用折线图展示价格走势。”
为什么需要 Agent?
单一工具无法完成此任务。需要串联多个步骤:获取数据 -> 处理数据 -> 生成图表。
代码实现:
from langchain.agents import AgentType, initialize_agent, Tool
from langchain_openai import ChatOpenAI
from langchain_experimental.agents.agent_toolkits import create_python_agent
from langchain_experimental.tools import PythonAstREPLTool
import yfinance as yf # 用于获取金融数据的库
import matplotlib.pyplot as plt
import io
import base64# --- 自定义工具定义 ---
def get_stock_price(symbol: str) -> str:"""获取股票过去一周的历史数据。"""ticker = yf.Ticker(symbol)hist = ticker.history(period="5d")return hist.to_string()def generate_plot(data_str: str) -> str:"""根据数据字符串生成图表,并返回base64编码的图片。这是一个简化版,实际应用中需要解析data_str。"""# 这里为了演示,我们直接生成一个简单的图表plt.figure(figsize=(10, 5))plt.plot([1, 2, 3, 4, 5], [100, 110, 105, 120, 115])plt.title("Tesla Stock Price (Example)")plt.xlabel("Day")plt.ylabel("Price (USD)")# 将图表保存到内存缓冲区buffer = io.BytesIO()plt.savefig(buffer, format='png')buffer.seek(0)image_png = buffer.getvalue()buffer.close()# 编码为base64,方便在HTML或某些前端中显示graphic = base64.b64encode(image_png).decode('utf-8')plt.close()return graphic# 1. 初始化LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)# 2. 创建自定义工具列表
tools = [Tool(name="Get Stock Data",func=get_stock_price,description="Useful for fetching historical stock price data. Input should be a stock ticker symbol, e.g., TSLA."),Tool(name="Generate Plot",func=generate_plot,description="Useful for generating a line plot from data. Input should be a string representation of the data."),PythonAstREPLTool() # Python代码执行工具,用于计算涨跌幅等复杂操作
]# 3. 创建代理
agent = initialize_agent(tools,llm,agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 适合处理多输入的工具verbose=True
)# 4. 运行代理
result = agent.run("Get Tesla's stock price for the past week, calculate the daily percentage change, and show me a line chart of the price movement.")
print(result)
# 注意:生成的base64图像数据可以嵌入到网页或报告中。
Agent 的思考与执行过程:
-
Thought: 这个任务需要三个步骤:获取数据、计算变化、生成图表。我先从获取特斯拉的股价数据开始。
-
Action: 调用 Get Stock Data 工具,输入 TSLA。
-
Observation: 获得了一个包含日期和价格的 DataFrame 字符串。
-
Thought: 现在我需要计算每日涨跌幅。这涉及到数学运算,我可以用 Python 工具来处理这些数据。
-
Action: 调用 PythonAstREPLTool,编写一小段 Pandas 代码来计算百分比变化。
-
Observation: Python 代码成功执行,返回了计算结果。
-
Thought: 最后,我需要将处理好的数据可视化。我可以调用 Generate Plot 工具。
-
Action: 调用 Generate Plot 工具,传入处理后的数据。
-
Observation: 工具返回了一个 base64 编码的图表图像。
-
Final Answer: 我已经完成了您的请求。特斯拉过去一周的股价数据显示…(附上数据和图表)。
要点:Agent 展示了出色的任务分解和规划能力,像一个真正的数据分析师一样,按顺序调用不同的专业工具来解决复杂问题。
4、疑点解答
2025诺贝尔获得者 这个上面tavily工作做了 为啥还要agent代理?
让我们用一个类比来理解:
- 只使用 Tavily:就像你亲自打开浏览器,在谷歌里搜索“2025诺贝尔获得者”,然后从一堆结果中自己阅读、筛选、整理信息,最后形成答案。
- 使用 Tavily + Agent:就像你有一个私人助理。你只需要下命令:“帮我查一下2025年诺贝尔奖得主。” 这个助理会自动帮你完成搜索、阅读、理解、筛选、总结等一系列动作,然后把最终的、精炼的答案呈现在你面前。