大模型agent

一、环境

在此之前我们需要确定一下环境,网盘分享的是我们第三方库的配置环境。

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="'我是一个非常聪明的人工智能助手',这句话的字数是多少?")])

申请自己key可以参考文章https://blog.csdn.net/2201_75573294/article/details/159113608?fromshare=blogdetail&sharetype=blogdetail&sharerId=159113608&sharerefer=PC&sharesource=2201_75573294&sharefrom=from_link

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 需要多步推理的比较类问题
相关推荐
格林威1 小时前
工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟工业相机
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
我能坚持多久1 小时前
String类常用接口的实现
c语言·开发语言·c++
落魄江湖行1 小时前
基础篇三 一行 new String(“hello“) 到底创建了几个对象?90% 的人答错了
java·面试·八股文
花间相见1 小时前
【大模型微调与部署03】—— ms-swift-3.12 命令行参数(训练、推理、对齐、量化、部署全参数)
开发语言·ios·swift
青衫码上行1 小时前
【从零开始学习JVM】栈中存的是指针还是对象 + 堆分为哪几部分
java·jvm·学习·面试
默 语1 小时前
Java的“后路“:不是退场,而是换了一种活法
java·开发语言·python
t***5441 小时前
Orwell Dev-C++和Embarcadero Dev-C++哪个更稳定
开发语言·c++
黑牛儿1 小时前
同样是 PHP-FPM 调优,别人能支撑 1000 + 并发,你却还在报 502?
开发语言·php
ywf12151 小时前
Spring aop 五种通知类型
java·前端·spring
wjs20241 小时前
R 数据类型
开发语言