基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践 原创

发布于 2024-11-28 16:17
浏览
0收藏

1、先从传统思维的架构设计说起

我们先来看一个场景:用户输入一个问题(Prompt)后,如何实现用户问题的自动路由和查询(比如:是 RAG 检索还是 SQL 查询)

  • 解决方案:意图识别架构设计

第一、对于用户输入的问题(Prompt),我们通过意图识别模块来判断是需要路由给RAG 检索还是路由给 SQL 查询;

第二、意图识别模块接收用户的问题(Prompt),然后将用户的问题交给大模型去判断分类;

第三、意图识别架构设计如下图所示:

基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践-AI.x社区

第四、大模型需要提前做 SFT Fine-tuning 微调,目的是让大模型知道什么问题属于 RAG 检索问题,什么问题属于 SQL 查询问题,Fine-tuning 微调的样本数据格式如下:

examples =[
{
"inn":"我想知道东方阿尔法优势产业混合C基金,在2021年年度报告中,前10大重仓股中,有多少只股票在报告期内取得正收益。",
"out":"rag_question***我想知道东方阿尔法优势产业混合C基金,在2021年年度报告中,前10大重仓股中,有多少只股票在报告期内取得正收益。"
},
{
"inn":"森赫电梯股份有限公司产品生产材料是什么?",
"out":"rag_question***森赫电梯股份有限公司产品生产材料是什么?"
},
{
"inn":"20210930日,一级行业为机械的股票的成交金额合计是多少?取整。",
"out":"agent_question***20210930日,一级行业为机械的股票的成交金额合计是多少?取整。"
},
...
  ]


第五、意图识别模块识别结果后,通过在代码中硬编码 if...else 对识别后的分类进行不同的后续处理,代码如下:

# 如果是 RAG 相关的问题
if intent =="rag_question":
    result = self.rag.get_result(questinotallow=question)
return result


# 如果是 Agent 相关的问题
elif intent =="agent_question":
    result = self.agent.get_result(input=question)
return result


# 其他类问题
else:
    result = self.chat.invoke(input=question).content
return result
  • 意图识别架构设计的问题

从上述实现流程我们可以看到,意图识别的架构设计本质还是传统的开发模式,也就是静态业务流程编排的面向过程架构设计范式,也就是说程序执行的每一个步骤还是由开发者精准控制,大模型此刻只是扮演者辅助工具角色,用于问题分类,这种面向过程的架构设计范式有3个问题:

第一、若意图识别出现偏差,后续的处理流程将失去效果,结果必然会出现错误。

第二、尽管我们可以在 if...else... 结构中加入修正策略,比如:当 RAG 检索失败时转而查询 SQ L数据库,但面对复杂的需求,这种策略的编写与维护成本将呈指数级增长。

第三、最关键的是,这种处理方式丝毫体现不出智能化的特点。

那么如何基于 AI Agent 智能体的架构设计对用户问题(Prompt)自主判断和自主解决呢?

2、基于 AI Agent 智能体的新架构设计方案

AI Agent 智能体由大模型推理能力、Planning 规划能力、Tools 工具使用能力、Action 行动能力、Memory 记忆能力构成,如下图所示:

基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践-AI.x社区

从上图我们可以看到,一旦我们为 AI Agent 智能体配备了适当的工具,它便能借助大模型的推理能力,独立地进行规划和行动。因此,我们首先需要解决的问题是如何为 AI Agent 智能体配备必要的工具。

第一、为 AI Agent 智能体配备工具

这个案例我们的需求是结构化的 SQL 查询和非结构化的 RAG 检索,我们给 AI Agent 智能体配备这两个工具:

1.创建 AI Agent 的管理类

import logging
import datetime
from langgraph.prebuilt import create_react_agent
from langchain.tools.retriever import create_retriever_tool
from langchain_community.utilities importSQLDatabase
from langchain_community.agent_toolkits importSQLDatabaseToolkit
from rag.rag importRagManager
import settings




classFinanceBotEx:
def__init__(self, llm=settings.llm, chat=settings.chat, embed=settings.embed):
        self.llm = llm
        self.chat = chat
        self.embed = embed
        self.tools =[]


        self.rag =RagManager(llm=llm, embed=embed)

2.创建 SQL 查询工具

为 FinanceBotEX 类添加 SQL 查询工具。

def init_sql_tool(self, path):
        # 连接数据库
        db = SQLDatabase.from_uri(f"sqlite:///{path}")
        toolkit = SQLDatabaseToolkit(db=db, llm=self.llm)
        sql_tools = toolkit.get_tools()  # 工具


        return sql_tools

3.创建 RAG 检索工具

为 FinanceBotEX 类添加 RAG 检索工具。

def init_rag_tools(self):
        # 给大模型 RAG 检索器工具
        retriever = self.rag.get_retriever()
        retriever_tool = create_retriever_tool(
            retriever=retriever,
            name="rag_search",
            descriptinotallow="按照用户的问题搜索相关的资料,对于招股书类的问题,you must use this tool!",
        )
        return retriever_tool

第二、通过 System Prompt 告诉 AI Agent 智能体的工作逻辑

为 FinanceBotEX 类添加 System Prompt 工作指令。

def create_prompt():
        system_prompt = """你是一位金融助手,可以帮助用户查询数据库中的信息。
            你要尽可能的回答用户提出的问题,为了更好的回答问题,你可以使用工具进行多轮的尝试。


            # 关于 retriever_tool工具的使用:
            1、你需要结合对检索出来的上下文进行回答问题。
            2、如果你不知道答案,就说你不知道。请使用不超过三句话的简洁回答。


            # 关于 sql_tools类工具的使用: 
            ## 工具使用规则                                     
            1、你需要根据用户的问题,创建一个语法正确的 SQLite 查询来运行,然后查看查询的结果并返回答案。
            2、除非用户指定了他们希望获得的特定数量的示例,否则总是将查询限制为最多5个结果。
            3、您可以按相关列对结果进行排序,以返回数据库中最有趣的示例。
            4、永远不要查询指定表的所有列以避免查询性能问题,你只查询给定问题的相关列即可。
            5、你必须在执行查询之前仔细检查查询。如果执行查询时出现错误,请重新编写查询并重试。
            6、请勿对数据库进行任何 DML 语句(INSERT,UPDATE,DELETE,DROP等)。


            ## 工具使用过程
            1、首先,你应该始终查看数据库中的表,看看可以查询什么,这一步骤很重要,注意不要跳过。
            2、然后,你应该查询最相关表的 schema。


            ## 工具使用注意事项:
            1、如果生成的 SQL 语句中,字段带有英文括号(),请使用双引号包裹起来,例如:收盘价(元) 双引号包裹为 "收盘价(元)"。
            2、如果查询过程中 SQL 语句有语法错误,减少查询量,总体查询次数应控制在15次以内。


            # 关于你的思考和行动过程,请按照如下格式:
            问题:你必须回答的输入问题
            思考:你应该总是考虑该怎么做
            行动:你应该采取的行动,应该是以下工具之一:{tool_names}
            行动输入:行动的输入
            观察:行动的结果
            ... (这个思考/行动/行动输入/观察可以重复N次)
            思考: 我现在知道最终答案了
            最终答案:原始输入问题的最终答案




            Begin!


            """
        return system_prompt

第三、创建 AI Agent 智能体

在配置好所需的工具和 System Prompt 之后,我们可以创建一个 AI Agent 智能体,并将预先准备好的工具和 System Prompt 传递给它。

接着,为 FinanceBotEx 类进行扩展。

def init_agent(self):
#初始化 RAG 工具
    retriever_tool = self.init_rag_tools()


#初始化 SQL 工具
    sql_tools = self.init_sql_tool(settings.SQLDATABASE_URI)


#创建系统 Prompt 提示语
    system_prompt = self.create_prompt()


#创建Agent
    agent_executor = create_react_agent(
        self.chat,
        tools=[retriever_tool]+ sql_tools,
        state_modifier=system_prompt
)
return agent_executor

第四、 AI Agent 智能体运行处理逻辑

为 FinanceBotEx 类继续添加运行处理逻辑:

def handle_query(self, example_query):


# 流式处理事件
events = self.agent_executor.stream(
  {
    "messages":[("user", example_query)]},
            stream_mode="values",
  )


# 打印流式事件的消息
for event in events:
    event["messages"][-1].pretty_print()


return event["messages"][-1].content

第五、 AI Agent 智能体运行结果

在 Python 文件中继续添加测试函数:

# 测试 FinanceBotEx 主流程
def test_financebot_ex():
from finance_bot_ex importFinanceBotEx
    llm, chat, embed = get_qwen_models()
    financebot =FinanceBotEx(llm=llm, chat=chat, embed=embed)


    example_query ="20210304日,一级行业为非银金融的股票的成交量合计是多少?取整。"


    financebot.handle_query(example_query)


if __name__ =="__main__":
# test_rag()
# test_import()
    test_financebot_ex()

运行结果如下:

基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践-AI.x社区

基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践-AI.x社区

通过日志可以看到,AI Agent 智能体收到问题后,先去 SQL 数据库中查询看有哪些表可能有这些数据,通过返回的表信息自主实现对应的 SQL 语句,然后查询结果后给出答案。

如果将上面的问题变成如下问题:

example_query = "根据联化科技股份有限公司招股意见书,精细化工产品的通常利润率是多少?"

运行结果如下:

基于 AI Agent 智能体架构落地复杂问答系统的案例设计与实践-AI.x社区


通过日志可以看到,AI Agent 智能体对于这个问题认为应该直接去 RAG 中搜索,所以直接调用工具 rag_search。

3、基于 AI Agent 智能体的新架构设计方案总结

  • AI Agent 智能体的架构设计是一种面向目标架构设计的新范式,它的架构设计理念与传统面向过程架构设计范式存在显著差异:

第一、在传统架构设计中,需要对程序的每一个步骤进行精确的控制,技静态业务流程编排;

第二、AI Agent 智能体的核心理念是通过提示词(Prompt)向大模型传达运行规则,随后大模型自主进行思考和执行操作。

  • 使用 AI Agent 智能体的过程涉及以下4个步骤:

第一、首先构建所需的工具。

第二、接着设计相应的提示词(Prompt)。

第三、然后创建 AI Agent Agent,并将这些工具和提示词赋予它。

第四,通过 AI Agent 智能体的流(stream)功能来处理用户的输入问题。


本文转载自公众号玄姐聊AGI  作者:玄姐

原文链接:​​https://mp.weixin.qq.com/s/2wkFHLpyteaD7NtRTkF9XA​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐