FastGPT 源碼:基于 LLM 實現 Rerank (含Prompt)

文章目錄

    • 基于 LLM 實現 Rerank
      • 函數定義
      • 預期輸出
      • 實現說明
      • 使用建議
      • 完整 Prompt

基于 LLM 實現 Rerank

下邊通過設計 Prompt 讓 LLM 實現重排序的功能。

函數定義

class LLMReranker:def __init__(self, llm_client):self.llm = llm_clientdef rerank(self, query: str, documents: list[dict]) -> list[dict]:# 構建 promptprompt = self._build_rerank_prompt(query, documents)# 調用 LLMresponse = self.llm.chat.completions.create(model="gpt-3.5-turbo",temperature=0,  # 降低隨機性messages=[{"role": "system", "content": """你是一個專業的搜索結果重排序專家。
你的任務是:
1. 評估每個文檔與用戶查詢的相關性
2. 給出0-1之間的相關性分數
3. 解釋評分理由
4. 按相關性從高到低排序評分標準:
- 0.8-1.0: 完全相關,直接回答問題
- 0.6-0.8: 高度相關,包含大部分所需信息
- 0.4-0.6: 部分相關,包含一些相關信息
- 0.0-0.4: 基本不相關請以JSON格式返回結果。"""},{"role": "user", "content": prompt}])# 解析響應try:results = eval(response.choices[0].message.content)return resultsexcept:return []def _build_rerank_prompt(self, query: str, documents: list[dict]) -> str:prompt = f"""請對以下文檔進行重排序:用戶查詢: {query}待排序文檔:
"""for i, doc in enumerate(documents, 1):prompt += f"""
文檔{i}:
ID: {doc['id']}
內容: {doc['text']}
"""prompt += """
請以如下JSON格式返回重排序結果:
[{"id": "文檔ID","score": 相關性分數,"reason": "評分理由"},...
]
"""return prompt# 使用示例
def main():# 初始化查詢和文檔query = "Python如何處理JSON數據?"documents = [{"id": "doc1","text": "Python提供了json模塊來處理JSON數據。使用json.loads()可以將JSON字符串轉換為Python對象,使用json.dumps()可以將Python對象轉換為JSON字符串。",},{"id": "doc2", "text": "在Python中,字典(dict)是一種常用的數據結構,它的格式與JSON非常相似。你可以使用字典來存儲鍵值對數據。",},{"id": "doc3","text": "Python是一種面向對象的編程語言,支持類和對象的概念。你可以創建自定義類來組織數據和行為。",}]# 初始化 LLM client (這里以 OpenAI 為例)from openai import OpenAIclient = OpenAI()# 執行重排序reranker = LLMReranker(client)results = reranker.rerank(query, documents)# 打印結果print("\n查詢:", query)print("\n重排序結果:")for i, result in enumerate(results, 1):print(f"\n{i}. 文檔ID: {result['id']}")print(f"   相關性分數: {result['score']}")print(f"   評分理由: {result['reason']}")

預期輸出

[{"id": "doc1","score": 0.95,"reason": "文檔直接回答了如何處理JSON數據的問題,提供了具體的json模塊使用方法(loads和dumps函數),信息完整且準確。"},{"id": "doc2","score": 0.65,"reason": "文檔提到了Python字典與JSON的關系,對理解JSON處理有幫助,但沒有直接說明處理方法。"},{"id": "doc3","score": 0.2,"reason": "文檔只介紹了Python的面向對象特性,與JSON數據處理無直接關系。"}
]

實現說明

  1. 簡單易用:

    • 不需要額外的模型
    • 只依賴LLM API
    • 實現邏輯清晰
  2. 靈活性強:

    • 可以通過修改prompt調整評分標準
    • 可以獲取評分理由
    • 支持多維度評估
  3. 可解釋性好:

    • 每個分數都有明確的理由
    • 評分標準透明
    • 便于調試和優化
  4. 適應性強:

    • 可處理各種領域的問題
    • 不需要領域特定訓練
    • 支持多語言

使用建議

  1. Prompt優化:
# 可以添加更多評分維度
"""
評分維度:
1. 相關性: 內容與查詢的關聯程度
2. 完整性: 信息的完整程度
3. 準確性: 信息的準確程度
4. 時效性: 信息的新舊程度
"""
  1. 批量處理:
# 對于大量文檔,可以分批處理
def batch_rerank(self, query: str, documents: list, batch_size: int = 5):results = []for i in range(0, len(documents), batch_size):batch = documents[i:i + batch_size]batch_results = self.rerank(query, batch)results.extend(batch_results)return sorted(results, key=lambda x: x['score'], reverse=True)
  1. 錯誤處理:
try:response = self.llm.chat.completions.create(...)results = eval(response.choices[0].message.content)
except Exception as e:print(f"重排序錯誤: {str(e)}")# 返回原始順序return [{"id": doc["id"], "score": 0.5} for doc in documents]
  1. 緩存結果:
from functools import lru_cache@lru_cache(maxsize=1000)
def cached_rerank(self, query: str, doc_key: str):# 實現緩存邏輯pass

這種基于LLM的重排序方案特別適合:

  1. 快速原型驗證
  2. 小規模應用
  3. 需要高可解釋性的場景
  4. 多語言或跨領域應用

完整 Prompt

你是一個專業的搜索結果重排序專家。你的任務是評估每個文檔與用戶查詢的相關性,并給出排序。評分標準:
1. 相關性分數范圍: 0.0-1.0
- 0.8-1.0: 完全相關,直接回答問題
- 0.6-0.8: 高度相關,包含大部分所需信息
- 0.4-0.6: 部分相關,包含一些相關信息
- 0.0-0.4: 基本不相關2. 評分維度:
- 相關性: 文檔內容是否直接回答查詢問題
- 完整性: 回答的信息是否完整
- 準確性: 信息是否準確專業
- 直接性: 是否需要用戶進一步推理或處理用戶查詢: Python如何處理JSON數據?待評估文檔:
文檔1:
ID: doc1
內容: Python提供了json模塊來處理JSON數據。使用json.loads()可以將JSON字符串轉換為Python對象,使用json.dumps()可以將Python對象轉換為JSON字符串。文檔2:
ID: doc2
內容: 在Python中,字典(dict)是一種常用的數據結構,它的格式與JSON非常相似。你可以使用字典來存儲鍵值對數據。文檔3:
ID: doc3
內容: Python是一種面向對象的編程語言,支持類和對象的概念。你可以創建自定義類來組織數據和行為。請按以下JSON格式返回重排序結果,必須包含id字段:
[
"文檔ID",
...
]注意:
1. 結果必須按score從高到低排序
2. 結果中只需要給出id字段
3. 返回格式必須是合法的JSON格式,不要做任何解釋

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

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

相關文章

LeetCode 1745.分割回文串 IV:動態規劃(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV:動態規劃(用III或II能直接秒) 力扣題目鏈接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 給你一個字符串 s ,如果可以將它分割成三個 非空 回文子字符串,…

25年3月5日

1.思維導圖 2.不太會 #include "head.h" int main(int argc, const char *argv[]) {int fdopen("../xiaoxin.bmp","O_RDONLY");if(fd-1)printf("open error");//大小struct stat st;if(stat("…

全球首創!微軟發布醫療AI助手,終結手寫病歷時代

今天凌晨,微軟發布了醫療界首個用于臨床工作流程的AI助手Microsoft Dragon Copilot。 Dragon Copilot是基于語音文本的混合架構,能夠將醫生的語音或臨床口述內容實時轉換為文本。例如,醫生可以通過語音輸入患者的病歷信息、醫囑或診斷結果&a…

[自動駕駛-傳感器融合] 多激光雷達的外參標定

文章目錄 引言外參標定原理ICP匹配示例參考文獻 引言 多激光雷達系統通常用于自動駕駛或機器人,每個雷達的位置和姿態不同,需要將它們的數據統一到同一個坐標系下。多激光雷達外參標定的核心目標是通過計算不同雷達坐標系之間的剛性變換關系&#xff08…

Blazor-路由模板(下)

路由約束 類型約束 我們這里使用{id:int}限制路由&#xff0c;id為int類型&#xff0c;并且路由參數 id 對應的 Id 屬性也必須是 int 類型。我們試試能否正常訪問 page "/demoPage/{id:int}" <h3>demoPage</h3> <h2>路由參數Id&#xff1a;Id&l…

多線程-JUC源碼

簡介 JUC的核心是AQS&#xff0c;大部分鎖都是基于AQS擴展出來的&#xff0c;這里先結合可重入鎖和AQS&#xff0c;做一個講解&#xff0c;其它的鎖的實現方式也幾乎類似 ReentrantLock和AQS AQS的基本結構 AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;抽象隊列…

通過多線程獲取RV1126的AAC碼流

目錄 一RV1126多線程獲取音頻編碼AAC碼流的流程 1.1AI模塊的初始化并使能 1.2AENC模塊的初始化 ???????1.3綁定AI模塊和AENC模塊 ???????1.4多線程獲取每一幀AAC碼流 ???????1.5每個AAC碼流添加ADTSHeader頭部 ???????1.6寫入具體每一幀AAC的…

JVM常用概念之對象初始化的成本

在JVM常用概念之新對象實例化博客中我講到了對象的實例化&#xff0c;主要包含分配&#xff08;TLAB&#xff09;、系統初始化、用戶初始化&#xff0c;而我在JVM常用概念之線程本地分配緩沖區&#xff08;ThreadLocal Allocation Buffer&#xff0c;TLAB&#xff09;博客中也講…

java后端開發day27--常用API(二)正則表達式爬蟲

&#xff08;以下內容全部來自上述課程&#xff09; 1.正則表達式&#xff08;regex&#xff09; 可以校驗字符串是否滿足一定的規則&#xff0c;并用來校驗數據格式的合法性。 1.作用 校驗字符串是否滿足規則在一段文本中查找滿足要求的內容 2.內容定義 ps&#xff1a;一…

AI---DevOps常備工具(?AI-Integrated DevOps Essential Tools)

AI---DevOps常備工具 技術領域正在迅速發展&#xff0c;隨著我們步入 2025 年&#xff0c;有一點是明確的&#xff1a;人工智能&#xff08;AI&#xff09;不再只是一個流行詞&#xff0c;它是每個 DevOps 工程師都需要掌握的工具。隨著云環境的復雜性增加、對更快部署的需求以…

Pytorch中的主要函數

目錄 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、給大家寫一個常用的自動選擇電腦cuda 或者cpu 的小技巧五、torch.version.cuda&#xff1b;torch.bac…

Spring Boot中對接Twilio以實現發送驗證碼和驗證短信碼

Twilio介紹 Twilio是一家提供云通信服務的公司&#xff0c;旨在幫助開發者和企業通過簡單的API實現各種通信功能。以下是Twilio的一些主要特點和服務介紹&#xff1a; 核心功能 短信服務&#xff08;SMS&#xff09;&#xff1a;允許用戶通過API發送和接收短信&#xff0c;支…

VSCode詳細安裝步驟,適用于 Windows/macOS/Linux 系統

以下是 Visual Studio Code (VSCode) 的詳細安裝步驟&#xff0c;適用于 Windows/macOS/Linux 系統&#xff1a; VSCode 的詳細安裝步驟 一、Windows 系統安裝1. 下載安裝包2. 運行安裝程序3. 驗證安裝 二、macOS 系統安裝1. 方法一&#xff1a;官網下載安裝包2. 方法二&#x…

基于PyTorch的深度學習3——基于autograd的反向傳播

反向傳播&#xff0c;可以理解為函數關系的反向傳播。

設備管理系統功能與.NET+VUE(IVIEW)技術實現

在現代工業和商業環境中&#xff0c;設備管理系統&#xff08;Equipment Management System&#xff0c;簡稱EMS&#xff09;是確保設備高效運行和維護的關鍵工具。本文采用多租戶設計的設備管理系統&#xff0c;基于.NET后端和VUE前端&#xff08;使用IVIEW UI框架&#xff09…

PHP之特性

在你有別的編程語言的基礎下&#xff0c;你想學習PHP&#xff0c;可能要了解的PHP特有的東西。 定界符 使用<<<TT(可以是任意字符&#xff0c;但是不可以在別的地方使用過)和TT&#xff0c;會解析html格式和變量&#xff0c;如果在<<<后面加上單引號就會不…

9-Agent大模型中工作流的使用方法分析

目錄 關鍵詞 摘要 速覽 配置插件進行新聞內容查找的工作流設置 自動化調用用戶輸入變量的插件配置教程 配置大模型以整理并簡要輸出新聞內容 新聞內容總結功能調試與優化 搭建與發布工作流優化布局的流程詳解 創建和配置智能體工作流程 調試頁面與工作流配置演示 思…

記一次:泛微OA集成Mybatis后 insert/update執行成功,但未真正插入或修改數據

背景&#xff1a;通過Mybatis插入數據或更新數據&#xff0c;顯示插入/更新成功&#xff0c;查詢數據庫&#xff0c;發現并未插入成功、數據也沒更新成功。下面是Mapper文件 public interface TestOrmMapper {int insertByTest(Param("requestId") Integer requestI…

使用 Spring Boot 實現前后端分離的海康威視 SDK 視頻監控

使用 Spring Boot 實現前后端分離的海康威視 SDK 視頻監控系統&#xff0c;可以分為以下幾個步驟&#xff1a; 1. 系統架構設計 前端&#xff1a;使用 Vue.js、React 或 Angular 等前端框架實現用戶界面。后端&#xff1a;使用 Spring Boot 提供 RESTful API&#xff0c;負責與…

【大模型系列篇】國產開源大模型DeepSeek-V3技術報告解析

DeepSeek-V3技術報告 目錄 DeepSeek-V3技術報告 1. 摘要 2. 引言 3. DeepSeek V3 架構 3.1 基礎架構 3.1.1. 多頭潛在注意力 3.1.2. DeepSeekMoE和無輔助損失的負載均衡 3.2 多令牌預測 4. 基礎設施 4.1 計算集群 4.2 訓練框架 4.2.1. DualPipe算法與計算通信協同優…