为了账号安全,请及时绑定邮箱和手机立即绑定

手把手教你从0到1搭建一个AI Agent(智能体)-动手做AI Agent-CSDN博客

标签:
杂七杂八
概述

在当今智能时代,大型语言模型(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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消