使用 LangChain + Ollama + FAISS 构建本地 RAG 应用(附完整代码)
·
一、前言
RAG(Retrieval-Augmented Generation,检索增强生成)是当前大模型应用中的热门技术,它通过结合外部知识库与大语言模型(LLM),有效缓解了模型“幻觉”问题,提升了回答的准确性与可信度。
本文将手把手教你使用 LangChain + Ollama + FAISS 在本地搭建一个轻量级 RAG 应用,无需联网、不依赖商业 API,完全开源免费!
二、技术栈简介
| 组件 | 作用 |
|---|---|
| Ollama | 本地运行开源大模型(如 Qwen、Llama3 等) |
| bge-m3 | 强大的中文/多语言嵌入模型(用于向量化文本) |
| FAISS | Facebook 开源的高效向量相似性检索库 |
| LangChain | 构建 LLM 应用的框架,提供模块化链式调用 |
✅ 所有组件均可在本地运行,适合开发、测试和私有部署。
三、环境准备
确保已安装以下依赖:
pip install langchain langchain-ollama langchain-community langchain-text-splitters faiss-cpu
并启动 Ollama 服务(默认端口 11434):
ollama serve
拉取所需模型:
ollama pull qwen2.5:7b # 用于生成回答
ollama pull bge-m3 # 用于文本嵌入
四、完整代码实现
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 1. 初始化 Embedding 模型(使用 Ollama 提供的 bge-m3)
embeddings = OllamaEmbeddings(
model="bge-m3",
base_url="http://localhost:11434"
)
# 2. 准备知识库文档(实际项目中可从 PDF、网页、数据库等加载)
docs = [
Document(page_content="RAG 是检索增强生成技术"),
Document(page_content="FAISS 是向量检索库"),
Document(page_content="LangChain 是 LLM 应用框架"),
]
# 3. 文本切分(避免 chunk 过长影响检索精度)
splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=50
)
docs = splitter.split_documents(docs)
# 4. 构建向量数据库(FAISS)
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 检索最相关的 3 个片段
# 5. 初始化本地大模型(Qwen2.5 7B)
llm = ChatOllama(
model="qwen2.5:7b",
temperature=0 # 降低随机性,保证回答稳定
)
# 6. 定义提示词模板(强调“仅基于上下文回答”)
prompt = ChatPromptTemplate.from_messages([
("system", "你只能根据上下文回答,不允许编造"),
("human", "上下文:\n{context}\n\n问题:{question}")
])
# 7. 构建 RAG 链(使用 LangChain Expression Language, LCEL)
rag_chain = (
{
"context": retriever,
"question": RunnablePassthrough()
}
| prompt
| llm
)
# 8. 执行查询
result = rag_chain.invoke("什么是 RAG?")
print(result.content)

五、运行结果
执行上述代码后,输出如下(具体措辞可能因模型版本略有差异):
RAG 是检索增强生成技术。
✅ 模型准确地从知识库中检索到相关信息,并严格依据上下文作答,没有“胡说八道”。
六、扩展建议
- 接入真实知识库:将
docs替换为从.txt、.pdf或数据库中读取的内容。 - 优化检索效果:调整
chunk_size、尝试不同 embedding 模型(如nomic-embed-text)。 - 部署 Web 界面:结合 Streamlit 或 Gradio 快速构建问答界面。
- 持久化向量库:使用
vectorstore.save_local("faiss_index")保存,避免重复加载。
七、总结
通过本文,我们成功在本地搭建了一个完整的 RAG 应用流程:
文档 → 切分 → 嵌入 → 向量检索 → 大模型生成
整个过程无需云端服务,数据完全私有,非常适合企业内部知识库问答、个人笔记助手等场景。
🔔 提示:Ollama 对中文支持良好,
bge-m3和qwen2.5均为国产优秀模型,值得推荐!
欢迎点赞、收藏、评论交流!
如果你觉得这篇文章对你有帮助,不妨点个 👍 支持一下!
更多推荐
所有评论(0)