RAG實戰指南 Day 24:上下文構建與提示工程

【RAG實戰指南 Day 24】上下文構建與提示工程

文章內容

開篇

歡迎來到"RAG實戰指南"系列的第24天!今天我們將深入探討RAG系統中至關重要的上下文構建與提示工程技術。在檢索增強生成系統中,如何有效地組織檢索到的文檔片段,并將其轉化為適合大語言模型(LLM)處理的提示,直接決定了最終生成結果的質量。本文將系統講解上下文構建的最佳實踐和高級提示工程技術,幫助您構建更精準、更可靠的RAG應用。

理論基礎

關鍵概念

  1. 上下文窗口:LLM能夠同時處理的最大文本長度,不同模型有不同限制
  2. 提示工程:設計輸入提示以引導模型產生期望輸出的技術
  3. 上下文相關性:檢索內容與用戶查詢的語義匹配程度
  4. 信息密度:單位文本中包含的有價值信息量

核心挑戰

  1. 如何從檢索結果中選擇最具信息量的片段
  2. 如何組織多個文檔片段以避免信息沖突
  3. 如何設計提示模板使LLM充分利用上下文
  4. 如何平衡上下文長度和信息密度

技術解析

1. 上下文構建策略
策略名稱核心思想適用場景
截斷法保留最相關的前N個token簡單查詢,上下文有限
滑動窗口重疊分塊保留邊界信息長文檔連續信息提取
層次聚合先提取關鍵句再擴展上下文需要保持文檔結構
動態融合根據查詢動態重組片段復雜多文檔查詢
2. 提示工程設計模式
from typing import List, Dict
from pydantic import BaseModelclass Document(BaseModel):content: strmetadata: Dict[str, str]relevance_score: floatclass PromptBuilder:def __init__(self, system_prompt: str):self.system_prompt = system_promptself.context_token_limit = 4000  # 假設模型上下文窗口為4kdef build_prompt(self, query: str, documents: List[Document]) -> str:"""構建RAG提示的核心方法"""# 1. 上下文選擇與截斷selected_context = self._select_context(documents)# 2. 構建結構化提示prompt = f"""{self.system_prompt}### 背景知識:{selected_context}### 用戶問題:{query}### 回答要求:- 僅基于提供的背景知識回答- 如果信息不足請回答"根據現有信息無法確定"- 保持專業、準確的語氣"""return promptdef _select_context(self, documents: List[Document]) -> str:"""選擇最相關的上下文片段"""# 按相關性排序sorted_docs = sorted(documents, key=lambda x: x.relevance_score, reverse=True)selected_texts = []current_length = 0for doc in sorted_docs:doc_length = len(doc.content.split())  # 簡單以詞數計算if current_length + doc_length <= self.context_token_limit:selected_texts.append(f"來源: {doc.metadata.get('source', '未知')}\n內容: {doc.content}")current_length += doc_lengthelse:breakreturn "\n\n".join(selected_texts)
3. 高級提示技術
  1. 多輪提示:將復雜問題分解為多個子問題
  2. 自洽性檢查:要求模型驗證自己的回答
  3. 思維鏈:引導模型展示推理過程
  4. 模板變量:動態插入上下文片段
class AdvancedPromptBuilder(PromptBuilder):def build_analytic_prompt(self, query: str, documents: List[Document]) -> str:"""構建帶有分析過程的提示"""context = self._select_context(documents)prompt = f"""{self.system_prompt}請按照以下步驟分析問題:1. 理解問題: "{query}"2. 分析相關背景知識: {context}3. 逐步推理得出結論4. 驗證結論的合理性請按上述步驟給出最終答案,并標注每個步驟的思考過程。"""return promptdef build_multi_turn_prompt(self, conversation: List[Dict], documents: List[Document]) -> str:"""構建多輪對話提示"""context = self._select_context(documents)# 構建對話歷史history = "\n".join([f"{msg['role']}: {msg['content']}" for msg in conversation[:-1]])current_query = conversation[-1]['content']prompt = f"""{self.system_prompt}對話歷史:{history}當前問題: {current_query}相關背景:{context}請基于以上信息繼續對話。"""return prompt

代碼實現

完整實現一個支持多種提示策略的RAG上下文處理器:

import re
from typing import List, Optional
from rank_bm25 import BM25Okapiclass ContextProcessor:def __init__(self, chunk_size: int = 500, chunk_overlap: int = 50):self.chunk_size = chunk_sizeself.chunk_overlap = chunk_overlapdef split_text(self, text: str) -> List[str]:"""基礎文本分塊"""words = text.split()chunks = []start = 0while start < len(words):end = min(start + self.chunk_size, len(words))chunk = " ".join(words[start:end])chunks.append(chunk)start = end - self.chunk_overlapreturn chunksdef rerank_by_query(self, query: str, documents: List[str]) -> List[float]:"""基于查詢對文檔片段重新排序"""tokenized_docs = [doc.split() for doc in documents]tokenized_query = query.split()bm25 = BM25Okapi(tokenized_docs)scores = bm25.get_scores(tokenized_query)return scoresdef build_context(self,query: str,documents: List[str],strategy: str = "simple",max_length: int = 4000) -> str:"""根據策略構建上下文"""if strategy == "simple":return self._simple_context(query, documents, max_length)elif strategy == "analytical":return self._analytical_context(query, documents, max_length)else:raise ValueError(f"未知策略: {strategy}")def _simple_context(self, query: str, documents: List[str], max_length: int) -> str:"""簡單拼接策略"""current_length = 0selected = []for doc in documents:doc_length = len(doc.split())if current_length + doc_length <= max_length:selected.append(doc)current_length += doc_lengthelse:remaining = max_length - current_lengthif remaining > 100:  # 至少保留有意義的片段selected.append(" ".join(doc.split()[:remaining]))breakreturn "\n".join(selected)def _analytical_context(self, query: str, documents: List[str], max_length: int) -> str:"""分析型上下文構建"""# 1. 提取關鍵句key_sentences = []for doc in documents:sentences = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s', doc)for sent in sentences:if len(sent.split()) > 10:  # 忽略過短句子key_sentences.append(sent)# 2. 重排序scores = self.rerank_by_query(query, key_sentences)scored_sents = sorted(zip(key_sentences, scores), key=lambda x: x[1], reverse=True)# 3. 構建上下文selected = []current_length = 0for sent, score in scored_sents:sent_length = len(sent.split())if current_length + sent_length <= max_length:selected.append(f"[相關性: {score:.2f}] {sent}")current_length += sent_lengthreturn "\n".join(selected)# 單元測試
if __name__ == "__main__":processor = ContextProcessor()# 測試數據docs = ["深度學習是機器學習的分支,專注于使用深度神經網絡。","Transformer模型是當前最先進的NLP架構,基于自注意力機制。","BERT是一種預訓練的Transformer模型,廣泛用于各種NLP任務。","RAG系統結合了檢索和生成技術,提升大語言模型的準確性。"]query = "什么是BERT模型?"print("=== 簡單上下文 ===")print(processor.build_context(query, docs, "simple", 100))print("\n=== 分析型上下文 ===")print(processor.build_context(query, docs, "analytical", 150))

案例分析:法律咨詢RAG系統

業務場景
為律師事務所構建智能法律咨詢系統,需要從大量法律文檔中檢索相關信息并生成準確回答。

挑戰

  1. 法律文本復雜冗長
  2. 需要精確引用相關法條
  3. 回答必須嚴謹無歧義

解決方案

  1. 使用分析型上下文構建策略
  2. 設計專業法律提示模板
  3. 實現引用溯源功能
class LegalPromptBuilder:def __init__(self):self.system_prompt = """你是一位專業法律AI助手,請嚴格按照以下要求回答問題:1. 只基于提供的法律條文和判例回答2. 明確標注引用來源(條款號/判例編號)3. 如無明確依據,應回答"需要進一步法律分析"4. 避免任何主觀解釋或推測"""def build_legal_prompt(self, query: str, contexts: List[Dict]) -> str:"""構建法律專業提示"""context_str = ""for ctx in contexts:context_str += f"【{ctx['source']}{ctx['content']}\n\n"return f"""{self.system_prompt}### 相關法律依據:{context_str}### 咨詢問題:{query}### 回答格式要求:1. 法律定性2. 適用條款3. 相關判例(如有)4. 結論"""# 使用示例
if __name__ == "__main__":builder = LegalPromptBuilder()legal_contexts = [{"source": "民法典第584條","content": "當事人一方不履行合同義務或者履行合同義務不符合約定,給對方造成損失的...",},{"source": "(2022)最高法民終123號","content": "關于合同違約金的計算標準,應當綜合考慮實際損失和合同履行情況...",}]query = "合同違約后如何計算賠償金額?"prompt = builder.build_legal_prompt(query, legal_contexts)print(prompt)

優缺點分析

優勢

  1. 顯著提升生成結果的相關性和準確性
  2. 減少LLM的幻覺問題
  3. 支持復雜問題的分步解答
  4. 可適應不同領域的專業要求

局限性

  1. 提示設計需要領域專業知識
  2. 復雜提示可能增加計算成本
  3. 對上下文質量高度依賴
  4. 需要針對不同模型調整策略

總結

今天我們深入探討了RAG系統中的上下文構建與提示工程技術:

  1. 學習了多種上下文構建策略及其適用場景
  2. 實現了完整的提示構建器類,支持多種高級技術
  3. 分析了法律咨詢系統的實際案例
  4. 討論了不同技術的優缺點

核心技術要點

  • 上下文選擇比數量更重要
  • 結構化提示顯著提升生成質量
  • 領域特定的提示設計是關鍵
  • 多輪和分步提示適合復雜問題

實踐建議

  1. 從簡單策略開始逐步優化
  2. 針對領域特點定制提示模板
  3. 建立提示版本控制系統
  4. 持續監控生成質量

明天我們將探討【Day 25: 響應生成策略與幻覺減少】,學習如何優化RAG系統的最終輸出質量,減少錯誤信息生成。

參考資料

  1. Prompt Engineering Guide
  2. Advanced RAG Techniques
  3. LegalAI Applications
  4. Context Management in LLMs

文章標簽

RAG, Retrieval-Augmented Generation, Prompt Engineering, Context Management, NLP

文章簡述

本文是"RAG實戰指南"系列的第24篇,深入講解檢索增強生成系統中的上下文構建與提示工程技術。文章系統介紹了多種上下文組織策略、高級提示設計模式,并提供了完整的Python實現代碼。通過法律咨詢系統的實際案例,展示了如何將這些技術應用于專業領域。讀者將學習到如何優化RAG系統的上下文利用率、設計有效的提示模板,以及平衡信息密度與生成質量。本文內容既有理論深度又有實踐價值,提供的代碼可直接集成到現有RAG系統中。

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

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

相關文章

AWD的攻擊和防御手段

一、AWD相關介紹 AWD&#xff08;Attack With Defence&#xff09;是 CTF 線下賽中最接近真實攻防場景、觀賞性和對抗性最強的賽制之一。 賽制本質 人人對抗&#xff1a;所有戰隊互為攻擊者與防守者。 零和記分&#xff1a;你拿到的每一分都是別人的失分&#xff0c;總積分恒…

泛微OA8前臺SQL注入

漏洞URL&#xff1a; http://106.15.190.147/js/hrm/getdata.jsp?cmdgetSelectAllId&sql***注入點 在getdata.jsp中&#xff0c;直接將request對象交給 weaver.hrm.common.AjaxManager.getData(HttpServletRequest, ServletContext) : 方法處理 在getData方法中&#xff0…

Android 藍牙學習

在Android中&#xff0c;進行藍牙設備掃描startDiscovery需要申請位置權限&#xff0c;但有的時候并不需要申請位置權限&#xff0c;就有了android:usesPermissionFlags"neverForLocation"&#xff0c;設置這個就不用申請位置權限來進行藍牙掃描。 android:usesPerm…

Earth靶機攻略

一.環境準備 1.1Earth靶機環境準備 首先將我們解壓好的的Earth.ova放入虛擬機里&#xff0c;并配置環境 將網絡連接換成NET連接 二.信息搜集 2.1ip搜集 2.1.1使用netdiscover命令掃描靶機的ip地址,發現地址為192.168.182.137 2.2端口掃描 2.2.1使用nmap工具對目標機進行端…

java8 List常用基本操作(去重,排序,轉換等)

參考簡述網址: java8 List 根據對象某個字段或多個字段去重、篩選、List轉Map、排序、分組、統計計數等等 list簡單方法示例如下&#xff1a; 一、先定義一個訂單對象&#xff08;Order&#xff09; public class Order {private Long id;private Long userId;private Strin…

【linux】HAProxy七層代理

HAPorxy簡介HAProxy&#xff08;High Availability Proxy&#xff09;是一款高性能、開源的負載均衡器與反向代理服務器&#xff0c;主要用于 TCP 和 HTTP 協議的流量分發&#xff0c;廣泛應用于高并發、高可用的網絡架構中核心特性超高性能與低資源消耗基于單進程、多線程模型…

Android 的16 KB內存頁設備需要硬件支持嗎,還是只需要手機升級到Android15系統就可以

Android 的16 KB內存頁設備需要硬件支持嗎&#xff0c;還是只需要手機升級到Android15系統就可以&#xff1f; deepseek回答&#xff1a; DeepSeek R1 思考 3 秒 思考過程 好的&#xff0c;用戶現在問的是Android的16 KB內存頁設備是否需要硬件支持&#xff0c;還是只需要升級到…

相機內外參矩陣:從3D世界坐標到2D像素坐標變換

相機內外參矩陣&#xff1a;從3D世界坐標到2D像素坐標變換介紹**1. 內參矩陣&#xff08;Intrinsic Matrix, K&#xff09;****2. 外參矩陣&#xff08;Extrinsic Matrix, [R|t]&#xff09;****3. 完整投影過程&#xff08;世界坐標 → 像素坐標&#xff09;****步驟1&#xf…

哈希指針與數據結構:構建可信數字世界的基石

一、哈希指針的核心原理哈希指針是一種創新型數據結構&#xff0c;融合了傳統指針的定位功能與密碼學哈希的驗證能力&#xff1a;雙重功能&#xff1a;既存儲數據地址&#xff0c;又包含該數據的哈希值&#xff0c;實現數據定位與完整性驗證的統一。抗篡改機制&#xff1a;數據…

java實現一個方法,isTure則程序繼續往下,為false則return的鏈式寫法

以下是實現鏈式條件檢查的Java方法&#xff0c;采用函數式風格設計。代碼包含一個Chainable類&#xff0c;支持連續的check方法和多個終止操作&#xff08;如then, orElse等&#xff09;&#xff0c;滿足在條件為false時中斷鏈式調用并返回默認值的需求&#xff1a;import java…

數據結構學習之堆

本篇我們將學習新的數據結構——二叉樹。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com 目錄 樹的概念 樹形結構 非樹形結構 樹的相關術語 樹的表示 樹在實際生活上的應用 二叉樹 慢二叉樹 完全二叉樹 二叉樹的儲存結構 二叉樹的存儲結構 順序結構…

【csdn問答社區分析】前端開發熱點問題全解析

前端時間我在csdn問答社區的前端部分"視察”了一圈發現了大家的問題主要集中在以下方面一、框架與組件庫使用問題 Vue相關問題 組件化開發&#xff1a;如avue-crud組件自定義樣式不生效、el-select大數據分頁懶加載、element-plus表格動態列校驗等。功能實現&#xff1a;包…

Pycharm2025 安裝教程 免費分享 沒任何套路

Pycharm 安裝也是很簡單的&#xff0c;簡單過一下流程&#xff0c;如果需要的可以轉存下載到自己電腦上。我用夸克網盤分享了「pycharm2025」&#xff0c;復制鏈接瀏覽器打開轉存后即可下載。鏈接&#xff1a;https://pan.quark.cn/s/4bb74a939332備注&#xff1a;附帶2023-202…

Javaweb————什么是超文本傳輸協議?

&#x1f3cd;?&#x1f3cd;?&#x1f3cd;?引言&#xff1a;什么是協議&#xff1f; 協議是一種約定&#xff0c;規定好一種信息的格式&#xff0c;如果發送方按照這種請求格式發送信息,那么接 收端就要按照這樣的格式解析數據,否則就會出錯&#xff0c;這就是協議 常用協…

UniappDay03

1.熱門推薦-準備工作// 用defineProps獲取頁面參數,query const query defineProps<{type: string }>() const currHot hotMap.find((v) > v.type query.type) // 動態設置標題 uni.setNavigationBarTitle({ title: currHot!.title }) </script>2.獲取熱門推…

基于動態增強的 LLM 置信度方法研究

基于動態增強的 LLM 置信度方法研究 一、引言(Introduction) 大型語言模型(LLM)的性能提升高度依賴于對模型內部表征的精準調控 —— 表征工程通過優化模型中間層隱藏狀態的傳遞規律,能夠在不改變模型參數的前提下顯著提升任務適應性(Wei et al., 2022)。當前主流方法中…

ComfyUI中運行Wan 2.1工作流,電影級視頻,兼容Mac Windows

魔當(LM Downloader)是一個大模型應用下載工具 &#xff0c;目前 魔當 已經支持ComfyUI下載Wan 2.1視頻模型。 魔當下載地址 https://seemts.com/ 先看生成效果 原始圖片&#xff0c;你可以保存到自己電腦上測試 生成視頻&#xff1a; 推薦提示詞&#xff1a; A futurist…

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案 本文對應的講解視頻鏈接:https://www.bilibili.com/video/BV1C48wzqE6T/ 文章目錄 CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗…

XML的簡略知識點

文章目錄1. 基本概念2. 基本語法3. 示例4. 相關技術5. 應用場景XML&#xff08;可擴展標記語言&#xff09;是一種用于存儲和傳輸數據的標記語言&#xff0c;核心特點是可擴展性和自我描述性。以下是其核心知識點&#xff1a; 1. 基本概念 用途&#xff1a;主要用于數據的存儲…

RustDesk 完整部署教程:支持 Web 管理后臺和網頁客戶端遠程,保姆級教學來了!

RustDesk API本項目使用 Go 實現了 RustDesk 的 API&#xff0c;并包含了 Web Admin 和 Web 客戶端。RustDesk是一個遠程桌面軟件&#xff0c;提供了自托管的解決方案&#xff0c;官方API是收費的&#xff0c;這次咱們用到的是Github開源的第三方API源碼。?特性PC端API支持 …