Cloud Summit 2025

用 RAG 打造可對話 AI 知識庫

《有問題問過 AI 後再來問我》
~ Che Chia Chang @ chechia.net ~

關於我

🔽

DevOpsDay 2025: RAG Workshop

大綱

  1. 什麼是 RAG
  2. 為什麼需要 RAG
  3. 為何需要內部知識庫
  4. RAG Agent 的優勢
  5. RAG Agent 的應用場景
  6. 如何開始/如何進步
  7. QA

什麼是 RAG

  • RAG(Retrieval-Augmented Generation 檢索增強生成)
  • 結合檢索系統與生成式模型(如 GPT)的自然語言處理架構
  • 在生成答案時引用外部知識,增加上下文內容,提供給 LLM(大型語言模型)
  • 使模型回答更準確且具事實根據

🔽

什麼是 RAG

  1. Retrieval(檢索): 從一個外部知識庫(如文件、向量資料庫等)中找到與問題相關的資訊。通常會用文字嵌入向量(embeddings)做相似度搜尋。
  2. Generation(生成): 把檢索到的內容與使用者問題一起丟給 LLM(如 GPT、Claude 等)去生成答案。生成的內容會更具事實根據,並能引用具體資料。

為什麼使用 RAG?

  • 希望 LLM 根據知識庫產生回答
  • 而不是只根據 Model 訓練資料,進行生成式回答。
  • 這樣做可以達到以下目的:
    • ✅ 減少模型幻覺(hallucination)
    • ✅ 為使用者提供即時且相關的資訊
    • ✅ 利用你自己的內容與知識庫
LLM 不具備專業知識。缺乏內容根據時,容易產生幻覺(hallucination)

簡單的RAG範例

https://github.com/chechiachang/rag-workshop/blob/main/notebook/3_RAG_with_OpenAI.ipynb

┌──────────────┐       ┌─────────────────────┐
│ User Input   │       │ Embedding Model     │
│ (e.g., Query)├──────▶│ (OpenAI Embeddings) │
└──────────────┘       └────────────┬────────┘
                                    │
                                    ▼
                            ┌───────────────┐
                            │ Vector Query  │
                            │ to Qdrant DB  │
                            └──────┬────────┘
                                   ▼
                        ┌────────────────────┐
                        │ Retrieved Contexts │
                        └────────┬───────────┘
                                 ▼
                   ┌────────────────────────────┐
                   │ Prompt Construction Module │
                   │ (Query + Top-K Contexts)   │
                   └────────┬───────────────────┘
                            ▼
                    ┌────────────────────┐
                    │ OpenAI Chat Model  │
                    │ (GPT-4.1 / GPT-4)  │
                    └────────┬───────────┘
                             ▼
                    ┌────────────────────┐
                    │ Final Answer       │
                    └────────────────────┘

🔽

import qdrant_client

# 使用 Qdrant 作為向量數據庫
client = qdrant_client.QdrantClient(
    host="localhost",
    prefer_grpc=True,
)

'''
query_docs 函數用於查詢相關文檔
查詢指定的 collection_name
使用指定的模型model進行嵌入查詢
返回最相關的文檔
'''
def query_docs(query, collection_name="covid-qa-3-large", model="text-embedding-3-large" , top_k=5):

    '''
    query_embeddings 函數用於獲取查詢的語意嵌入向量
    換句話說,把查詢的問題轉換為向量表示
    example: "What is COVID-19?" -> [0.1, 0.2, 0.3, ...] 一個固定長度的向量
    '''
    query_embeddings = get_embedding(query, model)

    '''
    使用 Qdrant 客戶端 query_points 函數查詢相關文檔
    返回指定 collection_name 中與 query_embeddings 最相似的前 top_k 個點
    '''
    results = client.query_points(
        cㄨollection_name=collection_name, // 查詢的 collection 名稱
        query=query_embeddings, // 輸入查詢的語意嵌入向量
        limit=5, // 返回前 5 個最相關的點
        with_payload=True,
        using="title" // 使用指定的索引字段進行查詢
    )

    # 提取查詢結果中的 payload(即答案)
    payloads = [point.payload["answer"] for point in results.points]
    return payloads

'''
使用 OpenAI 的 GPT 模型生成回答
docs 是從向量數據庫中查詢到的相關文檔
將 context 與原始問題組合成 prompt 將 query + context 組合起來,如:

根據以下資料回答問題:
===
[段落1]
[段落2]
===
問題:COVID 的全名是什麼?
'''
def generate_answer(query, docs, model="gpt-4o-mini"):
    context = "\n\n".join(docs)
    prompt = f"""根據以下內容回答問題:
    1. 請用繁體中文回答
    2. 依照內容產生回答
    3. 附上內容原文作為依據,原文保留內容的原始語言
    4. 如果內容不包含就回答我不知道
    
    內容:
    {context}
    
    問題:
    {query}
    """

    res = openai_client.chat.completions.create(
        model=model, # 使用指定的 OpenAI 模型
        messages=[
            {"role": "system", "content": "你是一個 helpful AI 助理"},
            {"role": "user", "content": prompt}
        ],
        temperature=0.2
    )
    return res.choices[0].message.content.strip()

# 使用範例
query = "COVID 的全名是什麼"

# 根據 query 查詢相關文檔 docs
docs = query_docs(
    query=query,
    collection_name="covid-qa-3-large",
    model="text-embedding-3-large")

# 將查詢結果 docs 與 query 一起生成回答
answer = generate_answer(
    query=query, 
    docs=docs, 
    model="gpt-4o-mini")

print("\n🧠 回答:")
print(answer)

🧠 回答:
COVID 的全名是「Coronavirus Disease 2019」,簡稱 COVID-19。

依據原文:
"WHO announced “COVID-19” as the name of this new disease on 11 February 2020, following guidelines previously developed with the World Organisation for Animal Health (OIE) and the Food and Agriculture Organization of the United Nations (FAO)."

可以增強 gpt-4o 的冷笑話知識

或是把 K8s 官方文件全部塞進 vector DB

https://github.com/chechiachang/rag-workshop/blob/main/notebook/6_k8s_RAG_QA.ipynb

  • 透過 prompt 嚴格限制 LLM 根據上下文提供的文件回答,而不要依賴 LLM 的訓練資料
  • LLM 只提供語言邏輯
  • 這樣可以減少 LLM 的幻覺(hallucination),並提高回答的準確性
  • 增加可觀測性,每個回答都可以追溯到具體的上下文文件
我知道 RAG 是什麼了,但為何要打造內部知識庫?

🔽

我知道 RAG 是什麼了,但為何要打造內部知識庫?
  • 企業內部文件往往分散於 Slack、Confluence、Google Drive、Notion 等平台
  • 傳統關鍵字搜尋難以快速獲取準確資訊
  • 特定職位的工程師會變成回答問題的「門神」
  • 相同的問題被問了無數次
  • 新人需要花費大量時間去搜尋、理解與學習
  • 導致溝通成本高、開發流程受阻

需要一個統一的知識庫,能夠快速檢索、理解並回答問題

使用 RAG Agent 增強內部知識傳遞
  • 入門的的問題與重複的問題,不需要人類回答
  • LLM 的語言修飾能力優於平均工程師(表達的更通順)
  • LLM 可以根據使用者的問題,提供多元的回答方式(舉例說明,換句話說)
  • Agent 結合 function tools / mcp server 可以整合更多資料來源
  • RAG Agent 24/7 可用不需休息,也不會失去耐心
RAG Agent 的優勢
  • 入門的的問題與重複的問題 —> 基礎問題的正確率高
  • LLM 的語言修飾能力優於平均人類 —> 表達的更通順
  • LLM 根據使用者的問題調整回答方式 —> 互動問答,舉例說明,換句話說
  • RAG Agent 不需休息,不會失去耐心 —> 比我本人還高可用
  • 自動化 —> 結合監測系統,主動推送需要的訊息
  • 標準化回答
RAG Agent + MCP Server

透過 MCP Protocol,可以將不同的資料來源(如 Confluence、Github、Slack 等)整合到 RAG Agent 中。這樣,RAG Agent 可以在不同的上下文中提供一致的回答。不需要寫額外的程式碼,或只需要 LLM generate 一些簡單的程式碼。

RAG 自動化: 新人 onboarding

傳統的 onboarding 過程往往依賴資深工程師手動指導和文檔查閱,效率低下。透過 RAG Agent,可以提供互動式的 onboarding 體驗,並且可以不斷溫習和更新知識。

RAG 自動化: 第一時間Alert處理

工程師處理 alert 時,通常需要查閱內部文件、Runbook 或架構設計文件。這些文件往往分散在不同的系統中,導致查找過程耗時。

AI Copilot 不應該像圖書館守門員等人來借書, 而應該像導航系統,在你開車時主動告訴你:前方有彎道。

修復完全自動化 k8sGPT

當 k8s 事件或指標觸發時,k8sGPT 可以自動查詢內部文件、Runbook 或架構設計文件,並根據檢索到的內容生成修復建議。

  • KubeCon Europe 2025
    • Superpowers for Humans of Kubernetes: How K8sGPT Is Transforming Enterprise Ops - Alex Jones, AWS & Anais Urlichs, JP Morgan Chase
如何開始?
  1. 學習如何使用 RAG 與 LLM Agent(ex. 參加我的工作坊)
  2. 挑選一個簡單卻耗時的日常任務
  3. 將任務所有已知的知識存入向量數據庫
  4. 使用 RAG Agent 來回答問題
  5. 結合通訊軟體(如 Slack)來提供即時回答
  6. 根據使用者反饋不斷優化知識庫與回答方式

🔽

如何改進?
  1. 設定量化目標
  2. Evaluation 量化 RAG Agent 性能
  3. 根據 Evaluation 結果調整RAG,追求特定 Metrics(如回答準確率)提升
  4. 持續迭代:根據使用者反饋與新知識更新向量數據庫

https://chechia.net/slides/2025-06-05-devops-rag-internal-ai/#/32 / https://github.com/chechiachang/rag-workshop/blob/main/notebook/5_Evaluation.ipynb

持續迭代

RAG Agent + Slack Bot 整合就可以完成第一個迭代版本

graph LR subgraph " " direction LR A1(("RAG Agent")) B1("Slack") C1("Daily Jobs") A1 --實際使用--> B1 B1 --更新知識--> A1 B1 --Agent支援--> C1 C1 --使用回饋--> B1 end

從改善工程團隊品質出發,推廣到跨部門使用。 基於Evaluation與使用者體驗持續改進。

總結

  1. 什麼是 RAG
  2. 為什麼需要 RAG
  3. 為何需要內部知識庫
  4. RAG Agent 的優勢
  5. RAG Agent 的應用場景
  6. 如何開始/如何進步

Q & A

沒時間的話可以待會來找我聊天 🔽

MaiCoin: We are Hiring!!