什么是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