LlamaIndex的多輪對話引擎使用說明

一、背景

LlamaIndex提供2種交互引擎:查詢引擎和聊天引擎。(詳情請看這里)查詢引擎默認沒有上下文信息,也就是說默認是單輪對話。

在RAG系統中,單輪對話/單次查詢的場景較少,而多輪對話則是最常見的場景,若使用查詢引擎,則需要手動將歷史對話拼接后,傳給查詢引擎。這樣做有很多弊端,

(1)手動拼接歷史消息容易出錯,也不夠優雅;

(2)歷史消息不可能一直無限制的拼接,若超過token最大長度,該如何處理?

(3)如何歷史消息通過接口傳遞,不夠安全;

(4)太多的歷史消息,會導致查詢的準確度降低等。

二、對話引擎

查詢引擎的一種實際應用的場景是每次都對數據與知識提出獨立的問題以獲得答案,不考慮歷史對話記錄,另一種實際應用的場景是需要通過多次對話來滿足使用者的需求,比如客戶連續的產品問答與咨詢。在這種場景中,需要跟蹤過去對話的上下文,以更好地理解與回答當前的問題。由于大模型本質上都是無狀態服務形式的,多次對話是通過攜帶歷史對話記錄來完成的。

?1.使用索引快速構造對話引擎

與查詢引擎類似,也可以使用索引通過簡單的一行代碼構造對話引擎:
    chat_engine = index.as_chat_engine(chat_mode="condense_question")print(chat_engine.chat('陳平安是誰?'))print("--"*40)print(chat_engine.chat('他幾歲了?'))

結果如下:

陳平安是一個自幼失去父母的少年,生活在一個以瓷器聞名的小鎮。他從小就在當地的窯廠做學徒,跟隨一位脾氣不太好的師傅學習燒瓷技藝。盡管生活艱辛,他仍然堅持下來并逐漸掌握了燒瓷的技術。然而,隨著小鎮失去官窯的地位,窯廠被迫關閉,他也失去了生計,只能回到破舊的老宅生活。故事中的他坐在臺階上仰望星空,展現出一種在困境中依然保持希望的形象。
--------------------------------------------------------------------------------
陳平安失去窯廠工作回到老宅時,年齡是十六歲。

從結果上看,“他”被正確的指向到“陳平安”;也就說有上下文了。

2、使用底層 API 組合構造對話引擎

如果需要更精確地控制對話引擎的構造,就要使用底層 API 組合構造。

不同模式的查詢引擎是通過輸入不同的響應生成器來構造的,而不同模式的對話引擎則是直接通過構造不同類型的對話引擎組件完成的。

查詢引擎所依賴的底層組件是檢索器與響應生成器,而對話引擎則通常需要在查詢引擎的基礎上增加記憶等能力而構造。

下面的例子演示了如何構造一個 condense 類型的對話引擎:

custom_prompt = PromptTemplate("""請根據以下的歷史對話記錄和新的輸入問題,重寫一個新的問題,使其能夠捕捉對話中的所有相關上下文。<Chat History> {chat_history} <Follow Up Message> {question} <Standalone question> """)# 歷史對話記錄custom_chat_history = [ChatMessage( role=MessageRole.USER,  content="陳平安是誰?"),ChatMessage(role=MessageRole.ASSISTANT, content="陳平安是一個自幼失去父母的少年,生活在一個以瓷器聞名的小鎮。"),]#先構造查詢引擎, 這里省略了構造 vector_index 對象query_engine = index.as_query_engine()#再構造對話引擎chat_engine = CondenseQuestionChatEngine.from_defaults(query_engine=query_engine, #對話引擎基于查詢引擎構造condense_question_prompt=custom_prompt, #設置重寫問題的Prompt模板chat_history=custom_chat_history, #攜帶歷史對話記錄verbose=True,) resp=chat_engine.chat('他幾歲了?')print(resp)

可以看到,這里的構造方法與使用底層 API 組合構造查詢引擎的方法完全
不同,這里構造的是一種叫 condense_question模式的對話引擎(CondenseQuestionChatEngine)。

這種引擎會查看歷史對話記錄,并將最新的用戶問題重寫成新的、具有更完整語義的問題,然后把這個問題輸入查詢引擎獲得答案。因此可以看到,這種類型的引擎所依賴的組件包括查詢引擎、重寫問題的 Prompt 模板、歷史對話記錄,即from_defaults 方法的參數。

LlamaIndex 框架中,不同類型的對話引擎與其他組件之間的關系如圖所示。?

總的來說,對話引擎在底層所依賴的組件主要有以下 3 種。
(1)LLM:大模型。大模型在對話引擎中的作用并不限于最后輸出問題的答案。比如,在Agent類型的對話引擎中,大模型需要根據歷史對話記錄和任務來規劃與推理出使用的工具;在 Condense類型的對話引擎中,大模型需要根據歷史對話記錄和當前問題來重寫輸入的問題。

(2)Query Engine 或者Retriever:查詢引擎或檢索器。由于查詢引擎本身包含了檢索器與多種不同響應生成模式的響應生成器,因此兩者的區別是,只使用檢索器的對話引擎更簡單,而依賴查詢引擎的對話引擎則支持更加多樣的底層響應生成模式。

(3)Memory:記憶體。這是對話引擎區別于查詢引擎的一個顯著特征。由于對話是一種有“狀態”的服務,因此為了保持這種狀態,需要有相應的組件來記錄與維持狀態信息,也就是歷史對話記錄,而Memory組件就是用于實現這個目的的。

LlamaIndex 框架支持的對話模式( chat_mode )、對應的引擎類型及依賴的 主要組件見表
對話模式引擎類型依賴的主要組件
simpleSimpleChatEngineLLM
condense_questionCondenseQuestionChatEngineQueryEngine, LLM
contextContextChatEngineRetriever, LLM
condense_plus_contextCondensePlusContextChatEngineRetriever, LLM
reactReActAgent[Tool], LLM
openaiOpenAIAgent[Tool], LLM
bestReActAgent 或 OpenAIAgent[Tool], LLM

3、整合Memory組件

Memory使用的說明請看這篇文章。? 對話引擎可以直接使用Memory 。

def complex_memory_cit_test():"""使用帶有記憶功能的對話歷史和自定義 Prompt,結合引用型查詢引擎(CitationQueryEngine),實現帶來源追溯的上下文對話測試。輸出模型回答及其相關片段和元數據,便于溯源。"""# 歷史對話記錄memory= memory_init()memory.put_messages([ChatMessage(role=MessageRole.USER, content="報告期內,公司實現營業收入 63,609.19 萬元,同比增長 4.40%;"),# ChatMessage(role=MessageRole.ASSISTANT,#             content="陳平安是一個自幼失去父母的少年,生活在一個以瓷器聞名的小鎮。他從小就開始在窯場做粗活,跟隨一位脾氣不太好的師傅學習燒瓷技藝。盡管生活艱辛,他仍然堅持努力,逐漸掌握了燒瓷的一些技巧。然而,隨著小鎮失去官窯的地位,窯場被迫關閉,他也失去了生計,只能回到破舊的老宅獨自生活。他性格堅韌,面對困境依然保持著對生活的希望。"),])#先構造查詢引擎citation_query_engine = CitationQueryEngine.from_args(index,similarity_top_k=3,citation_chunk_size=512)#再構造對話引擎chat_engine = CondenseQuestionChatEngine.from_defaults(query_engine=citation_query_engine,condense_question_prompt=custom_prompt,memory=memory,verbose=True,)print("--"*40)resp=chat_engine.chat('請將該數值轉成以元單位') #print(resp.response)  # LLM 輸出回答print("------來源---------------")for node in resp.source_nodes:print("相關片段:", node.text)print("片段分數:", node.score)print("片段元數據:", node.metadata)# print(f"node.metadata:{node.metadata}")print("=" * 40)if __name__ == "__main__":complex_memory_cit_test()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87332.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CSS-14.1-全局樣式表common.css】構建高效可維護的 common.css:現代前端CSS架構指南

在前端開發中&#xff0c;CSS管理一直是項目可維護性的關鍵挑戰。據統計&#xff0c;約35%的樣式問題源于缺乏統一的CSS架構規范。common.css&#xff08;或稱全局樣式表&#xff09;作為項目的基礎樣式層&#xff0c;能夠有效解決以下問題&#xff1a; 樣式碎片化&#xff1a…

laravel基礎:php artisan make:model Flight --all 詳解

在 Laravel 中執行命令: php artisan make:model Flight --all這個命令會為你創建與模型 Flight 相關的一整套文件結構。Laravel 的 Artisan 命令行工具是一個強大的代碼生成器,可以幫助你快速生成常見的應用組件。我們來詳細解析一下這個命令的各個部分以及它產生的效果。 …

poi java 刪除word的空白頁

開發的時候遇到的問題&#xff0c;特此記錄一下 使用Apache POI&#xff08;Java庫&#xff09;刪除Word文檔中的空白頁時&#xff0c;需針對不同場景處理。以下是具體實現方法和代碼示例&#xff1a; 基礎刪除&#xff08;段落/分頁符&#xff09;? 通過刪除多余段落標記或…

獲取Android應用日志教程

ADB&#xff0c;全稱為Android Debug Bridge&#xff0c;是Android開發中一個重要的命令行工具。它用于與Android設備進行通信&#xff0c;提供了多種功能來幫助開發者進行調試和應用管理。 一、環境準備 1.PC下載附件中的安裝包。 2.在設備上啟用開發者選項和 USB 調試 在安卓…

【Axum】Rust Web 高效構建:Axum 框架從入門到精通指南

目錄 一、環境準備與項目創建1.1 安裝 Rust 工具鏈1.2 創建項目并添加依賴 二、Axum 核心架構解析三、項目結構設計四、核心代碼實現4.1 應用入口 (src/main.rs)4.2 數據模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 認證服務 (src/services/auth.rs)4.5 用戶處理器 (…

康謀分享 | 基于多傳感器數據的自動駕駛仿真確定性驗證

目錄 01 引言 02 隨機性的前因與后果 03 確定性的驗證——以aiSim為例 1、傳感器選型與配置 2、場景與方法 3、驗證結果 04 總結 01 引言 隨著自動駕駛技術的飛速發展&#xff0c;仿真測試已成為替代成本高昂且充滿風險的道路測試的關鍵環節。它能夠在虛擬環境中模擬…

FASTAPI+VUE3平價商貿管理系統

一、項目概述 PJMall 是一個基于 FastAPI 構建的商城管理系統后端服務&#xff0c;提供商品管理、訂單處理、用戶認證等核心功能。系統采用分層架構設計&#xff0c;支持高并發訪問&#xff0c;適用于多角色用戶&#xff08;管理員、客戶、供應商&#xff09;。 核心特性 &a…

客服機器人知識庫怎么搭?智能客服機器人3種方案深度對比(含零售落地案例)

一、知識庫技術缺陷的權威數據 IDC 2025報告&#xff1a;89%企業因知識庫更新延遲導致智能客服機器人解決率下降40%&#xff0c;傳統規則引擎日均失效對話超2000次。 二、三大技術方案架構解析 1.LLM動態知識圖譜方案 基于Transformer架構實時抓取政策/價格數據 知識關聯度…

JavaScript 性能優化實戰:減少 DOM 操作引發的重排與重繪

在前端開發中&#xff0c;DOM 操作是 JavaScript 性能優化的核心痛點之一。頻繁的 DOM 操作會觸發瀏覽器的 重排&#xff08;Reflow&#xff09; 和 重繪&#xff08;Repaint&#xff09;&#xff0c;導致性能顯著下降。本文將深入分析這一瓶頸&#xff0c;并通過實際案例展示優…

力扣 hot100 Day33

24. 兩兩交換鏈表中的節點 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能進行節點交換&#xff09;。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,開啟控件AI新時代

WinForms Controls v25.1 AI 驅動的語義搜索 我們的 WinForms 數據網格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增強的搜索體驗&#xff0c;使用戶能夠更快/更準確地在大型數據集中查找相關數據。與基于關鍵字的標準搜索不同&#xff0c;語義搜索利用自然語言處理 &…

【分層圖 虛擬節點】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知識點 C圖論 P11327 [NOISG 2022 Finals] Voting Cities 題目描述 你所在的國家的國家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 將要退休了&#xff01;他希望選擇他的一個兒子作為他的繼承人&#xff0c;出于各方面因素的考慮&#xff0c;他決定進行…

Web3云服務商安全性怎么選

Web3安全之錨&#xff1a;為何阿里云是企業級應用的首選? 隨著Web3、去中心化金融&#xff08;DeFi&#xff09;和數字資產的浪潮席卷全球&#xff0c;無數開發者和企業涌入這個充滿機遇的新賽道。然而&#xff0c;機遇背后是同樣巨大的安全挑戰。從智能合約漏洞到大規模DDoS…

uniapp加上全局水印

文章目錄 一、效果圖二、創建watermark.js文件三、在main.js中引入四、運行 前言&#xff1a;uniapp頁面加水印你還在傻乎乎的一個個頁面加嗎&#xff0c;今天教你一招&#xff0c;一步到位 一、效果圖 未登錄效果 登錄后效果 二、創建watermark.js文件 這里的水印因為我…

thinkphp8.0七牛云直傳圖片

環境&#xff1a;tp8\php8.3; 服務器&#xff1a;centOS Stream 9; 場景&#xff1a;通過html頁面直傳七牛云服務器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全國開發大賽正式啟動

從2023年開始&#xff0c;Godot Hub 每年舉辦一次 Godot Hub Festival 開發大賽&#xff0c;現已成為國內 Godot 社區規模最大的開發比賽。本屆 Godot Hub Festival 2025將與 OpenAtom openKylin 開源社區合作舉辦&#xff0c;定名為 Godot x openKylin 全國開發大賽&#xff0…

工控機Linux修改網口

修改Ip:sudo nmcli connection modify net1-static ipv4.addresses 192.168.200.225/24 修改dns:sudo nmcli connection modify net1-static ipv4.dns 114.114.114.114 修改網關:sudo nmcli connection modify net1-static ipv4.gateway 192.168.200.1 IP生效&#xff1a;nm…

CRMEB Pro版v3.3源碼全開源+PC端+Uniapp前端+搭建教程

一.介紹 crmeb Pro版 v3.3版本正式發布&#xff0c;全新UI重磅上線&#xff0c;煥然一新&#xff0c;不負期待&#xff01;頁面DIY設計功能全面升級&#xff0c;組件更豐富&#xff0c;樣式設計更全面&#xff1b;移動端商家管理&#xff0c;讓商城管理更便捷&#xff0c;還從…

【python】OOP:Object-Oriented Programming

文章目錄 1. 面向對象編程的核心概念1.1 類與對象的關系1.2 封裝&#xff08;Encapsulation&#xff09; 2. 繼承與多態2.1 繼承機制2.2 多重繼承2.3 多態性 3. 特殊方法與運算符重載4. 抽象類與接口4.1 抽象基類 5. 組合與聚合6. 屬性管理6.1 使用property裝飾器6.2 描述符協議…

蒙特卡洛方法:隨機抽樣的藝術與科學

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 蒙特卡洛算法&#xff08;Monte Carlo Method&#xff09;是一類基于隨…