iT邦幫忙

2025 iThome 鐵人賽

DAY 7
2
AI & Data

論文流浪記:我與AI 探索工具、組合流程、挑戰完整平台系列 第 8

Day 7 | 穿越 RAG 魔法迷宮:打造智慧問答系統的秘訣 - RAG Pipeline

  • 分享至 

  • xImage
  •  

前言:踏入 RAG 魔法迷宮 ✨

你是否曾經問 AI 一個問題,卻得到完全不相關或錯誤的答案?傳統 LLM 只能依賴自身訓練時的知識,遇到新資料,它也只能「憑直覺回答」,結果往往出現幻覺(Hallucination)。

今天,我要帶你踏入RAG(Retrieval-Augmented Generation) 魔法迷宮,探索如何讓模型在生成答案前,先去搜尋最有價值的知識寶石,最後在 Ollama 的水晶球中生成精準且可靠的答案。✨

我站在迷宮入口,四周漂浮著卷軸和閃爍水晶,每一個都可能藏著答案。今天,我們將用 RAG 的魔法,把散落的知識碎片整合,打造可即時使用的智慧水晶球。


為什麼需要 RAG?

傳統 LLM 在生成答案時面臨幾個問題:

  • 知識更新困難:模型被訓練後,內部知識就固定了,如果要回答新資料、最新研究,模型無法即時更新。
  • 資訊精準度不足:模型容易憑「直覺」生成答案,有時出現 Hallucination(幻覺)。
  • 資料量龐大:將整個知識庫塞入模型訓練成本極高,既不實際也不經濟。

RAG 的解決方案很簡單:Retrieve → Augment → Generate
就像魔法師先去圖書館挑選寶石,再用水晶球鑄造答案,既快速又可靠。

RAG 核心概念:三步魔法 🪄

核心概念

def rag(query):
    hits = search(query)
    prompt = build_prompt(query, hits)
    answer = llm(prompt)
    
    return answer

https://ithelp.ithome.com.tw/upload/images/20250914/201367815Ih9MwZ6MY.png

RAG 實戰步驟 ✨

1️⃣ Embedding 查詢向量化 → 尋找語義寶石
將使用者問題轉換成向量(embedding),讓模型可以計算語義相似度,而不只是字面比對。
這邊使用的模型是 all-mpnet-base-v2,它會將每個句話映射成 768 維向量,並保持語義上的相似關係。例如:「什麼是向量搜尋?」與「如何進行 semantic search?」向量距離接近,代表語義相似。

from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-mpnet-base-v2")


def get_embedding(text: str, use_sentence_transformers: bool = True) -> List[float]:
    if (
        use_sentence_transformers
    ): 
        vector = model.encode(text)
        return vector.tolist()

2️⃣ 向量搜尋(Vector Search) → 在知識迷宮中導航
有了向量後,我們使用向量資料庫(Qdrant / Pinecone / Weaviate)進行搜尋。
Qdrant 採用 HNSW(Hierarchical Navigable Small World)演算法,像一張多層地圖:頂層快速找到大方向,底層精準定位相似向量。

chunks, sources, msg, arxiv_ids, total_hits = qdrant_client.search(
   query=query,
   query_vector=query_embedding,
   size=5,
   min_score=0.0,
)

⚡ 小提示:size 控制返回數量,min_score 過濾不夠相似的碎片。

3️⃣ 建立結構化 Prompt → 打造魔法咒語
透過結構化,我們可以指定每個知識段落的標題、來源的論文與上下文,甚至加上 系統提示(system prompt) 來設定回答風格或語氣。例如:

  • 指定回答長度
  • 指定專業領域(如醫療、法律、科技)
  • 指定語言(user_language 可自動翻譯)

這樣生成的答案不僅精準,也更具可讀性與一致性。

prompt_data = langchain_client.prompt_builder.create_structured_prompt(
   query, reranked, system_settings.user_language
)

4️⃣ 呼叫 LLM 生成答案 → 水晶球顯現智慧
最後一步是將整理好的 prompt 交給 LLM 生成答案。在我們的架構中,LangChain 封裝了 LLM 呼叫的細節,包括:

  • 結合多個 prompt 來源(系統提示、使用者問題、檢索知識)
  • 控制生成內容長度與多樣性(temperature、top_p 等參數)
    結果是模型可以在「有知識依據」的情況下生成答案,大幅降低幻覺風險(Hallucination),同時保持靈活且自然的語言表達。
resp = langchain_client.llm_context(
   final_prompt,
   query,
   user_language=system_settings.user_language,
   system_prompt=system_settings.system_prompt,
)

可能會印象深刻沒錯。

qdrant_client.search 是我們曾經在 Day 5 介紹過的 "Read / 搜尋 Points"
langchain_client.llm_contextDay 6 介紹的 "LangChain 封裝"

讓我們同在一起

query_embedding = get_embedding(query)
chunks, sources, msg, arxiv_ids, total_hits = qdrant_client.search(
        query=query,
        query_vector=query_embedding,
        size=system_settings.top_k,
        min_score=0.3,
    )
    
if chunks:
    reranked = re_ranking(
                chunks,
                query,
                vector_weight=vector_weight,
                bm25_weight=bm25_weight,
            ) # 💡是可選步驟
    prompt_data = langchain_client.prompt_builder.create_structured_prompt(
                    query, reranked, system_settings.user_language
                )
    resp = langchain_client.llm_context(
                final_prompt,
                query,
                user_language=system_settings.user_language,
                system_prompt=system_settings.system_prompt,
            )


re_ranking 為可選步驟。
user_language 可支援翻譯功能,讓知識問答多語化。
structured_prompt 確保答案格式整齊。


實務應用

在實務工程場景中,這套流程非常有用:

  • 知識問答系統:企業內部文件、API 文件、研究論文,都可以轉成向量寶石,快速提供精準答案。
  • 客服聊天機器人:確保回覆不只是相關,而是最符合客戶問題。
  • 多語言支持user_language 讓答案自動翻譯,適用全球化產品。
  • 可擴展性:Qdrant + LangChain + Ollama 組合,可支援百萬級知識庫,並且可以快速更新向量。

小結

今天,我不只是探索魔法迷宮,更學會了如何讓散落的知識碎片經過檢索、結構化,最終在 Ollama 的水晶球中發光。我的魔法地圖越畫越清晰,迷宮的寶石逐漸被鑑定、雕刻、整合,形成可即時使用的智慧水晶球。



上一篇
Day 6|你好 Ollama - 與 Ollama 模型初次見面
下一篇
Day 8|Email Pipeline 技術拆解(上) - 打造訂閱系統
系列文
論文流浪記:我與AI 探索工具、組合流程、挑戰完整平台9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言