🆕 程式碼
1) src/day28_xlingual.js
// src/day28_xlingual.js
import { openai } from "./aiClient.js";
import { answerWithRAG } from "./day16_rag_store.js";
/**
* 偵測語言 + 翻譯查詢
*/
export async function translateQuery(query, targetLang="en") {
const res = await openai.chat.completions.create({
model: "gpt-4o-mini",
temperature: 0,
messages: [
{ role: "system", content: "你是一個翻譯器,請將輸入翻譯成 " + targetLang + ",保持原意。" },
{ role: "user", content: query }
]
});
return res.choices?.[0]?.message?.content?.trim() || query;
}
/**
* 跨語言檢索
*/
export async function retrieveXlingual({ tenant, ns, query, topK=6 }) {
// 1) 翻譯查詢成英文
const queryEn = await translateQuery(query, "en");
// 2) 原文檢索
const { sources: srcOrig } = await answerWithRAG({ tenant, ns, query, topK });
// 3) 英文檢索
const { sources: srcEn } = await answerWithRAG({ tenant, ns, query: queryEn, topK });
// 4) 合併去重
const seen = new Map();
[...srcOrig, ...srcEn].forEach(s => {
if (!seen.has(s.id)) seen.set(s.id, s);
});
return [...seen.values()].slice(0, topK);
}
新增 xlingual 策略:
import { retrieveXlingual } from "../../../../../src/day28_xlingual.js";
...
if (strategy === "xlingual") {
const chunks = await retrieveXlingual({ tenant, ns, query: q, topK: 6 });
const ctxText = chunks.map((h,i)=>`# 片段${i+1}(${h.docId})\n${h.text}`).join("\n\n");
const res = await openai.chat.completions.create({
model:"gpt-4o-mini",
temperature:0.2,
messages:[
{ role:"system", content:"你是多語言知識庫助理,根據片段回答,並保持使用者輸入語言回答。" },
{ role:"user", content:`問題:${q}\n\n片段:\n${ctxText}` }
]
});
const answer = res.choices?.[0]?.message?.content?.trim() || "沒有足夠資訊。";
return NextResponse.json({ ok:true, strategy:"xlingual", answer, sources: chunks });
}
選單多一個策略:
<select ... value={strategy} onChange={e=>setStrategy(e.target.value as any)}>
<option value="default">Default(Top-K)</option>
<option value="section">Section-first</option>
<option value="qrewrite">Query Rewrite</option>
<option value="hybrid">Hybrid</option>
<option value="rerank">Rerank</option>
+ <option value="xlingual">X-Lingual(跨語言)</option>
</select>
▶️ 驗收流程
/studio 切到 X-Lingual 模式。
知識庫假設是英文檔案。
提問(中文):「退貨需要多久?」
系統會翻譯成英文 → 同時檢索英文與中文版本。
最後回答仍然是中文。
回傳 JSON:strategy: "xlingual"。