到 GitHub 取得原始碼
8.1.0 支援 MCP 2026-07-28 規格與新版 OAuth

企業知識庫問答系統 答案逐句附出處

AskMiao 先查證再回答:混合檢索內部文件,必要時上網查證,每個論點以 [n] 對回原文段落或網頁;知識庫查不到,就照實說。

  • MIT開源授權,可自行架設
  • 5家模型供應商,皆可呼叫工具
  • 28種文件格式,掃描 PDF 可 OCR
  • 300秒內未核准的工具呼叫視為拒絕

支援的模型供應商與開源元件

  • OpenAI
  • Anthropic Claude
  • Google Gemini
  • Microsoft Foundry
  • Ollama
  • Model Context Protocol
  • Hugging Face
  • FastAPI
  • Python
  • React
  • TypeScript
  • Vite
  • Bun
  • PostgreSQL
  • SQLite
  • LangChain
  • DuckDuckGo

運作方式

從提問到有出處的答案,四個步驟

Agent 自己決定要查知識庫、統計記錄、上網搜尋或呼叫 API,每一步都記在研究過程裡;會改動外部系統的工具,執行前先問你。

  1. 01

    提問,可以附上圖片與檔案

    每則訊息最多 5 個附件,單檔 15 MiB;圖片交給視覺模型,文字類附件抽取內容併入提問。推理深度有六個檔位,模型不支援的檔位會停用。

    gpt-5 深度 (High)
    • 無 (None)
    • 輕度 (Low)
    • 標準 (Medium)
    • 深度 (High)
    • 極致 (X-High)
    • 最大 (Max)此模型不支援
    11 月排班表.png248 KB

    幫我請 11/20、11/21 兩天特休,順便提醒我請假規定。

  2. 02

    Agent 自己決定查哪裡

    ReAct 迴圈以原生工具呼叫多輪蒐集資料:檢索知識庫、精確統計記錄、上網搜尋、閱讀網頁,或呼叫管理員匯入的 API。每一步的參數、結果與耗時即時串流到畫面上。

    研究中:hr_create_leave(步驟 3)

    1. 檢索內部知識庫特休 申請 期限 簽核3 段通過相關性門檻
      0.84 秒
    2. hr_leave_balanceGET hr.example.com/v1/employees/E1042/leave-balance{"annual_remaining_days": 9}
      0.42 秒
    3. hr_create_leavePOST hr.example.com/v1/leave-requests暫停,等待發問者核准
      暫停中
  3. 03

    會改動資料的工具,先問過你

    POST、PUT、DELETE 等方法的 API 工具與 MCP 伺服器預設需要核准。只有發問者能按下核准,300 秒沒有回應就當成拒絕。按下卡片上的按鈕試試看。

    AI 想執行外部工具,需要你確認

    工具
    建立請假單
    送往
    POST hr.example.com/v1/leave-requests
    employee_id
    E1042
    leave_type
    annual
    start_date
    2026-11-20
    end_date
    2026-11-21

    此工具可能會修改外部系統的資料。請逐一確認每個參數與送出位置再核准;未回應會在 5:00 後視為拒絕。

    1. step_start{"step": 3, "tool": "hr_create_leave"}
    2. approval_required{"approval_id": "q3VxT0bL8mYc…", "target": "POST hr.example.com/v1/leave-requests"}

  4. 04

    每個 [n] 都對得回原文

    每次提問建立一張引用編號表,知識庫片段與網頁第一次出現時配號。來源只列實際被引用的條目,對不到來源的編號在送出前就移除。

    已送出 11/20 至 11/21 的特休申請,單號 LR-20261120-0418。特休須在假期開始前三個工作天提出,送出後由直屬主管簽核;主管三個工作天內未簽核,會自動轉給部門經理。

    參考來源 1員工請假辦法.pdf段落 4 2員工請假辦法.pdf段落 7 3簽核作業要點.docx段落 2

介紹影片

75 秒看一個問題怎麼被查證

提問、自主研究、逐句標註出處、工具核准與安全防護,一次看完。畫面取自實際執行的 AskMiao,回答由本機 Ollama 模型產生。

影片文字稿
  1. 0:00AskMiao,開源的 Agentic RAG 知識庫對話系統。
  2. 0:06AI 回答很快,但你敢直接拿去用嗎?AskMiao 讓每句結論都對得回原文。
  3. 0:12提問:「下個月去東京出差,住宿和膳雜費上限各是多少?」Agent 先啟用 travel-checklist 技能,再檢索內部知識庫。
  4. 0:18答案逐句標上 [n]:出發前 14 個工作日 [2]、每晚上限 5,500 元 [3]、每日美金 50 至 80 元 [1]。
  5. 0:24點開 [1],看到原文段落與相關度。
  6. 0:30FAISS 向量與 BM25 兩軌檢索,以 RRF 依名次融合,Cross-Encoder 重排後只把過門檻的段落交給 Agent。
  7. 0:36會改動外部系統的工具,執行前先問過你;按下拒絕,請求就不會送出。
  8. 0:426.0.0 新功能:Agent Skills,輸入 / 叫出專業做法;MCP 支援 Streamable HTTP 與 OAuth,OpenAPI 匯入一併帶上認證。
  9. 0:48每個出站請求都要過九道檢查,另有登入失敗節流、改密碼即撤銷權杖與工具憑證加密存放。
  10. 0:54五家模型共用一層介面;影片裡的回答都由本機 Ollama 的 nemotron-3.5-bolt 產生。
  11. 1:00自主研究,答案有出處。github.com/Scorpio-meow/AskMiao,MIT 授權。

混合檢索

兩軌檢索,依名次融合,重排機率把關

向量與 BM25 每次都跑,以 RRF 依名次融合,再由 Cross-Encoder 重排。重排機率低於門檻的片段一律濾除,全部沒過就回報查無資料,不拿無關片段硬答。

  1. 提問
    1. 向量檢索FAISS · bge-small-zh
    2. BM25jieba 詞+漢字單字與雙字
    3. 精確比對網址、貼文 ID、日期、@帳號
  2. RRF 融合Σ 1 / (RRF_K + 名次)
  3. Cross-Encoder 重排bge-reranker-base,可用 OpenVINO GPU
  4. 相關性門檻≥ RERANK_RELEVANCE_THRESHOLD
選一個問題

向量前 5 名

    BM25 前 5 名

      融合後重排重排機率,對數刻度

        • 候選召回

          1.000

          原本 0.971。BM25 加入漢字單字與雙字欄位後,重排前的候選已涵蓋內建基準的所有正解。

        • nDCG@5

          0.907

          原本 0.898。內建基準 12 份企業文件與《大眾捷運法》,103 個正例、15 個反例。

        • OpenVINO 重排,10 筆候選

          0.51秒

          原本 2.83 秒。依實際候選數送出,Intel Core Ultra 7 155U 內顯實測,前 1 名與門檻判定和 PyTorch 相同。

        功能

        接得上公司既有的模型、文件與系統

        各帳號用自己的模型連線,管理員匯入 API 與 MCP 伺服器、上傳技能,Agent 每次提問時依需要取用。

        • Agent Skills:用得上才載入的做法

          上傳 SKILL.md 或技能 zip,模型平時只看名稱與描述,用得上才載入內文。也能在訊息開頭輸入 /技能名稱 直接指定。

          • /travel-checklist出差前的申請、住宿與膳雜費上限
          • /contract-review依法務範本檢查合約條款
          • /incident-report資安事件通報格式與時限

          /tra

        • 五家供應商,各帳號自己的連線

          五家都能呼叫工具與串流。管理員可開放共用連線,並替文件摘要與 OCR 指定系統模型。

          • OpenAI
          • Anthropic Claude
          • Google Gemini
          • Microsoft Foundry
          • Ollama(本機)
        • 匯入 OpenAPI,連工作流程一起

          支援 Swagger 2.0、OpenAPI 3.0~3.2 與 Arazzo 1.0/1.1 工作流程,匯入前可先套用 Overlay。

          • GET/v1/employees/{id}/leave-balance
          • POST/v1/leave-requests需要核准
          • QUERY/v1/leave-requests
          • Arazzoapply-and-notify3 步
        • MCP 2026-07-28 與 OAuth

          以 server/discover 協商無狀態協定,舊版伺服器自動退回交握;OAuth 比對 iss 並強制 PKCE。

          MCP-Protocol-Version: 2026-07-28
          Mcp-Method: tools/call
          Mcp-Name: get_current_time
          readOnlyHint: true · destructiveHint: false
        • 28 種格式,掃描 PDF 也讀得到

          PDF 先補齊字型的字元對應再擷取,沒有文字層的頁面交給管理員指定的 OCR 模型;JSON、CSV、XLSX 逐筆成為片段。

          • .pdf
          • .docx
          • .pptx
          • .xlsx
          • .csv
          • .json
          • .jsonl
          • .yaml
          • .md
          • .html
          • .sql
          • .py
          • +16
        • 一個請求 ID,串起所有紀錄

          X-Request-ID 寫在回應標頭、該請求的每一行日誌、security.log 與串流的 error 事件。紀錄不含密碼、權杖、Cookie 與對話內容。

          10:42:07 INFO  [a3f9c2e1] POST /api/chat/send 200 · 9.61 s
          10:42:07 INFO  [a3f9c2e1] llm gpt-5 ok · first token 1.12 s · 2,184 tokens
          10:42:08 INFO  [a3f9c2e1] tool search_knowledge_base ok · 0.84 s
          10:42:09 INFO  [a3f9c2e1] retrieval query_chars=12 passed=3

        安全

        三輪安全稽核,防護是預設路徑

        工具結果一律當成不可信資料,web_fetch 只讀使用者訊息或本次工具結果中原樣出現過的網址,出站請求逐跳驗證並把連線固定在核可的 IP。

        1. 協定只允許 http、https
        2. 帳號密碼網址不得含帳號密碼
        3. 連接埠擋下資料庫、快取與遠端管理服務
        4. 主機名稱擋下保留名稱與內部網域後綴
        5. IP 網段擋下私有、迴環、連結本地與保留網段
        6. DNS 與固定 IP伺服器端執行
        7. 逐跳轉址伺服器端執行

        • 權杖對應資料庫帳號

          RSA-2048 簽署 JWT,每次請求都以帳號目前的狀態與權限為準;變更密碼或停用帳號,先前的權杖一律失效。

        • 登入失敗節流

          Argon2 雜湊密碼;同一帳號或來源位址失敗達門檻就暫停登入,回傳 429 與 Retry-After。

        • 工具憑證加密存放

          API 工具與 MCP 的標頭、金鑰以 Fernet 加密寫入資料庫,管理 API 只回 ••••••••。

        • 工具結果是不可信資料

          每次提問以不同 id 的 untrusted_tool_result 標記包住結果,文件或網頁夾帶的指令不會被執行。

        • 每個入口都有上限

          單則訊息 20,000 字、附件 5 個、每人同時 2 個回答串流,超過就回 413、422 或 429。

        • 錯誤只回代碼

          未預期的例外只對外回隨機錯誤代碼,堆疊寫進伺服器日誌;日誌雙層脫敏,權杖顯示為 [REDACTED]。

        快速開始

        三個步驟,在本機跑起來

        需要 Python 3.12 以上與 Bun 1.x;預設用 SQLite,不需另裝資料庫。首次啟動會下載約 1.2 GB 的嵌入與重排模型。

        1. 1

          取得原始碼

          git clone https://github.com/Scorpio-meow/AskMiao.git
          cd AskMiao
        2. 2

          設定並啟動後端

          cd backend
          python -m venv .venv
          source .venv/bin/activate
          pip install -r requirements.txt
          cp .env.example .env
          python main.py

          啟動前在 .env 把 DATABASE_URL 改成 sqlite:///./chatbot.db,並換上自己產生的 TOOL_SECRETS_KEY。

        3. 3

          啟動前端,建立管理員

          cd frontend
          bun install
          bun run dev

          在 backend/ 執行 python scripts/create_user.py --username admin --email admin@example.com --admin,再開啟 http://localhost:3000 登入。

        閱讀完整安裝說明

        版本

        各版本的重點

        不相容的變更都升主版號,升級步驟寫在升級指南;每個版本的完整變更記在變更紀錄。

        1. 8.1.0最新

          MCP 2026-07-28:無狀態請求與 server/discover,相容舊版伺服器;OAuth 比對 iss、強制 PKCE,支援 Client ID Metadata Document 與追加授權。

        2. 8.0.0

          系統模型、OpenAPI 3.2 與 Arazzo、BM25 漢字單字與雙字欄位、請求 ID 與詳細日誌、聊天與 AI 工具頁重新設計。

        3. 7.0.0

          各帳號的 API 連線與共用連線、使用者管理、聯網白名單逐跳檢查。

        4. 6.0.0

          Agent Skills、MCP Streamable HTTP 與 OAuth、Microsoft Foundry,推理深度對應五家供應商。

        5. 5.0.0

          第二輪安全稽核:登入節流、變更密碼撤銷權杖、工具憑證加密、相依套件雜湊鎖定。

        6. 4.0.0

          安全稽核:權杖綁定資料庫帳號、工具呼叫需要核准、出站連線固定 IP、資源上限。

        7. 3.0.0

          chunk_id 索引、RRF 與相關性門檻、答案引用出處、工具信任邊界。

        8. 2.x

          Agentic RAG 自主研究、多模態對話與文件摘要、自訂 API 工具與 MCP、集中式 SSRF 防護。

        9. 1.0.0

          混合 RAG 與安全基礎。