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

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建 原創(chuàng)

發(fā)布于 2024-11-22 15:53
瀏覽
0收藏

前言

上一章【項(xiàng)目實(shí)戰(zhàn)】基于Agent的金融問(wèn)答系統(tǒng):RAG檢索模塊初建成,我們已經(jīng)完成了RAG的基本流程,本章我將梳理Agent的運(yùn)行框架以及介紹如何將RAG數(shù)據(jù)和SQL查詢數(shù)據(jù)進(jìn)行整合,實(shí)現(xiàn)金融問(wèn)題的自主回答。

核心問(wèn)題

在進(jìn)行Agent框架介紹之前,我們需要探討一個(gè)核心問(wèn)題,即:??用戶輸入一個(gè)問(wèn)題后,如何實(shí)現(xiàn)用戶問(wèn)題的自動(dòng)查詢(是SQL查詢還是RAG檢索)?? 。

意圖識(shí)別方案

關(guān)于這個(gè)問(wèn)題,我們?cè)幸粋€(gè)方案如下:

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建-AI.x社區(qū)

  • 對(duì)于用戶輸入的問(wèn)題,是需要查詢SQL,還是需要去RAG檢索,我們通過(guò)一個(gè)意圖識(shí)別模塊來(lái)實(shí)現(xiàn);
  • 意圖識(shí)別模塊會(huì)接受用戶的問(wèn)題,然后將用戶的問(wèn)題交給大模型去分辨;
  • 大模型我們提前做了sft微調(diào)(few-shot少樣本訓(xùn)練也可以達(dá)到同樣效果),讓大模型知道什么樣的問(wèn)題屬于SQL查詢問(wèn)題,什么樣的問(wèn)題屬于RAG檢索問(wèn)題,例如:

# 準(zhǔn)備few-shot樣例
  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í)別結(jié)果之后,在代碼中通過(guò)if...else對(duì)識(shí)別結(jié)果進(jìn)行不同類別的后續(xù)處理,如下:

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

return result

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

return result
else:
# 其他類問(wèn)題
            result = self.chat.invoke(input=question).content
return result

意圖識(shí)別方案的問(wèn)題

這一方案有個(gè)核心問(wèn)題:

  1. 如果意圖識(shí)別錯(cuò)了,那么后續(xù)的處理就失效了,答案一定會(huì)錯(cuò);
  2. 我們固然可以給if...else...增加修正策略,比如:rag檢索不到那就去sql里再查一下....但是如果我們需求很復(fù)雜呢,這個(gè)策略編寫和維護(hù)成本也是指數(shù)級(jí)上升;
  3. 最為重要的一點(diǎn)是:這種方式我覺(jué)得一點(diǎn)都不智能!

這種方式還是傳統(tǒng)開(kāi)發(fā)的思維:由開(kāi)發(fā)者來(lái)清晰地控制著程序的每一步驟,大模型在其中只是扮演一個(gè)輔助工具角色(例如:做個(gè)問(wèn)題分類)

但是,在我首次接觸Agent時(shí),Agent的自主思考和自主行動(dòng)給我留下了深刻的印象,所以我決定換一種方式:使用Agent來(lái)進(jìn)行用戶問(wèn)題的自主判斷、自主解決。

Agent框架

在【課程總結(jié)】day30:大模型之Agent的初步了解中,我們?cè)醪搅私釧gent框架如下:

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建-AI.x社區(qū)

由上圖可知,如果我們給Agent賦予相應(yīng)的工具,那么Agent依托于大模型的思考力,可以自主開(kāi)展相應(yīng)的planning以及action。因此,我們首要解決如何給Agent賦予相應(yīng)的工具。

1、賦予Agent工具

因?yàn)槲覀兊男枨笫遣樵兘Y(jié)構(gòu)化的SQL數(shù)據(jù)庫(kù)和非結(jié)構(gòu)化的RAG數(shù)據(jù),所以我們需要給Agent賦予兩個(gè)工具,具體如下:

1.1、創(chuàng)建Agent的管理類

代碼文件及目錄:??app/finance_bot_ex.py??

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)

1.2、創(chuàng)建數(shù)據(jù)庫(kù)SQL工具

為FinanceBotEx類添加

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

說(shuō)明:

  • 上述函數(shù)中path用來(lái)傳入SQlite數(shù)據(jù)庫(kù)的路徑
  • 使用langchain封裝的 SQLDatabase 連接數(shù)據(jù)庫(kù)
  • 使用langchain封裝的 SQLDatabaseToolkit 得到SQL相關(guān)的工具,用以后續(xù)提供給Agent

1.3、創(chuàng)建RAG檢索工具

為FinanceBotEx類添加

def init_rag_tools(self):
        # 給大模型 RAG 檢索器工具
        retriever = self.rag.get_retriever()
        retriever_tool = create_retriever_tool(
            retriever=retriever,
            name="rag_search",
            description="按照用戶的問(wèn)題搜索相關(guān)的資料,對(duì)于招股書類的問(wèn)題,you must use this tool!",
        )
        return retriever_tool

說(shuō)明:

  • 該函數(shù)中的??self.rag?? 是我們封裝的RAG管理類
  • 通過(guò)這個(gè)管理類的get_retriever()得到RAG的檢索器
  • 借助langchain封裝的create_retriever_tool(),將檢索器創(chuàng)建為一個(gè)工具:

工具的??name??? 為??rag_search??

工具的??description?? 用于告訴大模型,這個(gè)工具能做什么用(這一點(diǎn)很重要)

2、告訴Agent的工作邏輯:Prompt

為FinanceBotEx類添加

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類工具的使用: 
            ## 工具使用規(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

3、創(chuàng)建agent

在準(zhǔn)備好相應(yīng)的工具以及prompt之后,創(chuàng)建Agent并傳入提前準(zhǔn)備好的工具和prompt。

為FinanceBotEx類添加

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

說(shuō)明:

  • ??settings.SQLDATABASE_URI?? 是一個(gè)本地SQLite文件的路徑,我將它單獨(dú)維護(hù)在app/settings.py中,方便配置的修改。
  • 代碼文件:??app/settings.py????# 連接數(shù)據(jù)庫(kù)db文件的地址根據(jù)需要需要更換
    SQLDATABASE_URI = os.path.join(os.getcwd(), "app/dataset/dataset/博金杯比賽數(shù)據(jù).db")?
    ?

4、驅(qū)動(dòng)agent運(yùn)行

為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

測(cè)試效果

在test_framework.py中增加測(cè)試函數(shù)如下:

# 測(cè)試 FinanceBotEx 主流程
deftest_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é)果:

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建-AI.x社區(qū)

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建-AI.x社區(qū)

通過(guò)日志可以看到,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)化科技股份有限公司招股意見(jiàn)書,精細(xì)化工產(chǎn)品的通常利潤(rùn)率是多少?"

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

基于Agent的金融問(wèn)答系統(tǒng):Agent框架的構(gòu)建-AI.x社區(qū)

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

內(nèi)容小結(jié)

  • Agent的實(shí)現(xiàn)思想與傳統(tǒng)開(kāi)發(fā)有著極大的不同:

     傳統(tǒng)開(kāi)發(fā)對(duì)于程序的每個(gè)步驟都需要清晰地控制

     Agent的思想則是通過(guò)prompt告訴大模型的運(yùn)行規(guī)則,然后由大模型自主思考和行動(dòng)

  • 使用Agent時(shí)需要幾個(gè)步驟:
  • 創(chuàng)建相應(yīng)的工具
  • 創(chuàng)建對(duì)應(yīng)的prompt
  • 創(chuàng)建agent并賦予相應(yīng)的工具和prompt
  • 通過(guò)agent的stream來(lái)處理輸入的問(wèn)題

?

本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:Dongming

原文鏈接:??https://mp.weixin.qq.com/s/mY2KUqZTm6a9Lkr-N8xRmA??

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