文章目錄
- 基于 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數據處理無直接關系。"}
]
實現說明
-
簡單易用:
- 不需要額外的模型
- 只依賴LLM API
- 實現邏輯清晰
-
靈活性強:
- 可以通過修改prompt調整評分標準
- 可以獲取評分理由
- 支持多維度評估
-
可解釋性好:
- 每個分數都有明確的理由
- 評分標準透明
- 便于調試和優化
-
適應性強:
- 可處理各種領域的問題
- 不需要領域特定訓練
- 支持多語言
使用建議
- Prompt優化:
# 可以添加更多評分維度
"""
評分維度:
1. 相關性: 內容與查詢的關聯程度
2. 完整性: 信息的完整程度
3. 準確性: 信息的準確程度
4. 時效性: 信息的新舊程度
"""
- 批量處理:
# 對于大量文檔,可以分批處理
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)
- 錯誤處理:
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]
- 緩存結果:
from functools import lru_cache@lru_cache(maxsize=1000)
def cached_rerank(self, query: str, doc_key: str):# 實現緩存邏輯pass
這種基于LLM的重排序方案特別適合:
- 快速原型驗證
- 小規模應用
- 需要高可解釋性的場景
- 多語言或跨領域應用
完整 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格式,不要做任何解釋