从零构建RAG知识库:CNB插件开发实战
什么是RAG?
RAG(Retrieval-Augmented Generation)是一种结合检索和生成的AI架构,特别适合构建企业级知识库。
核心流程
文档 → 分块(Chunking) → 向量化(Embedding) → 存储(Vector Store)
↓
用户查询 → 向量化 → 相似度检索 → 增强上下文 → LLM生成回答
项目架构
技术栈
- LangChain: RAG流程编排
- OpenAI Embedding: 文本向量化
- ChromaDB: 向量数据库
- Docker: 容器化部署
代码结构
knowledge-base/
├── app/
│ ├── embeddings.py # 向量化模块
│ ├── retriever.py # 检索模块
│ ├── generator.py # 生成模块
│ └── api.py # API接口
├── Dockerfile
├── requirements.txt
└── README.md
关键实现
文档分块策略
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?"]
)
chunks = splitter.split_text(document)
向量检索
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
RAG Chain
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4"),
retriever=retriever,
return_source_documents=True
)
优化技巧
1. 分块大小选择
- 太小:丢失上下文
- 太大:检索不精确
- 推荐:300-800 tokens
2. 检索增强
- 混合检索:向量 + BM25
- 重排序:用Cross-Encoder对结果重排
- 多轮检索:迭代优化查询
3. Prompt工程
template = """基于以下上下文回答问题。如果上下文不相关,请说明无法回答。
上下文:{context}
问题:{question}
回答:"""
CNB插件开发
插件配置
{
"name": "knowledge-base",
"version": "1.0.0",
"description": "RAG知识库插件",
"main": "app/api.py"
}
CI/CD
使用CNB的Pipeline功能,实现自动构建和部署。
成果
- 支持PDF/TXT/Markdown文档导入
- 响应时间 < 2秒
- 准确率 90%+
下一步
- 支持更多文档格式
- 实现多轮对话
- 添加用户权限管理
项目已开源在CNB:samsong/knowledge-base