Step 1 · 准备小知识库
先选 10-20 篇你真的会问的问题相关文档,保存到 data/raw/。不要一开始就塞几千篇。
验收:每篇文档都有 source/title/updated_at。
Step 2 · 文本清洗与切分
目标不是切得越碎越好,而是让每个 chunk 能独立回答一个小问题。
def chunk_text(text: str, size: int = 700, overlap: int = 100):
chunks = []
start = 0
while start < len(text):
chunks.append(text[start:start + size])
start += size - overlap
return chunks记录三组参数:500/80、700/100、1000/150,后面用评测结果选。
Step 3 · 向量化与入库
先用 Chroma 做本地 demo。重点保存 metadata,不然后面无法引用和排障。
metadata = {
"source": "docs/fastapi.md",
"title": "FastAPI 笔记",
"chunk_index": 3,
}Step 4 · Top-K 检索
固定 10 个问题,记录每个问题 Top-5 是否包含正确片段。先看召回,再谈生成。
Step 5 · 生成答案与引用
答案必须带来源,否则面试里很难证明“不是模型自己编的”。
回答格式:
1. 结论
2. 依据片段
3. 来源列表Step 6 · Hybrid 检索
对专有名词、错误码、API 名称,关键词检索往往比向量更稳。加入 BM25 或简单关键词规则做对照。
Step 7 · Rerank
扩大召回到 Top-20,再重排到 Top-5。记录:重排前后命中率、延迟、成本。
Step 8 · 评测集
准备 eval/questions.jsonl:
{"question":"FastAPI 如何做流式返回?","expected_keywords":["StreamingResponse","SSE"],"expected_sources":["fastapi"]}最小指标:
- retrieval_hit_rate
- answer_contains_expected_keywords
- citation_present
- latency_ms
Step 9 · 坏例复盘
每个坏例只归一类:
- 文档缺失
- 切分失败
- 检索没召回
- 重排错
- prompt 没约束
- 模型能力不足
验收:至少修 3 个坏例,并写清修复前后的指标。