iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
生成式 AI

練習AI系列 第 29

跨語言檢索(Cross-lingual Retrieval, XLR) 🌍

  • 分享至 

  • xImage
  •  

🆕 程式碼

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);
}
  1. app/api/kb/[tenant]/[ns]/ask/route.js

新增 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 });
  }
  1. app/studio/page.tsx

選單多一個策略:

<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"。


上一篇
Cross-Encoder Reranker(重排序模型)
系列文
練習AI29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言