AI RAG开发学习:用Python和Chroma搭建本地知识库问答
RAG(检索增强生成)的核心不是训练新模型,而是让大模型在回答前先检索你提供的资料,把检索到的片段拼进提示词。
这样回答有依据、能引用私有文档,也方便更新知识。
本文用 Python 本地跑通一个最小可用的 RAG 流程,不依赖付费 API,适合零基础跟做。
先明确你要准备什么
动手前需要一台能装 Python 的电脑或服务器,建议 Python 3.9 以上。
本文用 sentence-transformers 生成向量,用 Chroma 做本地向量库,大模型部分可以先接一个本地或在线模型,但流程重点是检索环节。
安装依赖:
python -m venv rag-env
source rag-env/bin/activate
pip install sentence-transformers chromadb
Windows 下激活命令换成 rag-env\Scripts\activate。
如果下载模型慢,先设置镜像或手动下载模型目录,后面会讲。
把文档切成能检索的小块
RAG 第一步不是写提示词,而是把资料切成大小合适的片段。
切太大,检索不精准;
切太小,上下文丢失。
建议每段 300~500 字,保留段落边界。
下面示例读取一个纯文本文件并按段落切分:
from pathlib import Path
def load_chunks(path, max_len=400):
text = Path(path).read_text(encoding='utf-8')
paragraphs = [p.strip() for p in text.split('\n') if p.strip()]
chunks = []
for p in paragraphs:
if len(p) <= max_len:
chunks.append(p)
else:
for i in range(0, len(p), max_len):
chunks.append(p[i:i+max_len])
return chunks
实际项目中还要处理 PDF、Word 和网页,但先跑通纯文本,确认检索效果后再扩展格式。
生成向量并写入 Chroma
向量化就是把文本变成一组数字,语义相近的文本向量距离更近。
这里用 all-MiniLM-L6-v2 模型,体积小、适合本地测试。
from sentence_transformers import SentenceTransformer
import chromadb
model = SentenceTransformer('all-MiniLM-L6-v2')
client = chromadb.Client()
collection = client.create_collection('my_docs')
chunks = load_chunks('docs.txt')
embeddings = model.encode(chunks).tolist()
collection.add(
documents=chunks,
embeddings=embeddings,
ids=[str(i) for i in range(len(chunks))]
)
运行后没有报错,说明向量库写入了。
如果提示模型下载失败,检查网络或提前把模型缓存到本地目录,再用本地路径加载。
检索并拼装提示词
用户提问时,先把问题向量化,再到 Chroma 中查最相似的片段,最后把片段和问题一起交给大模型。
question = 'RAG 的切片大小怎么定?'
q_emb = model.encode([question]).tolist()
results = collection.query(query_embeddings=q_emb, n_results=3)
context = '\n'.join(results['documents'][0])
prompt = f'根据以下资料回答问题:\n{context}\n\n问题:{question}'
print(prompt)
这段代码只完成检索和提示词拼装,真正生成回答需要再接一个模型接口。
重点检查 results['documents'][0] 是否包含与问题相关的段落,如果不相关,先调整切片大小或换向量模型,而不是急着改提示词。
避坑与效果验证
切片不要按固定字数硬切,尽量保留段落和标题边界,否则检索到的片段可能缺上下文。
向量模型和查询模型要一致,入库和检索必须用同一个模型,否则向量空间不对应,结果会乱。
验证检索质量:准备 5 个已知答案的问题,看返回的前 3 个片段是否包含答案。
如果经常不包含,优先检查文档切片和向量模型,再考虑增加召回数量。
不要一开始就上大模型,先把检索环节调通,确认能返回正确片段,再接入生成模型,排错会简单很多。
RAG 开发学习的关键是理解“先检索、再生成”这条链路。
按本文步骤跑通本地最小流程后,再逐步替换文档解析、向量库和生成模型,就能扩展到自己的知识库问答场景。