一、环境
在此之前我们需要确定一下环境,网盘分享的是我们第三方库的配置环境。
requirements3.txt
链接: https://pan.baidu.com/s/1FjHEmBK6Pz4XS4aN3Ak76g 提取码: 89yt
这里我使用的是python3.11,python版本不能太老,否则很多库会不兼容,使用的是虚拟环境,要安装这些库,可以把这个文档保存,然后在终端输入:
python
pip install -r 文档地址
二、创建第一个自定义工具
最基础的 Agent 创建流程。我们定义了一个计算文本字数的工具,并让 Agent 使用它。
python
from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
导入我们需要的库
python
# 初始化大模型
# 这里使用通义千问的API,你需要替换成自己的API密钥
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-**********************9",#填入自己申请的key
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0
)
# 测试模型是否正常工作
model.invoke([HumanMessage(content="'我是一个非常聪明的人工智能助手',这句话的字数是多少?")])
python
# 1. 定义自定义工具类
class TextLengthTool(BaseTool):
name = "文本字数计算工具" # 工具名称
description = "当你被要求计算文本的字数时,使用此工具" # 工具描述,很重要!模型根据这个判断何时使用
def _run(self, text):
"""工具的具体实现逻辑"""
return len(text)
BaseTool:所有自定义工具都需要继承的基类
name 和 description:这两个属性是模型选择工具的关键依据
python
# 2. 创建工具列表
tools = [TextLengthTool()]
# 3. 从hub获取提示词模板
prompt = hub.pull("hwchase17/structured-chat-agent")
# 4. 创建agent
agent = create_structured_chat_agent(
llm=model,
tools=tools,
prompt=prompt
)
# 5. 创建记忆组件,让agent记住对话历史
memory = ConversationBufferMemory(
memory_key='chat_history',
return_messages=True
)
# 6. 创建agent执行器
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 显示详细执行过程
handle_parsing_errors=True # 解析错误时自动处理
)
# 7. 测试:询问字数(会调用工具)
agent_executor.invoke({"input": "'我是一个非常聪明的人工智能助手',这句话的字数是多少?"})
# 8. 测试:询问数学问题(不会调用工具,直接用模型知识回答)
agent_executor.invoke({"input": "请你充当我的数学老师,告诉我什么是勾股定理"})
memory:让agent能记住对话上下文
verbose=True:能看到agent的思考过程,对学习和调试非常有帮助
三、使用现成的Python执行工具
使用 LangChain 提供的现成工具,让 agent 能够执行 Python 代码。
1。'先安装一个第三方库
python
pip install langchain_experimental
2.具体实现
python
from langchain_experimental.agents.agent_toolkits import create_python_agent
from langchain_experimental.tools import PythonREPLTool
from langchain_openai import ChatOpenAI
# 创建工具列表,使用现成的Python交互式环境工具
tools = [PythonREPLTool()]
# 创建专门用于执行Python代码的agent
agent_executor = create_python_agent(
llm=ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-*******************",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0
),
tool=PythonREPLTool(), # 指定使用的工具
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
PythonREPLTool:一个强大的工具,让agent能够执行任意Python代码
create_python_agent:专门用于创建Python编程agent的便捷方法
python
# 测试:数学计算
agent_executor.invoke({"input": "5的3.6次方是多少?"})
# agent会生成代码:print(5 ** 3.6) 并执行
# 测试:斐波那契数列
agent_executor.invoke({"input": "第12个斐波那契数列的数字是多少?"})
# agent会编写代码计算斐波那契数列并返回结果
agent会自主决定编写什么代码来解决问题
四、CSV文件分析工具
展示了如何使用 create_csv_agent 来分析表格数据。
可以自己写一个文档内容,然后保存txt是可以csv识别的。然后对他进行提问
python
from langchain_experimental.agents.agent_toolkits import create_csv_agent
from langchain_openai import ChatOpenAI
# 创建专门用于分析CSV文件的agent
agent_executor = create_csv_agent(
llm=ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-**********************", # 注意:不同示例使用了不同密钥
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0,
),
path=r"D:\aboutxue\dataxue.txt", # 指定数据文件路径
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 测试:询问数据集基本信息
agent_executor.invoke({"input": "数据集有多少列?用中文回复"})
# agent会使用pandas读取数据并统计列数
agent_executor.invoke({"input": "数据集包含哪些变量?用中文回复"})
# agent会显示所有列名
# 测试:具体数据查询
agent_executor.invoke({"input": "数据集里,广州演唱会有几场?用中文回复"})
# agent会筛选数据并计数
agent_executor.invoke({"input": "五月一日是在哪开演唱会?用中文回复"})
# agent会按条件查询具体信息
agent读取指定路径的CSV文件,将用户问题转化为pandas代码,执行代码获取结果并输出。create_csv_agent:专门用于数据分析的agent创建函数。agent底层使用pandas库处理数据。支持各种复杂的查询需求。
五、多工具协同工作
重点,展示如何让agent同时拥有多个工具,并根据问题智能选择。
python
from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.tools import BaseTool, Tool
from langchain_experimental.agents.agent_toolkits import create_csv_agent, create_python_agent
from langchain_experimental.tools import PythonREPLTool
from langchain_openai import ChatOpenAI
# 初始化基础模型
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-0b717f29b6ee4852a2331cf1ffa30d4f",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0
)
python
# 1. 定义第一个自定义工具:字数计算
class TextLengthTool(BaseTool):
name = "文本字数计算工具"
description = "当你需要计算文本包含的字数时,使用此工具"
def _run(self, text):
return len(text)
# 2. 创建Python执行agent(作为工具使用)
python_agent_executor = create_python_agent(
llm=ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-*********************",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
),
temperature=0,
tool=PythonREPLTool(),
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 3. 创建CSV分析agent(作为工具使用)
csv_agent_executor = create_csv_agent(
llm=ChatOpenAI(
model="qwen-plus",
openai_api_key="s**********************************)",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0,
),
path=r"D:\aboutxue\dataxue.txt",
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
python
# 4. 组装工具列表(关键步骤)
tools = [
Tool(
name="Python代码工具",
description="""当你需要借助Python解释器进行数学计算、数据处理或执行代码时,使用这个工具。
用自然语言把要求给这个工具,它会生成Python代码并返回代码执行的结果。""",
func=python_agent_executor.invoke # 注意:这里传入的是函数,不是agent本身
),
Tool(
name="CSV分析工具",
description="""当你需要回答关于dataxue.txt文件的问题时,使用这个工具。
它可以查询数据集的行数、列数、特定条件的记录等。
接受完整的问题作为输入,在使用Pandas库计算后,返回答案。""",
func=csv_agent_executor.invoke
),
TextLengthTool() # 直接使用自定义工具类实例
]
# 5. 创建记忆组件
memory = ConversationBufferMemory(
memory_key='chat_history',
return_messages=True
)
# 6. 获取提示词模板
prompt = hub.pull("hwchase17/structured-chat-agent")
# 7. 创建主agent
agent = create_structured_chat_agent(
llm=model,
tools=tools,
prompt=prompt
)
# 8. 创建主执行器
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
handle_parsing_errors=True
)
Tool包装类:可以将已有的agent包装成工具,实现工具嵌套
description的编写艺术:描述越清晰,agent选择越准确
多步推理:agent能自主决定调用多个工具的先后顺序
python
# 9. 测试一:使用Python工具
agent_executor.invoke({"input": "第8个斐波那契数列的数字是多少?"})
# 10. 测试二:使用CSV工具
agent_executor.invoke({"input": "数据集里,广州演唱会有几场?用中文回答"})
# 11. 测试三:组合使用多个工具(最复杂的任务)
agent_executor.invoke({
"input": "'我是一个聪明的人工智能助手',这句话的字数是多少?你需要调用python代码工具来确定这个数字是否是斐波那契数列当中的数字"
})
当执行第三个测试时,Agent来思考流程:
- 识别任务需求,需要计算字符串的字数,需要判断这个数字是否属于斐波那契数列
- 使用字数计算工具,调用 TextLengthTool,得到结果:9("我是一个聪明的人工智能助手"共9个字符)
- 使用Python工具,把"判断9是否在斐波那契数列中"的任务交给Python工具,Python工具生成并执行代码,返回结果:9在斐波那契数列中吗?生成的代码会计算斐波那契数列直到超过9,然后判断
- 综合结果,最终答案:字数是9,并且9是斐波那契数列中的数字
六、Self-Ask with Search 模式
一种特殊的agent类型,它擅长处理需要多步推理的问题。
1.self-ask-with-search模式的特点:
- 工具名称固定:必须使用 "Intermediate Answer",这是该模式的约定
- 拆解问题:善于将复杂问题拆解为多个子问题
- 中间答案:每个子问题的答案称为"Intermediate Answer"
- 最终汇总:基于所有中间答案得出最终结论
python
from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
# 初始化模型
model = ChatOpenAI(
model="qwen-plus",
openai_api_key="sk-***************************",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0
)
# 测试模型
model.invoke([HumanMessage(content="'我是一个非常聪明的人工智能助手',这句话的字数是多少?")])
python
# 注意:这里的工具名称必须是 "Intermediate Answer"
class TextLengthTool(BaseTool):
name = "Intermediate Answer" # 这个名称是固定的,不能随意更改
description = "当你被要求计算文本的字数时,使用此工具"
def _run(self, text):
return len(text)
# 创建工具列表
tools = [TextLengthTool()]
# 获取特定的prompt模板
prompt = hub.pull("hwchase17/self-ask-with-search")
print(prompt.template) # 可以查看prompt的具体内容
# 创建self-ask-with-search类型的agent
agent = create_self_ask_with_search_agent(
llm=model,
tools=tools,
prompt=prompt
)
# 创建记忆组件
memory = ConversationBufferMemory(
memory_key='chat_history',
return_messages=True
)
# 创建执行器
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
handle_parsing_errors=True
)
python
# 测试一:简单问题
agent_executor.invoke({"input": "'我是一个非常聪明的人工智能助手',这句话的字数是多少?"})
# 测试二:复杂比较问题
agent_executor.invoke({"input": "林肯和罗斯福谁活得更久"})
# 查看prompt的完整内容(注释部分)
'''
Question: Who lived longer, Muhammad Ali or Alan Turing?
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
Question: When was the founder of craigslist born?
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952
Question: {input}
Are followup questions needed here:{agent_scratchpad}
'''
以上代码需要注意的**:**
- API密钥管理:示例中的密钥需要替换为你自己的,建议使用环境变量存储
- 工具描述优化:多测试不同描述,找到让模型理解最准确的方式
- 调试技巧:始终开启
verbose=True,观察agent的思考过程 - 错误处理:设置
handle_parsing_errors=True让agent更健壮 - 记忆管理:长对话中注意控制记忆大小,避免token超限
七、总结与对比
五种agent类型的适用场景:
| 示例 | agent类型 | 适用场景 |
|---|---|---|
| 创建第一个自定义工具 | Structured Chat Agent | 需要自定义工具的通用场景 |
| 使用现成的Python执行工具 | Python Agent | 数学计算、编程任务 |
| CSV文件分析工具 | CSV Agent | 数据分析、表格查询 |
| 多工具协同工作 | Multi-Tool Agent | 需要多种能力的复杂任务 |
| Self-Ask with Search 模式 | Self-Ask Agent | 需要多步推理的比较类问题 |