概述
在当今智能时代,大型语言模型(LLM)虽在自然语言处理领域展现出巨大潜力,但由于知识过时、准确性限制以及执行复杂任务的能力不足,其应用范围受到一定制约。为解决这些问题,Agent化策略应运而生,它旨在通过集成外部工具和资源,让LLM具备动态获取知识、执行实际任务的能力,从而提供更准确、有针对性的回答。ReAct Agent作为这一进化路径的代表,从简单的直接回答问题阶段,逐步进化到理解问题逻辑、生成思维链、调用专用工具执行任务,最终实现综合性的思考与行动,展现出动态执行的能力转变。本文手把手教你搭建一个AI Agent,从基础准备到代码实现,涵盖了ReAct Agent的工具类设计、prompt模板、以及智能Agent主流程的构建。通过实际示例演示了如何使用Action类定义工具特性,并自定义CallbackHandler进行大模型思考过程的可视化,为读者提供了从0到1搭建AI Agent的全面指南。
手把手教你从0到1搭建一个AI Agent(智能体)-动手做AI Agent
一、LLM为什么需要agent化
大型语言模型(LLMs)的限制在于其知识过时、准确性有限、在进行复杂推理和计算时能力不足。这些问题导致LLMs在处理需要外部知识或执行实际任务时受限。Agent化能够利用外部工具来克服这些缺点,使得LLMs能够动态地获取和整合外部知识,执行复杂的任务,提供更准确和有针对性的回答。
二、ReAct Agent概述
- ReAct Agent 的论文来源:ReAct Agent的研究来自多篇学术论文,展示了LLM Agent的进化路径,从直接回答问题到思考过程、执行行动、最终结合思维与行动的综合能力。
- LLM Agent的升级阶段:从简单的直接回答问题阶段,到理解问题背后的逻辑,生成思维链(Chain-of-Thought),再到调用专门工具执行具体任务,最后达到ReAct Agent的形态,实现了从静态回答到动态执行的转变。
- ReAct Agent的构成部分:主要包括模型(LLM)、提示(用于指导任务)、记忆(用于存储和更新信息)、索引(用于快速检索和理解信息)以及链条(链式思维与行动过程)。
安装和导入依赖
pip install langchain
pip install uuid
pip install pydantic
定义工具类(函数和数据结构)
from pydantic import BaseModel
from langchain.agents import AgentExecutor
class Action(BaseModel):
name: str = Field(description="工具或指令名称")
args: dict = Field(description="工具或指令参数,由参数名称和参数值组成")
def search_train_ticket(origin: str, destination: str, date: str, departure_time_start: str, departure_time_end: str) -> list:
# 模拟查询火车票函数
return [
{
"train_number": "G1234",
"origin": "北京",
"destination": "上海",
"departure_time": "2024-06-01 8:00",
"arrival_time": "2024-06-01 12:00",
"price": "100.00",
"seat_type": "商务座",
},
# 更多火车票数据...
]
def purchase_train_ticket(train_number: str) -> dict:
# 模拟购买火车票函数
return {
"result": "success",
"message": "购买成功",
"data": {
"train_number": train_number,
"seat_type": "商务座",
"seat_number": "7-17A"
}
}
编写prompt文本和最终回复prompt
from langchain.prompts import PromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
template = """
你是一个强大的AI火车票助手,可以使用工具与指令查询并购买火车票。
你的任务是:
{task_description}
你可以使用以下工具或指令:
{tools}
当前的任务执行记录:
{memory}
按照以下格式输出:
任务:你收到的需要执行的任务
思考: 观察你的任务和执行记录,并思考你下一步应该采取的行动
然后,根据以下格式说明,输出你选择执行的动作/工具:
{format_instructions}
"""
final_prompt = """
你的任务是:
{task_description}
以下是你的思考过程和使用工具与外部资源交互的结果。
{memory}
你已经完成任务。
现在请根据上述结果简要总结出你的最终答案。
直接给出答案。不用再解释或分析你的思考过程。
"""
实现智能Agent类
from langchain.agents import initialize_agent, Tool
class MyAgent(AgentExecutor):
def __init__(self, llm, tools, prompt, final_prompt):
self.llm = llm
self.prompt = HumanMessagePromptTemplate.from_template(prompt)
self.final_prompt = HumanMessagePromptTemplate.from_template(final_prompt)
super().__init__(agent=self.create_agent(self.prompt, llm), tools=tools)
@staticmethod
def create_agent(prompt, llm):
from langchain.agents import AgentType
return llm.create_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
prompt=prompt,
verbose=True)
def run(self, task):
response = self.agent.run(task)
final_answer = self.final_prompt.format(task_description=task, memory=response)
return final_answer
实践示例
if __name__ == "__main__":
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
tools = [
Tool(
name="search_train_ticket",
func=search_train_ticket,
description="查询火车票",
),
Tool(
name="purchase_train_ticket",
func=purchase_train_ticket,
description="购买火车票",
),
Tool(
name="finish",
func=lambda x: None,
description="结束任务",
),
]
prompt_text = """
...
"""
final_prompt_text = """
...
"""
my_agent = MyAgent(llm, tools, prompt_text, final_prompt_text)
task = "帮我买24年6月1日早上去上海的火车票"
reply = my_agent.run(task)
print(reply)
五、工具类辅助编程
- Action类定义:用于结构化定义工具的属性。
class Action(BaseModel):
name: str = Field(description="工具或指令名称")
args: dict = Field(description="工具或指令参数,由参数名称和参数值组成")
- CallbackHandler自定义实现:实现用于打印大模型返回的思考过程的自定义CallbackHandler。
class MyPrintHandler(AgentExecutor):
def __init__(self, llm):
super().__init__(agent=self.create_agent(llm), tools=[])
self.handler = None
def create_agent(self, llm):
from langchain.agents import AgentType
return llm.create_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
prompt=self.prompt,
verbose=True)
@property
def prompt(self):
return SystemMessagePromptTemplate.from_template(template)
def __call__(self, **kwargs):
self.handler = super().__call__(**kwargs)
print(self.handler.log)
return str(self.handler.log)
六、智能Agent运行流程
- Agent主流程设计:Agent根据任务描述,决策执行的步骤,调用相关工具,接收观察结果,并据此更新记忆。
七、实例测试
- 任务描述设置:定义具体任务,如“买24年6月1日早上去上海的火车票”。
八、大模型Agent实战案例分析
- 客户服务、医疗健康咨询、金融报告撰写、教育辅导等场景应用展示。
九、Agent实战步骤与挑战
- 需求分析、架构设计、数据准备、开发、测试与部署流程。
- 遇到的技术挑战与解决方案。
十、大模型AI产品经理学习资源
- 学习路线、视频教程、技术文档、电子书、面试题与面经合集介绍,旨在帮助AI产品经理掌握相关技能,适应当前技术趋势。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦