国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮 原創

發布于 2024-11-26 08:58
瀏覽
0收藏

前言

在上一章??【項目實戰】基于Agent的金融問答系統:RAG的檢索增強之ElasticSearch??中,我們在已經構建的Agent框架上,通過集成檢索器將ES檢索器和多路召回檢索器集成進來,提升了檢索的召回率。本章,我們將基于項目問題,進一步優化Agent的檢索能力。

問題

隨著該項目檢索能力的增強,我們計劃對天池大賽提供的1000個問題進行執行,依次評估我們的系統能力如何。 在這個測試過程中,我們發現了多個待優化的問題,其中有2個問題的解決值得分享,在此作為記錄以供讀者參考。

問題1:執行過程中,偶爾會出現RAG檢索結果內容過長,超出大模型能夠接收的范圍(如下圖中顯示的status_code=400),導致執行中斷

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

問題2:Agent遇到計算漲幅、收益率等問題時,會反復構造SQL語句,試圖從數據庫中直接查詢出對應的數據,從而導致思考迭代此處超過限制,程序異常

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

優化方案

分析上述問題后,我們計劃對整體程序進行優化,優化方案如下:

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

說明:

  • 針對問題1,我們計劃給集成檢索器增加上下文重排和壓縮,以解決長文本問題。
  • 針對問題2,我們計劃為Agent掛載更多的工具,進而讓Agent使用工具計算漲幅、收益率等。

優化步驟

1、檢索器增加上下文壓縮

優化代碼文件:??app/rag/retrievers.py??

from langchain_core.callbacks importCallbackManagerForRetrieverRun
from utils.logger_config importLoggerManager
from langchain_core.retrievers importBaseRetriever
from langchain_core.documents importDocument
from langchain.retrievers importEnsembleRetriever
from langchain.retrievers.multi_query importMultiQueryRetriever
from langchain.retrievers.contextual_compression importContextualCompressionRetriever
from langchain.retrievers.document_compressors importLLMChainExtractor
from rag.elasticsearch_db importElasticsearchDB
# ES需要導入的庫
from typing importList
import logging
import settings
from langchain_community.document_transformers import(
LongContextReorder,
)
from utils.util import get_rerank_model

logger =LoggerManager().logger


classSimpleRetrieverWrapper():
"""自定義檢索器實現"""

def__init__(self, store, llm, **kwargs):
        self.store = store
        self.llm = llm
        logger.info(f'檢索器所使用的Chat模型:{self.llm}')

defcreate_retriever(self):
        logger.info(f'初始化自定義的Retriever')

# 初始化一個空的檢索器列表
        retrievers =[]
        weights =[]

# Step1:創建一個 多路召回檢索器 MultiQueryRetriever
        chromadb_retriever = self.store.as_retriever()
        mq_retriever =MultiQueryRetrieverWrapper.from_llm(retriever=chromadb_retriever, llm=self.llm)

# Step2:創建一個 上下文壓縮檢索器ContextualCompressionRetriever
if settings.COMPRESSOR_ENABLE isTrue:
            compressor =LLMChainExtractor.from_llm(llm=self.llm)
            compression_retriever =ContextualCompressionRetrieverWrapper(
                base_compressor=compressor, base_retriever=mq_retriever
)
# 開啟開關就使用壓縮檢索器
            retrievers.append(compression_retriever)
            weights.append(0.5)
            logger.info(f'已啟用 ContextualCompressionRetriever')
else:
# 關閉開關就使用多路召回檢索器
            retrievers.append(mq_retriever)
            weights.append(0.5)
            logger.info(f'已啟用 MultiQueryRetriever')

# Step3:創建一個 ES 檢索器
if settings.ELASTIC_ENABLE_ES isTrue:
            es_retriever =ElasticsearchRetriever()
            retrievers.append(es_retriever)
            weights.append(0.5)
            logger.info(f'已啟用 ElasticsearchRetriever')

# 使用集成檢索器,將所有啟用的檢索器集合在一起
        ensemble_retriever =EnsembleRetriever(retrievers=retrievers, weights=weights)
return ensemble_retriever

說明:

  • 首先,我們創建一個空的檢索器列表,用于存儲啟用的檢索器。
  • 其次,創建一個 ??MultiQueryRetrieverWrapper?? ,用于將ES檢索器與多路召回檢索器集成。
  • 然后,通過 ??ContextualCompressionRetrieverWrapper?? ,為多路檢索器添加上下文壓縮功能。
  • 最后,將檢索器列表與權重列表傳入集成檢索器,完成集成。

此處,MultiQueryRetrieverWrapper 和 ContextualCompressionRetrieverWrapper 分別是基于 ??MultiQueryRetriever??? 和 ??ContextualCompressionRetriever?? 進一步封裝實現的,在3、中會詳細介紹。

2、檢索器增加上下文重排

對之前實現的ElasticsearchRetriever增加上下文重排功能,具體代碼如下:

優化代碼文件:??app/rag/retrievers.py??

class ElasticsearchRetriever(BaseRetriever):
def_get_relevant_documents(self, query: str, )->List[Document]:
"""Return the first k documents from the list of documents"""
        es_connector =ElasticsearchDB()
        query_result = es_connector.search(query)

# 增加長上下文重排序
        reordering =LongContextReorder()
        reordered_docs = reordering.transform_documents(query_result)
# logger.info(f"ElasticSearch檢索到的原始文檔:")
# for poriginal in query_result:
#     logger.info(f"{poriginal}")

        logger.info(f"ElasticSearch檢索重排后的文檔:")
for preordered in reordered_docs:
            logger.info(f"{preordered}")

        logger.info(f"ElasticSearch檢索到資料文件個數:{len(query_result)}")

if reordered_docs:
return[Document(page_cnotallow=doc)for doc in reordered_docs]
return []

3、優化日志輸出

由于 ??MultiQueryRetriever?? 是langchain已經封裝好的檢索器,如果我們需要在其基礎上增加一些功能,比如:增加日志,我們需要對其進行重寫,具體方法:

重寫MultiQueryRetriever

創建一個新的Class ??MultiQueryRetrieverWrapper???,繼承 ??MultiQueryRetriever??? ,重寫 ??_get_relevant_documents?? 方法,具體代碼如下:

class MultiQueryRetrieverWrapper(MultiQueryRetriever):
def_get_relevant_documents(
        self,
        query: str,
        *,
        run_manager: CallbackManagerForRetrieverRun,
    )->List[Document]:
"""
        對MultiQueryRetriever進行重寫,增加日志打印
        """
        queries = self.generate_queries(query, run_manager)
if self.include_original:
            queries.append(query)
        documents = self.retrieve_documents(queries, run_manager)

# 增加長上下文重排序
        reordering =LongContextReorder()
        reordered_docs = reordering.transform_documents(documents)

        logger.info(f'MultiQuery生成的檢索語句:')
for q in queries:
            logger.info(f"{q}")
        logger.info(f'MultiQuery檢索到的資料文件:')
for doc in documents:
            logger.info(f"{doc}")
        logger.info(f"MultiQuery檢索到資料文件個數:{len(documents)}")

return self.unique_union(reordered_docs)

重寫ContextualCompressionRetriever

創建一個新的Class ??ContextualCompressionRetrieverWrapper???,繼承 ??ContextualCompressionRetriever??? ,重寫 ??_get_relevant_documents?? 方法,具體代碼如下:

class ContextualCompressionRetrieverWrapper(ContextualCompressionRetriever):
from typing importAny,List
def_get_relevant_documents(
        self,
        query: str,
        *,
        run_manager: CallbackManagerForRetrieverRun,
        **kwargs: Any,
    )->List[Document]:
"""
        對ContextualCompressionRetriever進行重寫,增加日志打印
        """

        docs = self.base_retriever.invoke(
            query, cnotallow={"callbacks": run_manager.get_child()},**kwargs
)
if docs:
            compressed_docs = self.base_compressor.compress_documents(
                docs, query, callbacks=run_manager.get_child()
)
            logger.info(f'壓縮后的文檔長度:{len(compressed_docs)}')
            logger.info(f'壓縮后的文檔:{compressed_docs}')
returnlist(compressed_docs)
else:
return []

4、給Agent增加更多工具

實現工具函數:計算股票年化收益率

代碼文件:??app/finance_bot_ex.py??

# 定義股票年化收益率計算函數
# 年化收益率定義為:((有記錄的一年的最終收盤價-有記錄的一年的年初當天開盤價)/有記錄的一年的當天開盤價)* 100%。
def calculate_stock_annualized_return(final_closing_price: float, initial_opening_price: float) -> float:
    """
    計算股票年化收益率
    """
    annualized_return = ((final_closing_price - initial_opening_price) / initial_opening_price) * 100
    return annualized_return

Agent增加工具

在??init_agent??函數中,增加工具函數,具體代碼如下:

代碼優化文件:??app/finance_bot_ex.py??

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

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

# 創建系統Prompt提示語
        system_prompt = self.create_sys_prompt()

# 創建Agent
        agent_executor = create_react_agent(
            self.chat,
            tools=[
                get_datetime,
                calculate_stock_annualized_return,# 增加自定義的計算年化收益率工具
                retriever_tool]+ sql_tools,
            state_modifier=system_prompt,
            checkpointer=MemorySaver()
# state_modifier=modify_state_messages,
)
return agent_executor

4、驗證測試

完成上述檢索器的優化之后,我們使用test_framework.py進行驗證,驗證結果如下:

問題1解決效果

1. 用戶輸入問題,觸發RAG檢索的 MultiQueryRetriever 檢索器

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

2. 通過上下文壓縮之后,原本 MultiQueryRetriever 檢索到的資料文件數量由12個減少到1個。

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

3. 通過上下文壓縮之后,原本 ElasticsearchRetriever 檢索到的資料文件數量由3個減少到2個。

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

4. 最后,將兩個檢索器的結果進行整合后,大模型給出最終答案。

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

問題2解決效果

1. 我們輸入問題:計算代碼000798股票在2020年的年化收益率,保留兩位小數。

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

2. Agent分析問題后,形成SQL查詢語句:獲取2020年第一天開盤價以及2020年最后一天的收盤價

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

3. Agent獲得開盤價和收盤價之后,調用我們提供的 calculate_stock_annualized_return 函數計算年化收益率,并返回結果。

基于Agent的金融問答系統:RAG的檢索增強之上下文重排和壓縮-AI.x社區

結束語

基于Agent的金融問答系統系列文章在此告一段落了。 在這個項目中,我們不只利用AI技術完成了項目課題,其中也不乏應用了軟件工程的一些方法論,而最為重要的是:我們解決了一個又一個的問題。 最后,附帶一張黑神話悟空的圖片,希望看到此篇文章的你我一同共勉。

?

本文轉載自公眾號一起AI技術 作者:Dongming

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

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
標簽
收藏
回復
舉報
回復
相關推薦
精品999在线播放| 欧美视频在线观看一区二区| 国内精品视频在线| 久久99精品久久| 久久亚洲综合色一区二区三区| 91精品视频网站| 日韩专区视频网站| 91精品国产丝袜白色高跟鞋| 国模大尺度私拍在线视频| 蓝色福利精品导航| 97av自拍| 日韩三级毛片| 日韩小视频在线观看| 日本在线观看视频| 亚洲欧美日韩成人高清在线一区| 一级黄色录像免费看| 国产精品观看| 国产精品福利网站| 精品午夜视频| 精品一区二区三区四区| 成人一区二区不卡免费| 亚洲成av人片www| 成人蜜桃视频网站网址| 久久影院午夜片一区| 男女啪啪免费观看| 久久精品国内一区二区三区| 韩国一区二区三区美女美女秀| 国产一区不卡| 青青久久av北条麻妃黑人| 免费观看亚洲天堂| www亚洲欧美| 电影一区电影二区| 亚洲午夜久久久久久久| 最新超碰在线| 日韩欧美卡一卡二| 91精选在线| 欧美放荡的少妇| 成全电影播放在线观看国语| 日韩欧美国产黄色| 黄页网址大全在线播放| 亚洲综合在线观看视频| 最近中文字幕mv2018在线高清| 中文字幕日韩一区二区| 色偷偷亚洲第一成人综合网址| 国产喂奶挤奶一区二区三区 | 免费资源在线观看| 亚洲午夜久久久久| 最近最新中文字幕在线| 亚洲影院理伦片| 传媒av在线| 亚洲自拍与偷拍| 亚洲国产资源| 欧美日韩另类一区| 日本成人不卡| 亚洲欧洲国产一区| **国产精品| 日本高清+成人网在线观看| 精品高清在线| 444亚洲人体| 一区二区三区四区五区在线| 欧美日韩在线不卡一区| 国产一区在线看| 97av视频在线观看| 中文字幕在线免费不卡| 色琪琪原网站亚洲香蕉| 精品福利免费观看| av网站免费在线观看| 亚洲精品720p| 日韩精品三级| 国产精品观看在线亚洲人成网| 中文字幕一区二区三三| 乱色588欧美| 国产91精品一区二区麻豆网站| 虎白女粉嫩尤物福利视频| 亚洲精品v日韩精品| 番号集在线观看| 亚洲摸下面视频| jizz性欧美2| 91热福利电影| 久久66热偷产精品| 日韩有码免费视频| 亚洲国产日韩综合久久精品| 91看片在线观看| 中文字幕日韩av| 欧洲杯半决赛直播| 深田咏美在线x99av| 91在线精品秘密一区二区| 男女羞羞视频教学| 91精品国产综合久久久久| 欧美极度另类| 亚洲 日韩 国产第一| 精品1区2区3区4区| 农民人伦一区二区三区| 亚洲成人动漫av| 男人添女人下部高潮视频在线观看| 日韩最新在线视频| 欧美777四色影| 久久人人爽人人爽人人av| 亚洲精品乱码久久久久久黑人| 免费网站看v片在线a| 欧美多人爱爱视频网站| 欧美日本国产| 国产精品无码专区av在线播放| 色综合久久中文综合久久97| 欧美国产日韩电影| 99热国产免费| 国产女人18水真多18精品一级做| yiren22亚洲综合伊人22| 这里只有精品视频| 国产一区日韩欧美| 色www免费视频| 亚洲精品成人av| 66国产精品| 牛夜精品久久久久久久| 日韩欧美高清一区| 色婷婷一区二区三区| 日韩视频在线视频| 欧美私人免费视频| 四虎884aa成人精品最新| 一区二区不卡在线| 色婷婷综合久久| 大香伊人久久精品一区二区| 一区二区高清视频| 欧美日韩一区高清| 精品一区二区三| 欧美三级在线观看视频| 欧美一三区三区四区免费在线看| 一本色道久久综合亚洲精品酒店| 男人c女人视频| 777久久久精品| 欧美精品一区二区久久| 东京热加勒比无码少妇| 亚洲国产精品va在看黑人| 亚洲蜜桃视频| 91国内精品在线视频| 精品国产一区二区在线| 免费观看成人av| 欧美高清视频| 成人欧美一区二区三区黑人免费| 亚洲婷婷综合色高清在线| 日本一区二区中文字幕| 亚洲精品成人自拍| 欧美一级精品大片| 国产一区二区三区四区三区四| 爱草在线视频| 久久国产精品久久国产精品| 国产一区二区调教| 蜜桃视频动漫在线播放| 色乱码一区二区三在线看| 欧美欧美午夜aⅴ在线观看| 午夜日韩视频| 国产尤物视频在线| av免费观看久久| 色综合久久久久久久久久久| 国产精品一区二区三区av麻| 不卡av免费在线| 欧美激情亚洲另类| 久久久99免费| 日韩成人在线观看视频| 水蜜桃色314在线观看| 中文字幕视频一区二区在线有码| 激情成人午夜视频| 成人av三级| 欧美一级爱爱视频| 伊人伊成久久人综合网小说| 国内国产精品久久| 亚洲一区二区三区四区| 男人天堂av片| 久久久97精品| 久久久久久久久久久久久女国产乱 | 欧美日韩在线一区| 五月婷婷亚洲| 免费在线观看污视频| 成人欧美一区二区三区视频xxx| 色国产综合视频| 免费亚洲婷婷| 国模精品视频| 99在线精品免费视频| 久久久国产影院| 国产人妖乱国产精品人妖| 宅男在线一区| 亚洲欧美一区二区三区在线播放| 北条麻妃高清一区| 欧美另类z0zxhd电影| 日韩中文欧美在线| 亚洲综合在线电影| 亚洲欧美视频二区| 国产中文字幕亚洲| 欧美精品成人一区二区三区四区| 免费高清在线一区| 四虎国产精品成人免费影视| 亚洲一级片网站| 国产精品美女主播| 欧洲精品中文字幕| 韩国av一区二区三区四区| 自拍偷拍亚洲| 一区二区三区性视频| 欧美一二三四五区| 欧美成aaa人片在线观看蜜臀| 亚洲综合男人的天堂|