基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

0 阅读3分钟

一、总体架构

  • 推理模型:使用豆包(火山引擎方舟)大模型,通过 chat/completions 接口调用(兼容 OpenAI 风格)。
  • 向量库:本地部署 Qdrant 或 Chroma,向量化模型用 Doubao-embedding 系列。
  • 检索层:采用混合检索(向量召回 + 关键词 BM25/Elastic),再用豆包做轻量重排。
  • MCP 工具层:将「知识库检索/写入」「文件系统」「外部搜索」封装为 MCP Server 工具,对外暴露标准接口。
  • Agent 逻辑:基于 RAG 流程(检索→压缩→生成→校对→引用),通过 MCP 工具调用统一调度。
  • 安全:密钥管理、最小权限、身份集中治理,避免凭证碎片化。

二、实施步骤

1. 接入豆包 API

  • 在火山方舟控制台生成 API Key,配置接入点。
  • 对话接口:POST https://ark.cn-beijing.volces.com/api/v3/chat/completions
  • 向量化接口:POST https://ark.cn-beijing.volces.com/api/v3/embeddings

2. 知识库构建

  • 解析文档:提取文本(PDF/Word/Markdown/网页快照)。
  • 分块存储:按语义边界切片,附加元数据(文件名、页码、URL)。
  • 向量化入库:调用 Doubao-embedding,存入本地 Qdrant/Chroma。
  • 检索+重排:先做向量召回,再调用豆包 Chat 对候选结果打分,得到 Top-k。

3. MCP 封装

  • 使用 MCP Python SDK 定义工具,例如:
    • kb.search(query, top_k):从本地知识库检索片段。
    • kb.upsert(docs):写入或更新知识。
    • fs.read(path):读取文件系统内容。
  • MCP Client(桌面端/服务端 Agent)可以自动发现并调用这些工具。

4. Agent 工作流

  1. 用户输入 → 生成检索 query。
  2. 调用 kb.search → 返回候选片段。
  3. 对候选内容压缩、去重。
  4. 构造提示词(包含引用格式),调用豆包生成答案。
  5. 对答案做二次自检,输出带引用的最终结果。
  6. 可选:将用户确认的新知识写回 kb.upsert

三、关键代码骨架(Python 简化版)

A. 向量化与入库

import os, requests, chromadb
from chromadb.config import Settings

API_KEY = os.getenv("ARK_API_KEY")
EMBED_URL = "https://ark.cn-beijing.volces.com/api/v3/embeddings"
MODEL = "doubao-embedding-text-240515"

def embed_texts(texts):
    r = requests.post(
        EMBED_URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={"model": MODEL, "input": texts}
    )
    return [d["embedding"] for d in r.json()["data"]]

client = chromadb.Client(Settings(persist_directory="./kb"))
coll = client.get_or_create_collection("docs")

def upsert_docs(docs):
    embeds = embed_texts([d["text"] for d in docs])
    coll.upsert(
        ids=[d["id"] for d in docs],
        documents=[d["text"] for d in docs],
        metadatas=[d["meta"] for d in docs],
        embeddings=embeds
    )

B. MCP Server(Python SDK)

from mcp.server.fastmcp import FastMCP, Schema

app = FastMCP("local-kb")

class SearchArgs(Schema):
    query: str
    top_k: int = 5

@app.tool()
def kb_search(args: SearchArgs):
    res = coll.query(query_texts=[args.query], n_results=args.top_k)
    return [{"id": res["ids"][0][i], "text": res["documents"][0][i]} for i in range(len(res["ids"][0]))]

if __name__ == "__main__":
    app.run()

四、安全与运维

  • 密钥管理:API Key 存储在环境变量或本地密钥管理服务。
  • 最小权限:只开放必要的工具,不直接暴露系统命令。
  • 日志审计:记录用户调用了哪些工具、读取了哪些文档。
  • 凭证治理:建议支持临时凭证与可撤销授权,避免 MCP 工具泄露。

五、迭代与评估

  • 离线指标:检索召回率@k、幻觉率、引用完整性。
  • 在线反馈:用户是否接受回答,是否追问,答案是否含引用。
  • 自动化评测:使用 RAGAS 或 LLM-as-Judge 体系,迭代优化。
  • 数据闭环:将经过确认的回答回写知识库,逐渐丰富领域语料。

六、总结

搭建过程可以分三步走:

  1. 最小 MVP:本地知识库 + Doubao Embedding + 简单检索。
  2. 工具化:把检索/写入/系统功能通过 MCP 封装。
  3. Agent 编排:RAG 流程 + 自检 + 引用输出。

这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。