自然語言處理技術已成為提升搜尋引擎效能的關鍵。透過向量搜尋,我們能將文字轉換為向量,並在高維空間中進行相似度比對,有效提升搜尋效率。此外,元資料的嵌入能進一步強化搜尋結果的相關性,例如透過檔案型別、標籤等資訊,更精準地篩選出目標內容。隨著 RAG 技術的興起,更能結合 NLP 和向量搜尋的優勢,讓搜尋引擎理解使用者查詢背後的意圖,並提供更精確、更符合需求的搜尋結果。查詢變異技術,例如步驟回退提示、假設檔案嵌入、多查詢檢索等,能有效提升搜尋效能。透過主題分類別器,更能根據使用者查詢的主題,精準定位相關資訊,例如將查詢歸類別為食譜、營養資訊、烹飪技巧或裝置等,縮小搜尋範圍,提升搜尋效率。
自然語言處理與向量搜尋
自然語言處理(NLP)是一個強大的工具,能夠讓我們以創新的方式處理和分析文字資料。透過精心設計的提示工程和最小的技術負擔,NLP模型可以執行各種任務,從文字摘要到情感分析。
主題抽取
例如,給定一段關於食物的文字,NLP模型可以抽取出關鍵主題,如「雞蛋」、「牛奶」和「營養價值」。這些主題可以用於各種應用,從文字分類別到推薦系統。
import json
# 定義函式以抽取主題
def get_topics(text):
# 使用NLP模型抽取主題
topics = ["eggs", "milk", "nutritive value"]
return {"topics": topics}
# 測試函式
text = "Eggs, like milk, form a typical food, inasmuch as they contain all the elements, in the right proportion, necessary for the support of the body."
print(json.dumps(get_topics(text)))
向量搜尋
除了抽取主題外,NLP還可以用於向量搜尋。向量搜尋是一種技術,允許您在高維空間中搜尋和匹配向量。透過將文字轉換為向量,您可以使用向量相似度來搜尋和匹配相關文字。
元資料嵌入
在向量搜尋中,元資料可以用於提高搜尋結果的相關性。元資料是指描述文字的額外資訊,例如型別、標籤和關鍵字。透過將元資料嵌入向量中,您可以增加搜尋結果的相關性。
# 定義查詢向量
query_vector = {
"contentType": "recipe",
"keyIngredients": ["apples", "sugar", "butter"],
"tags": ["dessert", "pie"]
}
# 定義檔案向量
document_vector = {
"contentType": "recipe",
"recipeTitle": "Classic Apple Pie",
"keyIngredients": ["apples", "pie crust", "sugar", "cinnamon", "butter"],
"servings": 8,
"tags": ["dessert", "baking", "American", "fruit"],
"summary": "A classic apple pie with a flaky crust and a sweet, cinnamon-spiced apple filling."
}
應用場景
NLP和向量搜尋有許多應用場景,包括:
- 文字分類別:NLP可以用於將文字分類別為不同的類別,例如正面或負面評論。
- 推薦系統:NLP可以用於建構推薦系統,根據使用者的偏好和興趣推薦相關內容。
- 資訊檢索:NLP可以用於搜尋和匹配相關文字,提高資訊檢索的效率和準確性。
圖表翻譯:
graph LR A[NLP] -->|抽取主題|> B[主題] A -->|轉換為向量|> C[向量] C -->|搜尋和匹配|> D[相關文字] D -->|傳回結果|> E[使用者]
內容解密:
上述程式碼定義了一個函式get_topics
,用於抽取文字中的主題。函式使用NLP模型抽取主題,並傳回一個JSON物件,其中包含抽取出的主題。程式碼還定義了一個查詢向量和一個檔案向量,展示瞭如何使用元資料嵌入提高搜尋結果的相關性。最終,程式碼傳回了搜尋結果,展示了NLP和向量搜尋在文字分析和搜尋中的應用。
最佳化檢索增強生成
檢索增強生成(RAG)是一種利用人工智慧(AI)來提高搜尋結果準確性的技術。在本文中,我們將討論如何最佳化RAG應用程式的不同元件和階段,以進一步提高其準確性和效能。
查詢變異
查詢變異是一種技術,用於透過修改使用者查詢來提高搜尋效能。這種方法可以透過以下幾種方式實作:
- 步驟回退提示:讓大語言模型(LLM)從使用者查詢中提取高階概念和原則,然後使用這些概念來建立新的搜尋查詢。
- 假設檔案嵌入:建立一個假設的檔案來回答使用者查詢,然後使用這個假設檔案作為搜尋查詢。
- 多查詢檢索:為使用者查詢建立多個子查詢,然後檢索每個子查詢的結果,並讓LLM根據這些結果來回答使用者查詢。
這些技術可以根據應用程式的領域進行最佳化,甚至可以結合使用以提高搜尋效能。
查詢元資料預過濾
除了執行語義過濾外,還可以透過元資料預過濾來減少需要搜尋的嵌入數量。這種方法可以透過以下幾種方式實作:
- 選擇支援元資料過濾的向量資料函式庫:選擇一個支援元資料過濾的向量資料函式庫,例如MongoDB Atlas Vector Search。
- 使用LLM提取元資料:使用LLM從使用者查詢中提取元資料,然後使用這些元資料作為過濾條件。
- 使用啟發式方法確定過濾條件:使用啟發式方法來確定過濾條件,例如根據使用者查詢中的關鍵字來確定需要檢索的檔案型別。
程式碼示例
以下是使用OpenAI的GPT-4模型和Pydantic來提取查詢元資料並格式化回應為JSON的程式碼示例:
from openai import OpenAI
from pydantic import BaseModel
import json
from typing import Literal, Optional
# 建立客戶端
api_key = os.environ["OPENAI_API_KEY"]
client = OpenAI(api_key=api_key)
# 建立分類別器
class ContentTopic(BaseModel):
topic: Optional[Literal[
"nutritional_information",
"equipment",
"cooking_technique",
"recipe"
]]
# 定義函式
function_definition = {
"name": "classify_topic",
"description": "提取查詢中的關鍵主題",
"parameters": json.loads(ContentTopic.schema_json())
}
這個程式碼示例展示瞭如何使用LLM來提取查詢元資料並格式化回應為JSON。然後,可以使用這些元資料作為過濾條件來提高搜尋效能。
主題分類別器的應用
主題分類別器是一種能夠根據給定的幾個例子來最佳化分類別任務的模型。以下是使用 Python 實作的一個簡單的主題分類別器,該分類別器使用了少數幾個例子來進行最佳化。
主題分類別器的實作
def get_topic(query: str) -> str:
"""
根據給定的查詢字串,傳回相應的主題。
Args:
query (str): 使用者的查詢字串。
Returns:
str: 查詢字串所對應的主題。
"""
# 定義模型和函式
model = "gpt-4o-mini"
functions = [function_definition]
function_call = {"name": function_definition["name"]}
temperature = 0
# 定義訊息
messages = [
{
"role": "system",
"content": """根據給定的查詢字串,提取出相應的主題。
只使用內容主題分類別器函式中存在的主題。
如果無法判斷查詢的主題或查詢不是關於烹飪,請回應 `null`。
輸出 JSON 格式。
你必須選擇給定的內容主題型別之一。
示例 1:
使用者: "香蕉中有多少克糖?"
助手: '{"topic": "nutritional_information"}'
示例 2:
使用者: "經典瑪格麗塔的成分是什麼?"
助手: '{"topic": "recipe"}'
示例 3:
使用者: "什麼樣的刀最適合切菜?"
助手: '{"topic": "equipment"}'
示例 4:
使用者: "雞肉炒菜的快速食譜是什麼?"
助手: '{"topic": "recipe"}'
示例 5:
使用者: 誰是最好的足球運動員?
助手: '{"topic": null}'
示例 6:
使用者: 向我解釋重力
助手: '{"topic": null}'""",
},
{
"role": "user",
"content": query
}
]
# 執行模型並傳回結果
response = model(functions, function_call, temperature, messages)
content = ContentTopic.model_validate(json.loads(response.choices[0].message.function_call.arguments))
return content.topic
## 測試分類別器
queries = [
"素食義大利麵食譜是什麼?",
"如何水煮蛋最好?",
"什麼樣的攪拌機設定可以用來製作水果奶昔?",
"可以給我一個巧克力片餅乾的食譜嗎?",
"為什麼天空是藍色的?"
]
for query in queries:
print(f"查詢:{query}")
print(f"主題:{get_topic(query)}")
print("---")
內容解密:
上述程式碼定義了一個 get_topic
函式,該函式根據給定的查詢字串,傳回相應的主題。函式使用了 gpt-4o-mini
模型和一個自定義的函式來進行分類別。訊息部分定義了系統和使用者的角色,以及查詢字串和相應的主題。
圖表翻譯:
flowchart TD A[開始] --> B[定義模型和函式] B --> C[定義訊息] C --> D[執行模型] D --> E[傳回結果]
此圖表展示了程式碼的執行流程,從定義模型和函式開始,到執行模型和傳回結果。每一步驟都對應著程式碼中的特定部分。
效能提升的RAG應用
玄貓的RAG(Retrieval-Augmented Generation)應用可以讓搜尋更加高效和準確。這種方法透過縮小搜尋空間到最相關的資料,從而導致結果更精確和有用。
資料格式化
在建立嵌入式資料時,需要考慮資料的格式。盡可能標準化資料格式可以導致更一致的結果。對於長篇文字資料,例如技術檔案或報告,應該以一致的格式對資料進行格式化和嵌入,包括適當的語義含義在密集的令牌格式中。Markdown是一個不錯的選擇,因為它與HTML或PDF等根據XML的格式相比,每個令牌具有更高的資訊密度。
令牌計數比較
以下是相同內容以純文字、Markdown和HTML表示的GPT-4令牌計數總和:
格式 | 內容 | 令牌計數 |
---|---|---|
純文字 | 簡單素食湯 成分: - 1罐切丁番茄 - 1杯蔬菜高湯 - 1杯混合冷凍蔬菜 | 20 |
Markdown | # 簡單素食湯 ## 成分 - 1罐切丁番茄 - 1杯蔬菜高湯 - 1杯混合冷凍蔬菜 | 15 |
HTML | 簡單素食湯成分
| 30 |
圖表翻譯:
graph LR A[純文字] -->|20令牌|> B[令牌計數] C[Markdown] -->|15令牌|> B D[HTML] -->|30令牌|> B
圖表解釋:
上述Mermaid圖表展示了不同格式對應的令牌計數。Markdown格式由於其簡潔和高資訊密度,每個令牌包含更多資訊,因此令牌計數最少。這意味著使用Markdown格式可以提高搜尋效率和準確性。
從技術架構視角來看,自然語言處理(NLP)結合向量搜尋技術,為資訊檢索和知識管理開啟了新的可能性。本文深入探討了主題抽取、元資料嵌入以及查詢變異等關鍵技術,並佐以程式碼範例,展現瞭如何將這些技術整合至實際應用中。分析顯示,透過向量化文字和元資料,系統能更精確地理解使用者意圖,從而提升搜尋效率和準確性。然而,向量維度和計算資源的消耗仍是目前技術限制。為提升效能,本文提出了根據元資料預過濾和多查詢檢索的最佳化策略,並建議採用Markdown等高資訊密度的格式來降低儲存成本和提升處理效率。展望未來,隨著模型輕量化和硬體加速技術的發展,向量搜尋的應用門檻將大幅降低,預計將在更多領域取代傳統關鍵字搜尋,成為資訊檢索的主流技術。玄貓認為,技術團隊應著重於解決向量搜尋的效能瓶頸,才能充分釋放其巨大潛力。