一、总体架构
- 推理模型:使用豆包(火山引擎方舟)大模型,通过
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 工作流
- 用户输入 → 生成检索 query。
- 调用
kb.search→ 返回候选片段。 - 对候选内容压缩、去重。
- 构造提示词(包含引用格式),调用豆包生成答案。
- 对答案做二次自检,输出带引用的最终结果。
- 可选:将用户确认的新知识写回
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 体系,迭代优化。
- 数据闭环:将经过确认的回答回写知识库,逐渐丰富领域语料。
六、总结
搭建过程可以分三步走:
- 最小 MVP:本地知识库 + Doubao Embedding + 简单检索。
- 工具化:把检索/写入/系统功能通过 MCP 封装。
- Agent 编排:RAG 流程 + 自检 + 引用输出。
这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。