標籤: 向量資料庫

  • 把技術書變成 Claude 助教

    把技術書變成 Claude 助教

    📌 本文重點

    • book-to-skill 把技術 PDF 變成 Claude 專屬助教
    • 透過向量搜尋,讓 Claude 有「依據地翻書」
    • 最適合工程師、考證照與公司內規查詢
    • 先選一本常用技術書技能化,再擴展到更多書

    一句話先講白:book-to-skill 能把一本厚厚的技術 PDF,變成你在 Claude 裡隨叫隨到的專屬助教,查手冊、問觀念、看範例都靠它。

    專案連結:https://github.com/virgiliojr94/book-to-skill


    核心功能:怎麼把「書」變成「技能」?

    book-to-skill 目標很單純:讓 Claude 能像熟讀那本書的助教一樣,回答你問題。背後大致分三步:

    💡 關鍵: book-to-skill 的核心價值是讓 Claude「有書可依」,回答都能對應到原書具體章節,而不是憑空生成


    1. 從 PDF 抽取結構化內容

    行動重點:先準備「可選字」的 PDF(不是純掃描圖片)。

    book-to-skill 會做的事:

    • 解析目錄、章節標題,切成「小段知識塊」(chunks)
    • 保留章節層級(例如:第 3 章 / 3.2 / 3.2.1),讓 Claude 知道上下文
    • 盡量區分:
    • 正文說明
    • 程式碼區塊
    • 小節標註(例如「Tip」「Warning」)

    這一步的效果:你問一個問題時,Claude 能直接定位該書第幾章、第幾節的內容來回答,而不是憑空亂講。


    2. 建立向量資料庫,讓 Claude 精準「翻書」

    行動重點:在執行流程前,要有一組向量資料庫(一般內建用本地或雲端向量引擎)。

    book-to-skill 裡,它會:

    • 把每個「知識塊」丟給嵌入模型(embedding)轉成向量
    • 存進向量資料庫
    • 之後你問問題時,用語義搜尋找出最相關的幾段內容

    簡單理解:你問問題 → 書中相關段落被找出 → Claude 再根據這些段落回答。這樣 Claude 的回答就「有根據」,不再只是通用知識。


    3. 生成 Claude 專用 skill:問答 / 解說 / 摘要

    book-to-skill 的最後一步,是幫你產生一個可在 Claude 中使用的「技能」(skill),裡面已經寫好:

    • 這個 skill 的用途:
    • 針對書內內容回答問題
    • 幫你做重點整理
    • 把書裡的概念轉成實作範例
    • 如何引用書中內容:
    • 優先用向量資料庫找到的段落
    • 如果找不到,就誠實說「這本書沒提」,不要亂掰
    • 回答格式:
    • 可以附上「出自第幾章、第幾節」
    • 可以整理成步驟、表格或程式碼範例

    行動重點:

    • 你完成轉換後,會得到一個可以在 Claude Code / Skills 面板中載入的 skill
    • 之後在任何對話裡打開這個 skill,就像多了一位「專門只看過這本書」的助教

    💡 關鍵: skill 的規則會強制 Claude「找不到就說沒提」,大幅降低亂掰與幻覺風險


    適合誰用:三種典型場景

    book-to-skill 最實用的地方是,把「一本大家都該看的技術書」,變成「團隊共享的 AI 助教」。以下三個最常見的用法:


    1. 工程師寫程式時查框架手冊

    場景

    • 例如 Spring Boot 官方指南、Django 文件、Kubernetes 手冊
    • 你在寫程式,突然忘了某個 annotation 或 config 怎麼寫

    用法

    • 把官方 PDF 或整理好的手冊丟進 book-to-skill
    • 在 Claude 裡問:
      -「依照這本書,@Transactional 在這種情境要注意什麼?」
      -「照書上的做法改寫下面這段程式碼。」

    效果:比直接問 Claude 靠譜,因為它會基於那本書的版本說明,不會混入網路上別的框架版本的寫法。


    2. 考證照:題目解析 + 重點複習

    場景

    • AWS / GCP / Cisco / 資安證照
    • 有一本官方考試指南 PDF

    用法

    • 先把官方指南變成 skill
    • 丟一題題目進 Claude,指示:
      -「用這本書的內容解析這題,並指出相關章節。」
      -「請依照書的架構,整理出本章考點清單。」

    效果

    • 不只是出答案,而是帶你回到書裡的原文解釋
    • 讀題 → 回書本 → 再回題目,形成一個穩定的複習 loop

    3. 團隊共用標準文件:把 PDF 內規變成「制度客服」

    場景

    • 公司有一本厚厚的「開發標準」「資安政策」「客服流程手冊」 PDF
    • 新人加入時,最常問:「這個情境要照哪條規範?」

    用法

    • 把這份內規 PDF 轉成 skill
    • 在 Claude 裡問:
      -「依照公司內規,如果客戶資料要保留超過 1 年,需要哪些批准?」
      -「這段 SOP 是否符合本書的流程條件?」

    效果

    • 變成一個24 小時不會累的規範客服
    • 即使文件沒人想翻,也能透過 Claude 查到正確條目

    💡 關鍵: 把「沒人願意翻的大部頭 PDF」轉成可問答的制度客服,是提升新手上手速度的低成本方法


    怎麼開始:一步一步把第一本書「技能化」

    這裡以最常見的情境:在本機跑 book-to-skill,然後在 Claude 中使用。流程大致三步:


    步驟 a:準備一份技術 PDF

    行動清單:

    1. 選一本你真的會常查的書,例如:
    2. 框架官方手冊
    3. 證照官方考試指南
    4. 公司內部規範 PDF
    5. 儘量選:
    6. 可選取文字的 PDF(非掃描圖片)
    7. 章節結構清晰,有目錄

    常見坑:

    • 純掃描 PDF:book-to-skill 需要 OCR 才能讀;如果原專案沒有整合 OCR,你要先用別的工具(如 OCR 軟體)轉成可選字的 PDF 再丟進來。
    • PDF 內嵌字型怪:解析時可能出現亂碼,建議先開啟確認文字是否正常。

    步驟 b:在本機或雲端部署 book-to-skill

    行動清單(以本機為例):

    1. 安裝必備環境:
    2. Python 3.x
    3. pip / uv / conda 任選一種套件管理
    4. Clone 專案:
    git clone https://github.com/virgiliojr94/book-to-skill.git
    cd book-to-skill
    
    1. 安裝依賴:
    pip install -r requirements.txt
    # 或依照 repo 說明使用對應工具
    
    1. 設定 API Key:

    2. 到 Anthropic 建立 API key

    3. 新增 .env(或依 repo 說明)填入:
    ANTHROPIC_API_KEY=你的_API_key
    

    常見坑:

    • 忘記設定地區 / 帳號權限,導致模型呼叫被拒
    • API key 放進 git repo:請務必把 .env 加入 .gitignore

    步驟 c:跑完一次轉換流程

    大致流程(名稱依實際 repo 為準):

    1. 執行轉換命令:
    python book_to_skill.py \
      --pdf path/to/your_book.pdf \
      --output ./skills/your_book_skill
    
    1. 轉換過程會:
    2. 解析 PDF → 切成章節 chunks
    3. 建立向量資料庫
    4. 生成對應的 Claude skill 定義檔(通常是 JSON / YAML)

    5. 完成後,你會得到:

    6. 一個可在 Claude 中註冊的 skill 定義
    7. 相關的向量資料檔案

    程式碼與公式處理注意:

    • 程式碼區塊:
    • 有些 PDF 把 code 斷在奇怪地方;轉換後可以抽查幾段,看縮排是否錯誤
    • 公式:
    • 以純文字形式存進向量庫,適合解釋概念,但不適合做精確 LaTeX 排版

    步驟 d:在 Claude 中載入並實際操作

    以「Claude Code + Skills」為例,操作大致如下(依當前產品 UI 為準):

    1. 打開 Claude Code → 找到 Skills / Plugins 管理頁面
    2. 選擇「匯入技能 / 自訂 skill」
    3. 指定 book-to-skill 生成的 skill 定義檔
    4. 啟用後,你可以:
    5. 在任何對話中切換到這個 skill
    6. 用自然語言指示:
      -「接下來所有解釋,都請只根據這本書。」
      -「請用書中的說明,幫我把這段程式碼改成推薦寫法。」

    常見使用習慣建議:


    book-to-skill 與一般 Claude 插件的差異

    如果你已經在看 Claude 插件市場,可能會有這個疑惑:「這算 plugin?skill?connector?」

    根據 Towards AI 的實測文章(The Only 11 Claude Plugins You Need in 2026),生態圈的命名確實有點亂。

    用一張表整理 book-to-skill 在這個世界觀裡的位置:

    名稱 核心功能 免費方案 適合誰
    book-to-skill 把 PDF 技術書轉成 Claude skill + 向量搜尋 開源,自架需 API 想把特定技術書變成助教的工程師 / 團隊
    一般 Claude 插件(plugin) 擴充 Claude 能力,如連結 Git、DB、工具 多數有免費層級 想接外部服務、做自動化工作流的使用者
    CLAUDE.md(設定檔) 定義專案規則、上下文、風格 內建免費 希望 Claude 像熟悉專案的隊友的開發者

    你可以這樣理解:

    • plugin / connector:讓 Claude 接到更多外部系統
    • book-to-skill:讓 Claude 多一個「專門熟讀某本書」的大腦
    • CLAUDE.md:告訴這個大腦「你在這個專案裡要怎麼說話、怎麼做事」

    收尾:先把「一本你最常翻的書」技能化

    最後給一個最簡單的行動建議:

    1. 一本你這一年一定會反覆查的技術書(而不是你覺得「應該讀」但其實不會打開的那種)。
    2. 用上面的步驟跑完一次 book-to-skill 流程。
    3. 在接下來一週寫程式或讀書時,逼自己所有相關問題先問 Claude 助教,看它給不給力;遇到錯誤答案,順手標記對應章節修正 prompt。

    等你把第一本書「技能化」成功,第二本、第三本就只是在重複同一套流程。真正的差別是:

    你不再只是「收藏 PDF」,而是把它們變成每天會主動被你用到的活教材。


    🚀 你現在可以做的事

    • 先在 GitHub 打開 book-to-skill 專案,確認環境需求與使用說明
    • 從你的電腦挑出一份「這一年一定會常查」的技術 PDF,檢查是否可選字且章節清晰
    • 在本機依照文中步驟跑完一次轉換,並在 Claude 中匯入 skill,開始用這本「技能化」的書來解決實際問題
  • 本地 LLM+RAG 架構:從 NASA CMO-DA 學部署

    本地 LLM+RAG 架構:從 NASA CMO-DA 學部署

    📌 本文重點

    • 斷網環境可用本地 LLM+RAG 解決醫療輔助
    • llama.cpp 搭配容器化可在受限硬體穩定推理
    • 使用 OSS 向量庫打造可控、可回滾的 RAG pipeline
    • 模型與知識庫需分版本管理確保合規與安全

    在太空任務這種完全斷網、硬體受限且高合規的環境,NASA 的 CMO-DA 醫療助手用一套可攜、可封裝的本地 LLM+RAG 架構,解決了三個常見痛點:

    1. 不依賴雲端:模型推理與檔案檢索都在本地完成,沒有外部服務依賴。
    2. 可控資源與效能:透過 llama.cpp + 容器化(RamaLama 類工具),在 CPU/GPU 都受限的情況下仍能穩定跑推理。
    3. 安全與更新邊界清楚:醫療場景下做到知識庫可更新但可 rollback,模型版本可控且遵守合規要求。

    💡 關鍵: 在完全斷網且高合規場景中,能本地推理並可回滾的 LLM+RAG 架構是可行且可維護的方案

    下面用 NASA CMO-DA 的思路,拆成一個可直接套用的本地 LLM+RAG 模板。


    重點說明

    1. 為何選擇 llama.cpp + 容器化工具做本地推理

    在 CMO-DA 這類場景,llama.cpp 有幾個關鍵優勢:

    • 硬體覆蓋廣:支援 x86、ARM、多種 GPU(CUDA、Metal、OpenCL 等),適合未知/多樣化載具(太空艙、工廠、船艦)。
    • GGUF 模型格式:支援量化(q4_0, q5_K 等),可以在有限記憶體上跑中大型模型。
    • 單一 binary,易封裝:搭配像 RamaLama 這種工具,把模型 + 推理程式封裝成容器映像,做到「模型即容器」。

    實際好處:

    • 對你來說,部署路徑變成:git pullcmake → 放入 GGUF 模型 → 打包成 container,不需要大堆框架整合。
    • DeepSeek V4 已合併進 llama.cpp 主幹,你可以直接在本地跑 DeepSeek V4 GGUF,在推理品質與效能上有更好的選擇。

    容器化工具(以 RamaLama 類工具為例)則負責:

    • 自動 GPU 偵測與穿透(在 Kubernetes / OpenShift 中把 GPU 資源暴露給容器)。
    • 統一啟動參數與模型路徑,讓模型像應用程式一樣可複製、可移動。

    💡 關鍵: 透過 GGUF 量化與「模型即容器」封裝,能在受限硬體上穩定部署中大型本地模型

    2. 斷網環境下的 RAG pipeline 設計

    本地 RAG 的核心是:不要依賴雲端向量服務,一切用自架的 OSS 向量庫

    常見 OSS 選擇:

    • Qdrant:Rust 實作,支援 HNSW、瀏覽器/邊緣友好,有好用 REST / gRPC API。
    • Milvus / Weaviate:功能更完整,適合資料量非常大但資源較充裕的內網環境。

    醫療場景(也是典型高合規場景)的設計要點:

    1. Chunking 策略
    2. 醫療指引、SOP 文件為單位,再切成 512–1024 tokens chunk,重點是維持語境完整。
    3. 加上 overlap(例如 128 tokens),避免答案跨 chunk 斷裂。
    4. 針對表格或 checklist,考慮以「row / section」為粒度,而不是固定 tokens。

    5. Embedding 模型本地化

    6. 選一個能放進 GGUF 或支援 CPU/GPU 的 embedding 模型,例如 bge-large 的量化版本或 MiniLM 類模型。
    7. 避免用雲端 embedding API,保證完全離線。

    8. 延遲與資源限制

    9. 查詢流程:Embedding → Vector search → Top-k 文件 → LLM 回答,每一步都要評估延遲。
    10. 太空艙/工廠場景中通常只有 1–2 張 GPU,LLM 推理延遲是主瓶頸,可以:
      • 調低 max_tokens 回答長度。
      • 預先計算並緩存常見問答(FAQ)以降低實時查詢負擔。

    💡 關鍵: 在離線場景中,512–1024 tokens chunk 加 128 overlap 能平衡上下文完整性與檢索效率

    3. GPU 自動偵測與穿透:Kubernetes / OpenShift 配置

    在 CMO-DA 中,他們透過類似 RamaLama 的工具,在 OpenShift 上做到:

    • 自動偵測節點是否有 GPU(透過標籤或 device plugin)。
    • 在 pod 內把 GPU 暴露給 llama.cpp

    對你來說,可以簡化成 Kubernetes YAML 設計:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: local-llm
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: local-llm
      template:
        metadata:
          labels:
            app: local-llm
        spec:
          containers:
            - name: llama-cpp
              image: your-registry/llama-cpp-gguf:latest
              args:
                - "--model=/models/med-llm.gguf"
                - "--ctx-size=4096"
                - "--n-gpu-layers=35"  # **關鍵參數**:LLM 分配到 GPU 的層數
              resources:
                limits:
                  nvidia.com/gpu: 1      # Kubernetes GPU 資源宣告
              volumeMounts:
                - name: models
                  mountPath: /models
          volumes:
            - name: models
              persistentVolumeClaim:
                claimName: llm-model-pvc
          nodeSelector:
            nvidia.com/gpu.present: "true"  # **GPU 自動偵測:只排程到有 GPU 的節點
    

    OpenShift 上同樣依賴 GPU Operator / device plugin,容器內不需要特殊程式碼,llama.cpp 會透過 CUDA / ROCm 自動偵測 GPU。


    實作範例:Minimal 本地 LLM+RAG PoC

    下面是一個可離線部署的小型 RAG 助理範例,組合:llama.cpp + DeepSeek V4 GGUF + Qdrant

    1. 準備模型與 llama.cpp

    # 取得最新 llama.cpp(含 DeepSeek V4 支援)
    git clone https://github.com/ggml-org/llama.cpp.git
    cd llama.cpp
    git pull
    cmake -B build
    cmake --build build -j
    
    # 假設你已下載 DeepSeek V4 GGUF 模型到 ./models/deepseek-v4-med.q4_0.gguf
    

    2. 啟動本地 Qdrant 向量庫

    docker run -d --name qdrant \
      -p 6333:6333 \
      -v qdrant_data:/qdrant/storage \
      qdrant/qdrant
    

    3. 建立 RAG Pipeline(Python 範例)

    import requests
    from sentence_transformers import SentenceTransformer
    
    # **Embedding 模型**:可替換為你量化後的本地模型
    embed_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
    
    QDRANT_URL = "http://localhost:6333"
    COLLECTION = "med_docs"
    
    def create_collection():
        body = {
            "vectors": {
                "size": 384,
                "distance": "Cosine"
            }
        }
        requests.put(f"{QDRANT_URL}/collections/{COLLECTION}", json=body).raise_for_status()
    
    def index_documents(docs):
        vectors = embed_model.encode([d["text"] for d in docs])
        points = [{
            "id": i,
            "vector": vectors[i].tolist(),
            "payload": docs[i]
        } for i in range(len(docs))]
        requests.put(f"{QDRANT_URL}/collections/{COLLECTION}/points", json={"points": points}).raise_for_status()
    
    def rag_search(query, top_k=3):
        vec = embed_model.encode([query])[0].tolist()
        body = {
            "vector": vec,
            "limit": top_k
        }
        res = requests.post(f"{QDRANT_URL}/collections/{COLLECTION}/points/search", json=body).json()
        return [r["payload"]["text"] for r in res]
    
    # 初始化
    create_collection()
    index_documents([
      {"text": "若出現輕微頭痛且無其他症狀,建議先休息並補充水分。"},
      {"text": "若有持續胸痛或呼吸困難,應立即啟動緊急醫療流程。"}
    ])
    
    print(rag_search("胸口痛怎麼辦?"))
    

    4. 將檢索結果交給 llama.cpp

    在本地,你可以用簡單的 HTTP wrapper 把 context 拼接給 llama.cpp--prompt

    ./build/bin/llama-cli \
      --model ./models/deepseek-v4-med.q4_0.gguf \
      --ctx-size 4096 \
      --n-gpu-layers 35 \
      --prompt "根據以下醫療指引回答問題:
    [指引1]
    若有持續胸痛或呼吸困難,應立即啟動緊急醫療流程。
    
    問題:胸口痛怎麼辦?"
    

    在正式專案中,你會把 Qdrant 的 top-k 結果串接到 prompt,組成完整 RAG 回答流程。


    建議與注意事項

    1. 醫療場景的安全邊界與 offline 更新策略

    醫療、工業安全等場景,關鍵是 模型與知識庫的版本分離

    • 模型(LLM)版本:透過容器映像管理,例如在 tag 中寫明版本:med-llm:v1.2.0
    • 知識庫(向量庫 + 原始文件)版本:在 Qdrant collection 命名中加入版本:med_docs_v2024_06

    更新策略建議:

    1. 離線同步
    2. 透過 USB / 專用線路將新模型(GGUF)與新向量庫 dump 帶到現場。
    3. 先在 staging 節點載入,跑自動化驗收測試(醫療 QA 集)。

    4. Rollback 機制

    5. 保留上一版模型映像與向量庫快照,決策錯誤時可以在幾分鐘內回退。
    6. 配置開關:只允許在非緊急任務時切換版本,避免任務中途變更行為。

    2. 常見坑與最佳實踐

    1. 坑:只量化模型但忘記量化記憶體 footprint
    2. 即使用 q4_0,context 太大(例如 32k)時仍可能爆 RAM。
    3. 建議:先用 --ctx-size=4096 做壓力測試,再逐步拉高。

    4. 坑:Chunk 太小導致回答失去上下文

    5. 斷網場景下沒有「多輪 call retriever 補充」的餘裕,chunk 要適度放大。
    6. 建議:醫療/工廠 SOP 至少維持 512–1024 tokens + 128 overlap

    7. 坑:GPU 穿透配置錯誤導致 fallback 到 CPU

    8. 沒有設 resources.limits.nvidia.com/gpu 或節點沒正確標記,pod 會跑在無 GPU 節點上。
    9. 建議:在 CI/CD 中加入簡單檢查:呼叫 nvidia-smillama.cpp GPU info API,確認有 GPU 再部署。

    10. 最佳實踐:在高合規場景用「白名單指令 + RAG」模式

    11. 不允許模型「自由想像」,回答必須引用 RAG 檢索到的片段。
    12. prompt 設計中加入:「只能根據提供的文件回答,若無相關資訊請回答『資料不足』」,降低幻覺風險。

    總結來說,NASA CMO-DA 的做法給了我們一個清晰模板:llama.cpp + 容器化 + OSS 向量庫 + 可控版本策略。只要把這套思路搬到你的工廠、船艦、礦場或企業內網,就能在斷網或高合規環境下建立一個可維護、可升級又安全的本地 LLM+RAG 助理。

    🚀 你現在可以做的事

    • 在 GitHub 搜尋並 git clone 官方 llama.cpp 專案,編譯並測試本地推理
    • 使用 Docker 拉起 Qdrant,依照文中 Python 範例建立一個最小 RAG PoC
    • 寫一份 Kubernetes Deployment YAML,把你的 GGUF 模型封裝成「模型即容器」,並在測試環境驗證 GPU 穿透与延遲表现