小白从零开始勇闯人工智能:Agent
引言
你是否想过,如何让一个AI不仅能和你聊天,还能主动帮你计算、分析数据、甚至编写代码?这就引出了AI Agent的概念。如果说大语言模型是一个聪明但只会动嘴的“大脑”,那么Agent就是给它装上了“手”和“脚”。通过为模型配备各种工具,Agent能够自主地思考、规划、并调用工具来执行任务,从而解决更复杂的问题。从简单的字数统计,到复杂的数学运算,再到数据分析,Agent都能轻松应对。
一、初识Agent:打造你的第一个自定义工具
Agent的核心是“工具”。我们可以通过继承BaseTool类,为AI创建一个它原本不具备的能力。比如,让AI学会计算文本字数。
我们要使用LangChain框架构建一个具备记忆功能的结构化聊天智能体,具体步骤包括:首先导入必要的LangChain模块,并基于阿里云百炼平台的qwen-plus模型配置了一个对话模型;接着自定义了一个继承自BaseTool的类,其核心功能是返回输入文本的字符长度;然后将该工具放入工具列表,并从Hub拉取预定义的提示模板用于引导智能体行为;再通过create_structured_chat_agent将模型、工具和提示组合成智能体,同时添加ConversationBufferMemory以维持对话历史;最后创建AgentExecutor执行器并传入智能体、工具、记忆等参数,最后通过invoke方法测试智能体对问题的响应。
# 导入必要的库
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
# 定义我们的模型(这里使用阿里的qwen-plus)
model = ChatOpenAI(model="qwen-plus",
openai_api_key="你的API密钥",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0)
# 1. 定义自定义工具
class TextLengthTool(BaseTool):
name = "文本字数计算工具" # 工具的名称
description = "当你被要求计算文本的字数时,使用此工具" # 工具的描述,AI会根据描述决定何时使用
def _run(self, text):
return len(text) # 核心功能:返回输入文本的长度
# 2. 将工具放入工具列表
tools = [TextLengthTool()]
# 3. 获取一个预定义的提示词模板
prompt = hub.pull("hwchase17/structured-chat-agent")
# 4. 创建Agent
agent = create_structured_chat_agent(
llm=model,
tools=tools,
prompt=prompt
)
# 5. 添加记忆
memory = ConversationBufferMemory(
memory_key='chat_history',
return_messages=True
)
# 6. 创建Agent执行器,负责运行Agent
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)
# 7. 测试我们的Agent
response = agent_executor.invoke({"input": "'我是一个非常聪明的人工智能助手',这句话的字数是多少?"})
print(response)

其中:
BaseTool是创建工具的基础。name和description至关重要,它们让AI知道这个工具是干什么的,以及什么时候该用它。
create_structured_chat_agent创建了一个结构化的对话Agent,它会根据提示词生成JSON格式的动作。
AgentExecutor就像Agent的“大脑”,它负责解析Agent的思考、调用工具、处理错误,并最终给出答案。
二、现学现用:使用已有的强大工具
我们不必每次都从头造轮子。LangChain提供了许多现成的工具,比如PythonREPLTool,它可以让Agent直接执行Python代码。
我们想要快速创建一个能够执行Python代码的智能体:首先从导入create_python_agent函数,并导入PythonREPLTool,后者提供了一个交互式Python执行环境;接着配置一个基于阿里qwen-plus模型的ChatOpenAI实例作为底层语言模型;然后调用create_python_agent将模型与PythonREPLTool绑定,生成一个专门的Python智能体执行器,并开启详细输出模式和解析错误处理;最后通过invoke调用让智能体计算提出的问题,智能体会自动生成并运行Python代码来完成计算并返回结果。
# 导入已有工具包
from langchain_experimental.agents.agent_toolkits import create_python_agent
from langchain_experimental.tools import PythonREPLTool
from langchain_openai import ChatOpenAI
# 创建一个Python Agent执行器
agent_executor = create_python_agent(
llm=ChatOpenAI(model="qwen-plus",
openai_api_key="你的API密钥",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0),
tool=PythonREPLTool(),
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 让Agent计算数学题
response = agent_executor.invoke({"input": "5的3.6次方是多少?"})
print(response)
# 让Agent计算斐波那契数列
response = agent_executor.invoke({"input": "第12个斐波那契数列的数字是多少?"})
print(response)

三、变身分析师:让Agent帮你处理表格数据
除了计算,Agent还能处理更复杂的结构化数据,比如CSV文件。我们可以使用create_csv_agent来创建一个专门分析CSV文件的Agent。
# 导入CSV Agent工具包
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="你的API密钥",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0),
path="house_price1.csv", # 指定CSV文件路径
verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 询问数据集的基本信息
response = agent_executor.invoke({"input": "数据集有多少列?用中文回复"})
print(response)
response = agent_executor.invoke({"input": "数据集里,所有房子的价格平均值是多少?用中文回复"})
print(response)

其中:
create_csv_agent在底层创建了一个包含PythonAstREPLTool(一种更安全的Python执行工具)的Agent,并将CSV数据加载为df(Pandas DataFrame)。
Agent会利用Pandas库的函数(如mean(), len(), columns)来回答用户问题,实现了自然语言到数据分析指令的转换。
四、多才多艺的Agent:组合多种工具
现在,我们想把前面学的所有能力整合起来,让一个Agent同时拥有自定义工具、Python代码执行能力和CSV分析能力。
# 导入必要的库
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
# 1. 准备基础组件
model = ChatOpenAI(model="qwen-plus", ...)
# 2. 定义我们的自定义工具
class TextLengthTool(BaseTool):
name = "文本字数计算工具"
description = "当你需要计算文本包含的字数时,使用此工具"
def _run(self, text):
return len(text)
# 3. 创建Python代码执行Agent
python_agent_executor = create_python_agent(
llm=model, tool=PythonREPLTool(), verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 4. 创建CSV分析Agent
csv_agent_executor = create_csv_agent(
llm=model, path="house_price1.csv", verbose=True,
agent_executor_kwargs={"handle_parsing_errors": True}
)
# 5. 将所有工具包装到一个列表里
tools = [
Tool(
name="Python代码工具",
description="""当你需要借助Python解释器时,使用这个工具。
用自然语言把要求给这个工具,它会生成Python代码并返回代码执行的结果。""",
func=python_agent_executor.invoke
),
Tool(
name="CSV分析工具",
description="""当你需要回答有关house_price.csv文件的问题时,使用这个工具。
它接受完整的问题作为输入,在使用Pandas库计算后,返回答案。""",
func=csv_agent_executor.invoke
),
TextLengthTool() # 直接使用我们的自定义工具类实例
]
# 6. 创建最终的综合Agent
memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)
prompt = hub.pull("hwchase17/structured-chat-agent")
agent = create_structured_chat_agent(llm=model, tools=tools, prompt=prompt)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)
# 7. 测试多工具协作
# 案例1:计算文本字数并判断是否为斐波那契数
response = agent_executor.invoke({"input": "'我是一个聪明的人工智能助手',这句话的字数是多少?你需要调用python代码工具来确定这个数字是否是斐波那契数列当中的数字"})
print(response)
# 案例2:分析CSV数据
response = agent_executor.invoke({"input": "house_price1数据集里,所有房子的价格方差是多少?用中文回答"})
print(response)

五、专家模式:Self-Ask with Search Agent
最后,我们来看一种特殊的Agent设计模式——Self-Ask with Search。这种模式非常适合处理需要多步推理的问题,它会主动询问自己“后续问题”,并一步步找到答案。
# 导入专用库
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain.tools import BaseTool
# 定义工具(注意,这里工具的名称必须为 "Intermediate Answer")
class TextLengthTool(BaseTool):
name = "Intermediate Answer" # Self-Ask模式强制要求
description = "当你被要求计算文本的字数时,使用此工具"
def _run(self, text):
return len(text)
tools = [TextLengthTool()]
prompt = hub.pull("hwchase17/self-ask-with-search")
# 创建Self-Ask Agent
agent = create_self_ask_with_search_agent(llm=model, tools=tools, prompt=prompt)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)
# 测试推理能力
response = agent_executor.invoke({"input": "林肯和罗斯福谁活得更久"})
print(response)

其中:
create_self_ask_with_search_agent创建了一个遵循特定思维链的Agent。
它的提示词模板要求Agent先判断是否需要“后续问题”,然后逐一提出“Follow up”,再根据每个问题的答案(来自工具)继续推理,直到得到最终答案。这种结构化的推理方式非常适合处理需要分解的复杂问题。我们要注意在这种模式下,工具的名称必须严格命名为Intermediate Answer。
更多推荐
所有评论(0)