自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐 原創(chuàng)

發(fā)布于 2024-11-28 16:17
瀏覽
0收藏

1、先從傳統(tǒng)思維的架構(gòu)設(shè)計(jì)說(shuō)起

我們先來(lái)看一個(gè)場(chǎng)景:用戶輸入一個(gè)問(wèn)題(Prompt)后,如何實(shí)現(xiàn)用戶問(wèn)題的自動(dòng)路由和查詢(比如:是 RAG 檢索還是 SQL 查詢)?

  • 解決方案:意圖識(shí)別架構(gòu)設(shè)計(jì)

第一、對(duì)于用戶輸入的問(wèn)題(Prompt),我們通過(guò)意圖識(shí)別模塊來(lái)判斷是需要路由給RAG 檢索還是路由給 SQL 查詢;

第二、意圖識(shí)別模塊接收用戶的問(wèn)題(Prompt),然后將用戶的問(wèn)題交給大模型去判斷分類;

第三、意圖識(shí)別架構(gòu)設(shè)計(jì)如下圖所示:

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐-AI.x社區(qū)

第四、大模型需要提前做 SFT Fine-tuning 微調(diào),目的是讓大模型知道什么問(wèn)題屬于 RAG 檢索問(wèn)題,什么問(wèn)題屬于 SQL 查詢問(wèn)題,F(xiàn)ine-tuning 微調(diào)的樣本數(shù)據(jù)格式如下:

examples =[
{
"inn":"我想知道東方阿爾法優(yōu)勢(shì)產(chǎn)業(yè)混合C基金,在2021年年度報(bào)告中,前10大重倉(cāng)股中,有多少只股票在報(bào)告期內(nèi)取得正收益。",
"out":"rag_question***我想知道東方阿爾法優(yōu)勢(shì)產(chǎn)業(yè)混合C基金,在2021年年度報(bào)告中,前10大重倉(cāng)股中,有多少只股票在報(bào)告期內(nèi)取得正收益。"
},
{
"inn":"森赫電梯股份有限公司產(chǎn)品生產(chǎn)材料是什么?",
"out":"rag_question***森赫電梯股份有限公司產(chǎn)品生產(chǎn)材料是什么?"
},
{
"inn":"20210930日,一級(jí)行業(yè)為機(jī)械的股票的成交金額合計(jì)是多少?取整。",
"out":"agent_question***20210930日,一級(jí)行業(yè)為機(jī)械的股票的成交金額合計(jì)是多少?取整。"
},
...
  ]


第五、意圖識(shí)別模塊識(shí)別結(jié)果后,通過(guò)在代碼中硬編碼 if...else 對(duì)識(shí)別后的分類進(jìn)行不同的后續(xù)處理,代碼如下:

# 如果是 RAG 相關(guān)的問(wèn)題
if intent =="rag_question":
    result = self.rag.get_result(questinotallow=question)
return result


# 如果是 Agent 相關(guān)的問(wèn)題
elif intent =="agent_question":
    result = self.agent.get_result(input=question)
return result


# 其他類問(wèn)題
else:
    result = self.chat.invoke(input=question).content
return result
  • 意圖識(shí)別架構(gòu)設(shè)計(jì)的問(wèn)題

從上述實(shí)現(xiàn)流程我們可以看到,意圖識(shí)別的架構(gòu)設(shè)計(jì)本質(zhì)還是傳統(tǒng)的開發(fā)模式,也就是靜態(tài)業(yè)務(wù)流程編排的面向過(guò)程架構(gòu)設(shè)計(jì)范式,也就是說(shuō)程序執(zhí)行的每一個(gè)步驟還是由開發(fā)者精準(zhǔn)控制,大模型此刻只是扮演者輔助工具角色,用于問(wèn)題分類,這種面向過(guò)程的架構(gòu)設(shè)計(jì)范式有3個(gè)問(wèn)題:

第一、若意圖識(shí)別出現(xiàn)偏差,后續(xù)的處理流程將失去效果,結(jié)果必然會(huì)出現(xiàn)錯(cuò)誤。

第二、盡管我們可以在 if...else... 結(jié)構(gòu)中加入修正策略,比如:當(dāng) RAG 檢索失敗時(shí)轉(zhuǎn)而查詢 SQ L數(shù)據(jù)庫(kù),但面對(duì)復(fù)雜的需求,這種策略的編寫與維護(hù)成本將呈指數(shù)級(jí)增長(zhǎng)。

第三、最關(guān)鍵的是,這種處理方式絲毫體現(xiàn)不出智能化的特點(diǎn)。

那么如何基于 AI Agent 智能體的架構(gòu)設(shè)計(jì)對(duì)用戶問(wèn)題(Prompt)自主判斷和自主解決呢?

2、基于 AI Agent 智能體的新架構(gòu)設(shè)計(jì)方案

AI Agent 智能體由大模型推理能力、Planning 規(guī)劃能力、Tools 工具使用能力、Action 行動(dòng)能力、Memory 記憶能力構(gòu)成,如下圖所示:

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐-AI.x社區(qū)

從上圖我們可以看到,一旦我們?yōu)?AI Agent 智能體配備了適當(dāng)?shù)墓ぞ?,它便能借助大模型的推理能力,?dú)立地進(jìn)行規(guī)劃和行動(dòng)。因此,我們首先需要解決的問(wèn)題是如何為 AI Agent 智能體配備必要的工具。

第一、為 AI Agent 智能體配備工具

這個(gè)案例我們的需求是結(jié)構(gòu)化的 SQL 查詢和非結(jié)構(gòu)化的 RAG 檢索,我們給 AI Agent 智能體配備這兩個(gè)工具:

1.創(chuàng)建 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.創(chuàng)建 SQL 查詢工具

為 FinanceBotEX 類添加 SQL 查詢工具。

def init_sql_tool(self, path):
        # 連接數(shù)據(jù)庫(kù)
        db = SQLDatabase.from_uri(f"sqlite:///{path}")
        toolkit = SQLDatabaseToolkit(db=db, llm=self.llm)
        sql_tools = toolkit.get_tools()  # 工具


        return sql_tools

3.創(chuàng)建 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="按照用戶的問(wèn)題搜索相關(guān)的資料,對(duì)于招股書類的問(wèn)題,you must use this tool!",
        )
        return retriever_tool

第二、通過(guò) System Prompt 告訴 AI Agent 智能體的工作邏輯

為 FinanceBotEX 類添加 System Prompt 工作指令。

def create_prompt():
        system_prompt = """你是一位金融助手,可以幫助用戶查詢數(shù)據(jù)庫(kù)中的信息。
            你要盡可能的回答用戶提出的問(wèn)題,為了更好的回答問(wèn)題,你可以使用工具進(jìn)行多輪的嘗試。


            # 關(guān)于 retriever_tool工具的使用:
            1、你需要結(jié)合對(duì)檢索出來(lái)的上下文進(jìn)行回答問(wèn)題。
            2、如果你不知道答案,就說(shuō)你不知道。請(qǐng)使用不超過(guò)三句話的簡(jiǎn)潔回答。


            # 關(guān)于 sql_tools類工具的使用: 
            ## 工具使用規(guī)則                                     
            1、你需要根據(jù)用戶的問(wèn)題,創(chuàng)建一個(gè)語(yǔ)法正確的 SQLite 查詢來(lái)運(yùn)行,然后查看查詢的結(jié)果并返回答案。
            2、除非用戶指定了他們希望獲得的特定數(shù)量的示例,否則總是將查詢限制為最多5個(gè)結(jié)果。
            3、您可以按相關(guān)列對(duì)結(jié)果進(jìn)行排序,以返回?cái)?shù)據(jù)庫(kù)中最有趣的示例。
            4、永遠(yuǎn)不要查詢指定表的所有列以避免查詢性能問(wèn)題,你只查詢給定問(wèn)題的相關(guān)列即可。
            5、你必須在執(zhí)行查詢之前仔細(xì)檢查查詢。如果執(zhí)行查詢時(shí)出現(xiàn)錯(cuò)誤,請(qǐng)重新編寫查詢并重試。
            6、請(qǐng)勿對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何 DML 語(yǔ)句(INSERT,UPDATE,DELETE,DROP等)。


            ## 工具使用過(guò)程
            1、首先,你應(yīng)該始終查看數(shù)據(jù)庫(kù)中的表,看看可以查詢什么,這一步驟很重要,注意不要跳過(guò)。
            2、然后,你應(yīng)該查詢最相關(guān)表的 schema。


            ## 工具使用注意事項(xiàng):
            1、如果生成的 SQL 語(yǔ)句中,字段帶有英文括號(hào)(),請(qǐng)使用雙引號(hào)包裹起來(lái),例如:收盤價(jià)(元) 雙引號(hào)包裹為 "收盤價(jià)(元)"。
            2、如果查詢過(guò)程中 SQL 語(yǔ)句有語(yǔ)法錯(cuò)誤,減少查詢量,總體查詢次數(shù)應(yīng)控制在15次以內(nèi)。


            # 關(guān)于你的思考和行動(dòng)過(guò)程,請(qǐng)按照如下格式:
            問(wèn)題:你必須回答的輸入問(wèn)題
            思考:你應(yīng)該總是考慮該怎么做
            行動(dòng):你應(yīng)該采取的行動(dòng),應(yīng)該是以下工具之一:{tool_names}
            行動(dòng)輸入:行動(dòng)的輸入
            觀察:行動(dòng)的結(jié)果
            ... (這個(gè)思考/行動(dòng)/行動(dòng)輸入/觀察可以重復(fù)N次)
            思考: 我現(xiàn)在知道最終答案了
            最終答案:原始輸入問(wèn)題的最終答案




            Begin!


            """
        return system_prompt

第三、創(chuàng)建 AI Agent 智能體

在配置好所需的工具和 System Prompt 之后,我們可以創(chuàng)建一個(gè) AI Agent 智能體,并將預(yù)先準(zhǔn)備好的工具和 System Prompt 傳遞給它。

接著,為 FinanceBotEx 類進(jìn)行擴(kuò)展。

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


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


#創(chuàng)建系統(tǒng) Prompt 提示語(yǔ)
    system_prompt = self.create_prompt()


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

第四、 AI Agent 智能體運(yùn)行處理邏輯

為 FinanceBotEx 類繼續(xù)添加運(yùn)行處理邏輯:

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 智能體運(yùn)行結(jié)果

在 Python 文件中繼續(xù)添加測(cè)試函數(shù):

# 測(cè)試 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日,一級(jí)行業(yè)為非銀金融的股票的成交量合計(jì)是多少?取整。"


    financebot.handle_query(example_query)


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

運(yùn)行結(jié)果如下:

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐-AI.x社區(qū)

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐-AI.x社區(qū)

通過(guò)日志可以看到,AI Agent 智能體收到問(wèn)題后,先去 SQL 數(shù)據(jù)庫(kù)中查詢看有哪些表可能有這些數(shù)據(jù),通過(guò)返回的表信息自主實(shí)現(xiàn)對(duì)應(yīng)的 SQL 語(yǔ)句,然后查詢結(jié)果后給出答案。

如果將上面的問(wèn)題變成如下問(wèn)題:

example_query = "根據(jù)聯(lián)化科技股份有限公司招股意見書,精細(xì)化工產(chǎn)品的通常利潤(rùn)率是多少?"

運(yùn)行結(jié)果如下:

基于 AI Agent 智能體架構(gòu)落地復(fù)雜問(wèn)答系統(tǒng)的案例設(shè)計(jì)與實(shí)踐-AI.x社區(qū)


通過(guò)日志可以看到,AI Agent 智能體對(duì)于這個(gè)問(wèn)題認(rèn)為應(yīng)該直接去 RAG 中搜索,所以直接調(diào)用工具 rag_search。

3、基于 AI Agent 智能體的新架構(gòu)設(shè)計(jì)方案總結(jié)

  • AI Agent 智能體的架構(gòu)設(shè)計(jì)是一種面向目標(biāo)架構(gòu)設(shè)計(jì)的新范式,它的架構(gòu)設(shè)計(jì)理念與傳統(tǒng)面向過(guò)程架構(gòu)設(shè)計(jì)范式存在顯著差異:

第一、在傳統(tǒng)架構(gòu)設(shè)計(jì)中,需要對(duì)程序的每一個(gè)步驟進(jìn)行精確的控制,技靜態(tài)業(yè)務(wù)流程編排;

第二、AI Agent 智能體的核心理念是通過(guò)提示詞(Prompt)向大模型傳達(dá)運(yùn)行規(guī)則,隨后大模型自主進(jìn)行思考和執(zhí)行操作。

  • 使用 AI Agent 智能體的過(guò)程涉及以下4個(gè)步驟:

第一、首先構(gòu)建所需的工具。

第二、接著設(shè)計(jì)相應(yīng)的提示詞(Prompt)。

第三、然后創(chuàng)建 AI Agent Agent,并將這些工具和提示詞賦予它。

第四,通過(guò) AI Agent 智能體的流(stream)功能來(lái)處理用戶的輸入問(wèn)題。


本文轉(zhuǎn)載自公眾號(hào)玄姐聊AGI  作者:玄姐

原文鏈接:??https://mp.weixin.qq.com/s/2wkFHLpyteaD7NtRTkF9XA??

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
標(biāo)簽
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦