目的
小白快速本地实现RAG。
核心概念
RAG的基本工作流程
- 索引:将知识库文档进行切分、向量化,存入向量数据库。
- 检索:根据用户问题,从向量数据库中找出最相关的文档片段。
- 增强:将问题和检索到的片段一起组合成提示词。
- 生成:大模型基于增强后的提示词生成最终答案。
RAG的优势
| 特性 | 传统LLM | 微调模型 | RAG |
|---|---|---|---|
| 知识实时性 | ❌ 训练数据截止 | ❌ 训练数据截止 | ✅ 实时更新 |
| 私有数据支持 | ❌ 无法访问 | ⚠️ 需要训练 | ✅ 直接支持 |
| 减少幻觉 | ❌ 容易编造 | ⚠️ 有所改善 | ✅ 显著减少 |
| 答案可追溯 | ❌ 黑盒生成 | ❌ 黑盒生成 | ✅ 完全可追溯 |
| 成本效益 | ✅ 零训练成本 | ❌ 高成本训练 | ✅ 低成本构建 |
| 多领域适应 | ✅ 通用能力强 | ❌ 领域特定 | ✅ 灵活切换 |
| 部署速度 | ✅ 即时可用 | ❌ 数周至数月 | ✅ 数小时至数天 |
技术栈初探
向量数据库
| 数据库 | 核心优势 | 适用场景 |
|---|---|---|
| Milvus | 分布式架构,支持十亿级向量规模;支持多种索引算法(如IVF_FLAT、HNSW);支持向量与标量数据联合检索 | 大规模AI搜索(图像/视频/文本)、推荐系统、企业级知识库 |
| Chroma | 与LangChain等框架深度集成,可快速搭建RAG原型;API简单易用 | 快速原型验证、小规模语义搜索、开发测试 |
| Qdrant | Rust语言开发,查询延迟低(可在20ms内);支持动态数据更新与混合搜索 | 高并发实时检索、生成式AI应用(如聊天机器人) |
| PgVector | PostgreSQL扩展,完美融入现有SQL生态;支持ACID事务;开发门槛低 | 中小规模向量检索、现有PG生态升级 |
| Weaviate | 结合图数据库与向量检索;支持混合查询(向量+结构化过滤);内置BM25文本搜索 | 语义搜索、知识图谱、需要多条件混合检索的场景 |
嵌入模型
| 模型名称 | 维度 | 上下文长度 | 特点 | 适用场景 |
|---|---|---|---|---|
| BAAI/bge系列 | 384-1024 | 512 | 中文优化、开源、性能强劲 | 中文RAG首选 |
| text2vec系列 | 768-1024 | 512 | 中文社区活跃、轻量高效 | 中小规模中文应用 |
| M3E系列 | 1024-2048 | 512-8192 | 专门为中文优化、多任务训练 | 复杂中文语义理解 |
| OpenAI text-embedding | 1536 | 8192 | 英文表现优秀、稳定性高 | 英文为主的应用 |
| Cohere Embed | 384-1024 | 512 | 多语言支持、商业级服务 | 多语言商业应用 |
| E5系列 | 384-1024 | 512 | 中英文均衡、指令微调 | 中英文混合场景 |
大语言模型(国内)
| 模型名称 | 核心特点 | 主要适用场景 |
|---|---|---|
| 通义千问 (Qwen) | - 综合性能强劲,尤其在数学和编程领域表现突出 - 支持多模态输入(文本、图像)和联网搜索 - 开源协议宽松,生态活跃 | 多媒体内容分析、企业服务、跨模态推理任务 |
| DeepSeek | - 数学推理和代码生成能力强 - 强调高性价比和低成本部署 - 上下文窗口大 (64K),适合长文本分析 | 编程开发、复杂逻辑任务、学术研究、深度文本分析 |
| 文心一言 | - 中文语义理解细致,逻辑推理严谨 - 在医疗、法律等专业领域知识全面 - 生态集成度高,日均调用量大 | 政务、教育、创意写作、专业领域问答 |
| Kimi (月之暗面) | - 原生支持超长上下文(如32K) - 在长文本理解和内容生成方面有优势 | 长文档处理、内容创作、文本摘要 |
动手实践 - 搭建第一个RAG
核心组件选型
| 组件类型 | 推荐选择 | 特点 | 依赖 |
|---|---|---|---|
| 大语言模型 | Deepseek | 性价比高、中文优化 | Ollama |
| 嵌入模型 | BAAI/bge系列 | 中文表现优秀、开源免费 | Ollama |
| 向量数据库 | Chroma | 轻量、无序部署 | python包 |
| 开发框架 | LangChain | 生态丰富、文档完善 | python包 |
ollama安装
1、ollama
ollama pull bge-large:335m
ollama pull deepseek-r1:8b
代码实现
pip install langchain chromadb langchain-ollama langchain-community
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser
# 1. 初始化中文嵌入模型
embeddings = OllamaEmbeddings(
model="bge-large:335m"
)
# 2. 加载和切分文档
loader = TextLoader("docs/技术文档.txt", encoding='utf-8')
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
texts = text_splitter.split_documents(documents)
# 3. 构建向量数据库
vectorstore = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory="./chroma_db"
)
model = OllamaLLM(
base_url="http://127.0.0.1:11434",
model="deepseek-r1:8b",
temperature=0.3,
num_ctx=4096,
)
output_parser = StrOutputParser()
# 4. ollama 调用函数
def ask_llm(question, context):
prompt = f"""基于以下上下文回答问题:
上下文:
{context}
问题:{question}
如果上下文不包含相关信息,请回答“我不知道”。"""
prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的助手。请根据用户输入进行回复。"),
("user", prompt),
])
chain = prompt_template | model | output_parser
return chain.invoke({'question': question, 'context': context})
# 5. RAG查询流程
def rag_query(question):
# 检索相关文档
docs = vectorstore.similarity_search(question, k=3)
context = "\n".join([doc.page_content for doc in docs])
# 调用LLM生成答案
answer = ask_llm(question, context)
return answer, docs
# 测试
question = "如何配置数据库连接?"
answer, sources = rag_query(question)
print(f"问题:{question}")
print(f"答案:{answer}")
print(f"来源:{[doc.metadata.get('source', '') for doc in sources]}")
思考
- 检索不到
- 检索不准
- 上下文长度限制
- 多论对话如何解决
510

被折叠的 条评论
为什么被折叠?



