一、前言

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 是检索增强生成技术。

✅ 模型准确地从知识库中检索到相关信息,并严格依据上下文作答,没有“胡说八道”。


六、扩展建议

  1. 接入真实知识库:将 docs 替换为从 .txt.pdf 或数据库中读取的内容。
  2. 优化检索效果:调整 chunk_size、尝试不同 embedding 模型(如 nomic-embed-text)。
  3. 部署 Web 界面:结合 Streamlit 或 Gradio 快速构建问答界面。
  4. 持久化向量库:使用 vectorstore.save_local("faiss_index") 保存,避免重复加载。

七、总结

通过本文,我们成功在本地搭建了一个完整的 RAG 应用流程:

文档 → 切分 → 嵌入 → 向量检索 → 大模型生成

整个过程无需云端服务,数据完全私有,非常适合企业内部知识库问答、个人笔记助手等场景。

🔔 提示:Ollama 对中文支持良好,bge-m3qwen2.5 均为国产优秀模型,值得推荐!


欢迎点赞、收藏、评论交流!
如果你觉得这篇文章对你有帮助,不妨点个 👍 支持一下!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐