2024-09-12|閱讀時間 ‧ 約 28 分鐘

超越基礎RAG:手把手教你實現查詢擴展、自查詢和混合搜索等4種進階技術

在大語言模型(LLM)應用中,檢索增強生成(RAG)技術已成為提升回答品質的關鍵。然而,簡單的RAG往往無法滿足複雜場景的需求。本文將深入剖析4種進階RAG演算法,並結合LLM twin系統的實際案例,探討如何優化檢索效果。


一、查詢擴展:擴大語義覆蓋範圍

傳統RAG僅使用單一向量查詢,容易忽略重要資訊。查詢擴展技術通過LLM生成多個相關查詢,擴大了語義覆蓋範圍。例如,對於「LLM的最新進展」這一查詢,我們可以擴展為:

1. 大語言模型在2024年的突破性成果

2. LLM在自然語言處理任務中的表現提升

3. 開源LLM專案的發展趨勢

4. LLM在特定領域應用的新進展

5. 減少LLM訓練成本的創新方法


這種方法能夠捕獲更多相關上下文,提高檢索的全面性。在LLM twin系統中,我們使用GPT-4生成這些擴展查詢,確保覆蓋多個角度。


實現代碼示例:

```python

def query_expansion(query: str) -> List[str]:

prompt = f"請基於以下查詢生成5個相關但不同角度的查詢:\n{query}\n\n生成的查詢:"

response = openai.ChatCompletion.create(

model="gpt-4",

messages=[{"role": "user", "content": prompt}]

)

expanded_queries = response.choices[0].message.content.split('\n')

return expanded_queries

```


二、自查詢:精確提取關鍵資訊


自查詢技術利用LLM從原始查詢中提取關鍵元數據,如標籤或作者ID。這些提取的資訊可用於後續的精確過濾。在LLM twin系統中,我們主要提取作者ID,以確保檢索結果來自特定作者。


實現代碼示例:

```python

def self_query(query: str) -> Dict[str, Any]:

prompt = f"從以下查詢中提取作者ID(如果存在):\n{query}\n\n提取結果:"

response = openai.ChatCompletion.create(

model="gpt-4",

messages=[{"role": "user", "content": prompt}]

)

author_id = response.choices[0].message.content.strip()

return {"author_id": author_id if author_id else None}

```


三、混合與過濾向量搜索:結合精確匹配與語義相似


純向量搜索難以處理精確關鍵詞匹配。混合搜索通過結合向量搜索和關鍵詞搜索,實現了語義相似性和精確匹配的平衡。在LLM twin系統中,我們採用過濾向量搜索方法,即在向量搜索結果上應用元數據過濾。


實現代碼示例:

```python

def hybrid_search(query: str, author_id: str, k: int = 5) -> List[Dict]:

vector = embed(query)

filter_condition = models.FieldCondition(

key="author_id",

match=models.MatchValue(value=author_id)

)

results = qdrant_client.search(

collection_name="vector_posts",

query_filter=models.Filter(must=[filter_condition]),

query_vector=vector,

limit=k

)

return results

```


四、重排序:優化檢索結果排序


重排序技術使用更強大的模型(如GPT-4)對初步檢索結果進行二次評估和排序。這能顯著提升最終返回結果的相關性。在LLM twin系統中,我們使用prompt工程技巧指導GPT-4進行重排序。


實現代碼示例:

```python

def rerank(query: str, results: List[Dict]) -> List[Dict]:

prompt = f"請對以下檢索結果進行相關性排序,考慮與查詢'{query}'的相關程度:\n"

for i, result in enumerate(results):

prompt += f"{i+1}. {result['content'][:100]}...\n"

prompt += "\n請返回排序後的結果索引,最相關的排在前面。"

response = openai.ChatCompletion.create(

model="gpt-4",

messages=[{"role": "user", "content": prompt}]

)

reranked_indices = [int(idx) for idx in response.choices[0].message.content.split(',')]

return [results[i-1] for i in reranked_indices]

```


結合這四種技術,我們可以顯著提升RAG系統的檢索效果。在實際應用中,可根據具體需求靈活組合這些技術。例如,對於需要高準確度的場景,可以強化自查詢和混合搜索;而對於需要廣泛知識覆蓋的場景,則可以側重查詢擴展和重排序。


值得注意的是,雖然這些技術能夠大幅提升檢索質量,但也會增加系統複雜度和計算成本。在實際部署時,需要權衡效果提升和資源消耗,選擇最適合的優化策略組合。


此外,這些技術的效果很大程度上依賴於底層向量數據庫的性能。在LLM twin系統中,我們選擇了Qdrant作為向量數據庫,其卓越的性能和靈活的API為實現這些進階技術提供了堅實基礎。有興趣深入了解Qdrant的讀者可以訪問其官方網站:https://qdrant.tech/

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.