(附實現代碼)Step-Back 回答回退策略擴大檢索范圍

1. LangChain 少量示例提示模板

在與 LLM 的對話中,提供少量的示例被稱為 少量示例,這是一種簡單但強大的指導生成的方式,在某些情況下可以顯著提高模型性能(與之對應的是零樣本),少量示例可以降低 Prompt 的復雜度,快速告知 LLM 生成內容的規范。

資料推薦

  • 💡大模型中轉API推薦
  • ?中轉使用教程
  • ?模型優惠查詢

LangChain 中,針對少量示例也封裝對應的提示模板——FewShotPromptTemplate,這個提示模板只需要傳遞 示例列表 與 示例模板 即可快速構建 少量示例提示模板,使用示例如下:

import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_openai import ChatOpenAIdotenv.load_dotenv()# 1.構建示例模板與示例
examples = [{"question": "幫我計算下2+2等于多少?", "answer": "4"},{"question": "幫我計算下2+3等于多少?", "answer": "5"},{"question": "幫我計算下20*15等于多少?", "answer": "300"},
]
example_prompt = ChatPromptTemplate.from_messages([("human", "{question}"),("ai", "{answer}"),
])# 2.構建少量示例提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(example_prompt=example_prompt,examples=examples,
)
print("少量示例模板:", few_shot_prompt.format())# 3.構建最終提示模板
prompt = ChatPromptTemplate.from_messages([("system", "你是一個可以計算復雜數學問題的聊天機器人"),few_shot_prompt,("human", "{question}"),
])# 4.創建大語言模型與鏈
llm = ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0)
chain = prompt | llm | StrOutputParser()# 5.調用鏈獲取結果
print(chain.invoke("幫我計算下14*15等于多少"))

輸出內容:

少量示例模板: Human: 幫我計算下2+2等于多少?
AI: 4
Human: 幫我計算下2+3等于多少?
AI: 5
Human: 幫我計算下20*15等于多少?
AI: 300
210

少量示例提示模板 在底層會根據傳遞的 示例模板 與 示例 格式化對應的 消息列表 或者 字符串,從而將對應的示例參考字符串信息添加到完整的提示模板中,簡化了 Prompt 編寫的繁瑣程度。

對于聊天模型可以使用 FewShotChatMessagePromptTemplate,而文本補全基座模型可以使用 FewShotPromptTemplate

2. Step-Back 回答回退策略的優點

對于一些復雜的問題,除了使用 問題分解 來得到子問題亦或者依賴問題,還可以為復雜問題生成一個前置問題,通過前置問題來執行相應的檢索,這就是 Setp-Back 回答回退策略(后退提示),這是一種用于增強語言模型的推理和問題解決能力的技巧,它鼓勵 LLM 從一個給定的問題或問題后退一步,提出一個更抽象、更高級的問題,涵蓋原始查詢的本質。

概念來源:https://arxiv.org/pdf/2310.06117.pdf

后退提示背后的概念是,許多復雜的問題或任務包含很多復雜的細節和約束,這使 LLM 難以直接檢索和應用相關信息。通過引入一個后退問題,這個問題通常更容易回答,并且圍繞一個更廣泛的概念或原則,讓 LLM 可以更有效地構建它們的推理。
資料推薦

  • 💡大模型中轉API推薦
  • ?中轉使用教程
  • ?模型優惠查詢

Step-Back 回答回退策略的運行流程也非常簡單,構建一個 少量示例提示模板,讓 LLM 根據傳遞的問題生成一個后退問題,使用 后退問題 執行相應的檢索,利用檢索到的文檔+原始問題執行 RAG 索引增強生成,運行流程如下:在這里插入圖片描述
LangChain 中并沒有封裝好的 回答回退策略檢索器,所以可以執行相應的封裝,實現一個自定義檢索器,實現代碼如下:

from typing import Listimport dotenv
import weaviate
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from langchain_core.language_models import BaseLanguageModel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_core.retrievers import BaseRetriever
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()class StepBackRetriever(BaseRetriever):"""回答回退檢索器"""retriever: BaseRetrieverllm: BaseLanguageModeldef _get_relevant_documents(self, query: str, *, run_manager: CallbackManagerForRetrieverRun) -> List[Document]:"""根據傳遞的query執行問題回退并檢索"""# 1.構建少量提示模板examples = [{"input": "慕課網上有關于AI應用開發的課程嗎?", "output": "慕課網上有哪些課程?"},{"input": "慕小課出生在哪個國家?", "output": "慕小課的個人經歷是怎樣的?"},{"input": "司機可以開快車嗎?", "output": "司機可以做什么?"},]example_prompt = ChatPromptTemplate.from_messages([("human", "{input}"),("ai", "{output}")])few_show_prompt = FewShotChatMessagePromptTemplate(examples=examples,example_prompt=example_prompt,)# 2.構建生成回退問題提示system_prompt = "你是一個世界知識的專家。你的任務是回退問題,將問題改述為更一般或者前置問題,這樣更容易回答,請參考示例來實現。"prompt = ChatPromptTemplate.from_messages([("system", system_prompt),few_show_prompt,("human", "{question}")])# 3.構建生成回退問題的鏈chain = ({"question": RunnablePassthrough()}| prompt| self.llm| StrOutputParser()| self.retriever)return chain.invoke(query)# 1.構建向量數據庫與檢索器
db = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://mbakeruerziae6psyex7ng.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("ZltPVa9ZSOxUcfafelsggGyyH6tnTYQYJvBx"),),index_name="DatasetDemo",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)
retriever = db.as_retriever(search_type="mmr")# 2.創建回答回退檢索器
step_back_retriever = StepBackRetriever(retriever=retriever,llm=ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0),
)# 3.檢索文檔
documents = step_back_retriever.invoke("人工智能會讓世界發生翻天覆地的變化嗎?")
print(documents)
print(len(documents))

輸出內容:

[Document(metadata={'source': './項目API文檔.md', 'start_index': 5818.0}, page_content='json { "code": "success", "data": { "list": [ { "id": "1550b71a-1444-47ed-a59d-c2f080fbae94", "conversation_id": "2d7d3e3f-95c9-4d9d-ba9c-9daaf09cc8a8", "query": "能詳細講解下LLM是什么嗎?", "answer": "LLM 即 Large Language Model,大語言模型,是一種基于深度學習的自然語言處理模型,具有很高的語言理解和生成能力,能夠處理各式各樣的自然語言任務,例如文本生成、問答、翻譯、摘要等。它通過在大量的文本數據上進行訓練,學習到語言的模式、結構和語義知識'), Document(metadata={'source': './項目API文檔.md', 'start_index': 6359.0}, page_content='1.7 [todo]刪除特定的調試消息\n\n接口說明:用于刪除 AI 應用調試對話過程中指定的消息,該刪除會在后端執行軟刪除操作,并且只有當會話 id 和消息 id 都匹配上時,才會刪除對應的調試消息。\n\n接口信息:授權+POST:/apps/:app_id/messages/:message_id/delete\n\n接口參數:\n\n請求參數:\n\napp_id -> uuid:路由參數,需要刪除消息歸屬的應用 id,格式為 uuid。\n\nmessage_id -> uuid:路由參數,需要刪除的消息 id,格式為 uuid。\n\n請求示例:\n\njson { "app_id": "1550b71a-1444-47ed-a59d-c2f080fbae94", "message_id": "2d7d3e3f-95c9-4d9d-ba9c-9daaf09cc8a8" }\n\n響應示例:\n\njson { "code": "success", "data": {}, "message": "刪除調試信息成功" }'), Document(metadata={'source': './項目API文檔.md', 'start_index': 490.0}, page_content='帶有分頁數據的接口會在 data 內固定傳遞 list 和 paginator 字段,其中 list 代表分頁后的列表數據,paginator 代表分頁的數據。\n\npaginator 內存在 4 個字段:current_page(當前頁數) 、page_size(每頁數據條數)、total_page(總頁數)、total_record(總記錄條數),示例數據如下:'), Document(metadata={'source': './項目API文檔.md', 'start_index': 2042.0}, page_content='dialog_round -> int:攜帶上下文輪數,類型為非負整型。\n\nmemory_mode -> string:記憶類型,涵蓋長記憶 long_term_memory 和 none 代表無。\n\nstatus -> string:應用配置的狀態,drafted 代表草稿、published 代表已發布配置。\n\nupdated_at -> int:應用配置的更新時間。\n\ncreated_at -> int:應用配置的創建時間。\n\nupdated_at -> int:應用的更新時間。\n\ncreated_at -> int:應用的創建時間。\n\n響應示例:')]
4

對比 問題分解策略,回答回退策略 僅僅多調用一次 LLM,所以相應速度更快,性能更高,并且復雜度更低,對于一些參數量較小的模型,也可以實現不錯的效果,對于 問題分解策略-迭代式回答,再一些極端的情況下,模型輸出了有偏差的內容,每次都在有偏差的 問題+答案 生成新內容,很有可能會導致最后的輸出完全偏離開始的預設。

就像早些年很火的 谷歌翻譯將同一句話翻譯20次,輸出的內容就完全偏離了原來的預設:

原文:呂布拜義父。
使用谷歌翻譯20次后:在這個世界上,還有很多兒子等著我去當。

本質上就是因為無論是 谷歌翻譯 還是 LLM大語言模型,執行轉換操作時,信息產生了丟失,并且隨著迭代的增加,信息丟失得越來越多。

資料推薦

  • 💡大模型中轉API推薦
  • ?中轉使用教程
  • ?模型優惠查詢

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

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

相關文章

16-Oracle 23 ai-JSON-Relational Duality-知識準備

一直做DBA的小伙伴,是不是對開發相對陌生一些。JSON 關系二元性是 Oracle Database 23ai 中重要的特性,同時帶來的是范式革命。JSON關系二元性解決了數據庫領域的根本矛盾?,結構化數據的嚴謹性與半結構化數據的靈活性之間的矛盾。 JSON Rela…

什么是預訓練?深入解讀大模型AI的“高考集訓”

1. 預訓練的通俗理解:AI的“高考集訓” 我們可以將預訓練(Pre-training) 形象地理解為大模型AI的“高考集訓”。就像學霸在高考前需要刷五年高考三年模擬一樣,大模型在正式誕生前,也要經歷一場聲勢浩大的“題海戰術”…

思爾芯攜手Andes晶心科技,加速先進RISC-V 芯片開發

在RISC-V生態快速發展和應用場景不斷拓展的背景下,芯片設計正面臨前所未有的復雜度挑戰。近日,RISC-V處理器核領先廠商Andes晶心科技與思爾芯(S2C)達成重要合作,其雙核單集群AX45MPV處理器已在思爾芯最新一代原型驗證系…

vscode配置lua

官網下載lua得到如下 打開vscode的擴展下載如下三個 打開vscode的此處設置 搜索 executorMap,并添加如下內容

理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合檢索增強生成系統

目錄 理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合檢索增強生成系統 一、什么是 Hybrid RAG? 二、什么是 RAG_HYBRID_BM25_WEIGHT? 三、參數設置示例 四、什么時候該調整它? 五、實戰建議 六、總結 理解 RAG_HYBRID_BM25…

Spring Boot 2 中 default-autowire 的使用

Spring Boot 2 中 default-autowire 的使用 在 Spring Boot 2 中,default-autowire 這個來自傳統 XML 配置的概念仍然存在,但它的使用已經大大減少,因為現代 Spring Boot 應用主要使用注解驅動的配置方式。 default-autowire 在 Spring Boo…

Spring Boot + Thymeleaf 防重復提交

在 Spring Boot 與 Thymeleaf 結合的 Web 應用中,防止重復提交可以采用token 機制 客戶端禁用按鈕的方式實現,在高并發場景下,考慮使用 Redis 存儲 token 而非 Session。 第一步:后端實現 Controller public class FormControl…

【20250607接單】Spark + Scala + IntelliJ 項目的開發環境配置從零教學

本教程適用于零基礎、一臺剛裝好 Windows 的全新電腦開始,搭建能運行 Spark Scala IntelliJ 項目的開發環境。以下是超詳細、小白級別逐步教程,從“下載什么”到“點擊哪里”都幫你列清楚。 🎯 目標 操作系統:Windows10/11工具…

【ubuntu】虛擬機安裝配置,sh腳本自動化,包含 apt+時間同步+docker+mysql+redis+pgsql

可以說是ubuntu基礎環境搭建合集,個人學習用,使用sh一鍵安裝,避免復制各種命令 流程主要包括 0. 可選擇不同ubuntu版本對應安裝(支持 Ubuntu 20.04/22.04/23.04/24.04) 1. apt換源aliyun 2. 時間選擇上海時區&#x…

Rust 學習筆記:關于智能指針的練習題

Rust 學習筆記:關于智能指針的練習題 Rust 學習筆記:關于智能指針的練習題問題一問題二問題三問題四問題五問題六問題七問題八問題九問題十問題十一 Rust 學習筆記:關于智能指針的練習題 參考視頻: https://www.bilibili.com/vi…

JavaScript ES6 解構:優雅提取數據的藝術

JavaScript ES6 解構:優雅提取數據的藝術 在 JavaScript 的世界中,ES6(ECMAScript 2015)的推出為開發者帶來了許多革命性的特性,其中“解構賦值”(Destructuring Assignment)無疑是最受歡迎的功…

Shell 命令及運行原理 + 權限的概念(7)

文章目錄 Shell 命令以及運行原理(4-1.22.08)Linux權限的概念1. 什么是權限2. 認識人(普通用戶,root用戶)以及兩種用戶的切換認識普通用戶和root用戶兩種用戶之間的切換指令提權 3. 文件的屬性解析 權限屬性指令ll顯示…

以智能管理為基礎,樓宇自控打造建筑碳中和新路徑

在全球氣候變化的嚴峻形勢下,“碳中和”已成為各國發展的重要戰略目標。建筑行業作為能源消耗與碳排放的“大戶”,其運行階段的能耗占全社會總能耗近40%,碳排放占比與之相當,實現建筑碳中和迫在眉睫。傳統建筑管理模式下&#xff…

Python爬蟲實戰:研究Hyper 相關技術

一、項目概述 本項目展示了如何結合 Python 的異步編程技術與 Hyper 框架開發一個高性能、可擴展的網絡爬蟲系統。該系統不僅能夠高效地爬取網頁內容,還提供了 RESTful API 接口,方便用戶通過 API 控制爬蟲的運行狀態和獲取爬取結果。 二、系統架構設計 1. 整體架構 系統采…

html 滾動條滾動過快會留下邊框線

滾動條滾動過快時,會留下邊框線 但其實大部分時候是這樣的,沒有多出邊框線的 滾動條滾動過快時留下邊框線的問題通常與滾動條樣式和滾動行為有關。這種問題可能出現在使用了自定義滾動條樣式的情況下。 注意:使用方法 6 好使,其它…

【Linux】Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法

Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法 對于標準的 Ubuntu(使用 GNOME 桌面),desktop 后綴的桌面圖標文件主要保存在以下三個路徑: 當前用戶的桌面目錄(這是最常見的位置)。所…

【自然語言處理】大模型時代的數據標注(主動學習)

文章目錄 A 論文出處B 背景B.1 背景介紹B.2 問題提出B.3 創新點 C 模型結構D 實驗設計E 個人總結 A 論文出處 論文題目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models發表情況:2023-EMNLP作者單位:浙江大…

【論文解讀】DeepSeek-R1

文章目錄 概覽一、DeepSeek-R1-Zero:在 Base Model 上直接進行 RL(一)強化學習算法(二)獎勵模型(三)數據構造(四)DeepSeek-R1-Zero 的性能、自我進化過程和 Aha Moment1.…

巴西醫療巨頭尤邁Kafka數據泄露事件的全過程分析與AI安防策略分析

一、事件背景與主體信息 涉事主體:Unimed,全球最大醫療合作社,巴西醫療行業龍頭企業,擁有約1500萬客戶。技術背景:泄露源于其未保護的Kafka實例(開源實時數據傳輸平臺),用于客戶與聊天機器人“Sara”及醫生的實時通信。二、時間線梳理 時間節點關鍵事件描述2025年3月24…

軟信天成:數據驅動型背后的人工智能,基于機器學習的數據管理

在數字化轉型浪潮中,當代企業如同逆水行舟,不進則退。無數企業希望通過數字化轉型捕獲全新的市場機遇,改善財政狀況,在未來市場競爭中占據一席之地。要想獲得成功的數字化轉型,關鍵因素在于具備可靠、及時的數據用以支…