LangChain Agent 学习笔记
目录
什么是 Agent?
Agent 是 LangChain 中的一个核心组件,它能够根据用户的输入动态选择工具(Tools)或步骤来完成任务。与 Chain 不同,Agent 的流程是动态的,而不是固定的。Agent 可以根据上下文选择最合适的工具,适用于复杂的任务场景。
Agent 的核心组件
-
Tools:
- 用于执行特定任务的函数或 API。
- 例如:搜索工具、计算工具、数据库查询工具。
-
Memory:
- 用于存储和检索对话历史。
- 例如:
ConversationBufferMemory
、ConversationSummaryMemory
。
-
Prompts:
- 用于生成语言模型输入的模板。
- 例如:
ChatPromptTemplate
。
-
LLM(大语言模型):
- 提供语言理解和生成能力。
- 例如:OpenAI、DeepSeek。
如何使用 Agent
初始化 Agent
以下是一个初始化 Agent 的示例代码:
"""
lesson_4.py 使用 Agent 进行对话,并调用search Tool
本文件演示如何使用 LangChain 的 Agent 框架,通过调用自定义的搜索工具来完成用户请求。
"""
import dotenv
from langchain.agents import Tool, initialize_agent, AgentType
from util.llm_factory import LLMFactory
# 加载环境变量
dotenv.load_dotenv()
def search_api(query: str) -> str:
"""
模拟搜索API,返回格式化后的搜索结果
Args:
query (str): 用户输入的搜索关键词
Returns:
str: 格式化后的搜索结果字符串
"""
return f"搜索结果:「{query}」"
# 定义可用工具列表
tools = [
Tool(
name="Search", # 工具名称
description="搜索的工具", # 工具描述,用于Agent选择工具
func=search_api, # 工具对应的执行函数
)
]
# 初始化LLM模型
llm = LLMFactory.create_llm(llm_type="deepseek")
# 初始化Agent
agent = initialize_agent(
tools, # 可用工具列表
llm, # 语言模型
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用零样本推理的Agent类型
verbose=True, # 开启详细输出模式,方便调试
)
# 运行Agent,处理用户请求
result = agent.run("帮我搜索一下关于python的资料")
# 输出结果
print(result)
运行 Agent
运行 Agent 并处理用户输入:
> Entering new AgentExecutor chain...
我需要搜索关于Python的资料,以便提供相关信息。
Action: Search
Action Input: Python programming language resources
Observation: 搜索结果:「Python programming language resources」
Thought:Thought: 我已经获取了关于Python编程语言的资源信息,现在可以回答用户的问题。
Final Answer: Python是一种广泛使用的高级编程语言,以其简洁易读的语法和强大的功能而闻名。它适用于多种应用场景,包括Web开发、数据分析、人工智能、科学计算等。你可以通过官方文档(https://www.python.org/)、在线教程(如Codecademy、Coursera等)以及书籍(如《Python编程:从入门到实践》)
> Finished chain.
Python是一种广泛使用的高级编程语言,以其简洁易读的语法和强大的功能而闻名。它适用于多种应用场景,包括Web开发、数据分析、人工智能、科学计算等。你可以通过官方文档(https://www.python.org/)、在线教程(如Codecademy、Coursera等)以及书籍(如《Python编程:从入门到实践》)
自定义 Tools
Agent 的核心功能之一是调用 Tools。你可以根据需要创建自定义 Tools。
示例:计算器工具
from langchain.tools import BaseTool
class CalculatorTool(BaseTool):
name: str = "calculator"
description: str = "计算器"
def _run(self, expression: str) -> str:
try:
result = eval(expression)
return f"计算结果:{result}"
except Exception as e:
return f"计算失败:{e}"
集成自定义 Tools
将自定义 Tools 集成到 Agent 中:
tools = [CalculatorTool()]
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
多轮对话与 Memory
为了实现多轮对话,Agent 需要使用 Memory 来存储和检索对话历史。
示例:使用 ConversationBufferMemory
from langchain.memory import ConversationBufferMemory
# 初始化 Memory
memory = ConversationBufferMemory(memory_key="chat_history")
# 初始化带 Memory 的 Agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
verbose=True,
memory=memory,
handle_parsing_errors=True,
)
运行多轮对话
result = agent.run("计算 2 + 2")
print(result)
result = agent.run("上面计算的结果,再乘以2的结果。")
print(result)
执行结果
> Entering new AgentExecutor chain...
Thought: Do I need to use a tool? Yes
Action: calculator
Action Input: 2 + 2
Observation: 计算结果:4
Thought:```
Thought: Do I need to use a tool? No
AI: 2 + 2 的计算结果是 4。
> Finished chain.
2 + 2 的计算结果是 4。
Entering new AgentExecutor chain...
Thought: Do I need to use a tool? Yes
Action: calculator
Action Input: 4 * 2
Observation: 计算结果:8
Thought:Do I need to use a tool? No
AI: 上面计算的结果是 4,再乘以 2 的结果是 8。
> Finished chain.
上面计算的结果是 4,再乘以 2 的结果是 8。
总结
通过本笔记,我们学习了如何使用 LangChain 的 Agent 完成以下任务:
- 初始化并运行 Agent。
- 自定义 Tools 并集成到 Agent 中。
- 使用 Memory 实现多轮对话。
Agent 是 LangChain 中非常强大的组件,适用于复杂的任务场景。通过模块化设计和性能优化,可以构建高效、稳定的企业级 Agent。
评论区