
在您的 SaaS 中發布 AI 搜索,無需按查詢 API 費用
使用微調的 3B-7B 模型構建自然語言搜索的逐步教程。包括訓練資料來源、模型選擇、通過 Ollama 的 GGUF 部署和延遲基準測試。
自然語言搜索是 SaaS 產品中最受歡迎的 AI 功能。用戶希望輸入「顯示上季度關閉的超過 $50K 的交易」,而不是點擊篩選器下拉菜單。問題是:通過外部 API 的每個搜索查詢都需要花費金錢,而搜索是高頻的。一個有 10,000 個用戶、每個用戶每天 20 次搜索的 SaaS 是每天 200,000 次 API 調用。按 GPT-4o 定價,那是每年 $48,000——用於搜索框。
本教程介紹如何使用在本地運 行、零按查詢費用的微調模型來構建自然語言搜索。
模型實際上做什麼
AI 搜索模型執行一個特定任務:將自然語言查詢翻譯為您現有搜索基礎設施可以執行的結構化搜索過濾器。
輸入: "deals over 50K that closed in Q4"
輸出:
{
"filters": [
{ "field": "amount", "operator": "gt", "value": 50000 },
{ "field": "status", "operator": "eq", "value": "closed_won" },
{ "field": "close_date", "operator": "between", "value": ["2025-10-01", "2025-12-31"] }
],
"sort": { "field": "close_date", "direction": "desc" }
}
這不是 RAG 問題。您不是在文件中搜索。您是在將意圖翻譯為結構。這個區別很重要,因為它意味著:
- 您需要一個小模型(3B-7B 參數已綽綽有餘)
- 您的訓練資料緊湊(200-500 個範例)
- 延遲很快(輸出很短——通常 50-200 個 token)
第一步:獲取訓練資料
您需要 200-500 對自然語言查詢映射到結構化過濾器的配對。以下是獲取它們的方法。
來源 A:搜索日誌(最佳品質)
如果您的產品已經有基於過濾器的搜索,您就有隱式訓練資料。每次用戶手動應用過濾器,那就是一個結構化查詢。您需要等效的自然語言。
方法: 匯出您最常見的過濾器組合。對於每個組合,寫 3-5 個自然語言變體。
| 結構化過濾器 | 自然語言變體 |
|---|---|
status=active, created > 30d ago | "active items from the last month"、"show me active ones created recently"、"new active items" |
assignee=current_user, priority=high | "my high priority items"、"high priority assigned to me"、"what's urgent on my plate" |
amount > 10000, stage=negotiation | "big deals in negotiation"、"negotiations over 10K"、"large deals we're negotiating" |
目標:100-150 個唯一過濾器組合,每個有 3 個自然語言變體 = 300-450 個訓練範例。
來源 B:支援票據
搜索您的支援票據和聊天日誌,尋找包含搜索意圖的消息。用戶經常告訴支援「我試圖找到 X」或「我如何按 Y 篩選」。這些是免費的訓練資料。
要搜索的模式:
- "How do I find..."
- "I'm looking for..."
- "Can I filter by..."
- "Where are my..."
- "Show me..."
典型產出:每 1,000 張支援票據 50-100 個可用範例。
來源 C:合成生成(僅作補充)
使用 GPT-4o 生成現有範例的額外變體。這對擴展自然語言變體很有效,但不應該是您的主要來源。
提示模式:
Given this structured search filter:
{ "field": "status", "operator": "eq", "value": "active" }
Generate 5 natural language queries a user might type to
express this search intent. Vary formality, length, and phrasing.
The user is searching within a [your product type] application.
使用合成資料填補您的覆蓋差距,而不是作為基礎。
資料格式
將您的訓練資料構建為對話對:
{
"messages": [
{
"role": "system",
"content": "Convert the user's search query into a structured filter. Respond only with valid JSON."
},
{
"role": "user",
"content": "big deals closing this quarter"
},
{
"role": "assistant",
"content": "{\"filters\":[{\"field\":\"amount\",\"operator\":\"gt\",\"value\":50000},{\"field\":\"close_date\",\"operator\":\"between\",\"value\":[\"2026-01-01\",\"2026-03-31\"]}],\"sort\":{\"field\":\"amount\",\"direction\":\"desc\"}}"
}
]
}