news 2026/7/17 6:35:02

基于Ollama和LangChain的RAG智能问答系统搭建指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Ollama和LangChain的RAG智能问答系统搭建指南

1. 项目概述:当大语言模型遇上外部知识库

去年第一次在本地部署大语言模型时,最大的痛点就是模型对专业领域知识的"信口开河"。直到尝试了RAG(检索增强生成)架构,才真正让7B参数的"小模型"展现出了超越其体量的专业能力。今天要分享的正是如何用Ollama+LangChain搭建一个能消化企业文档、技术手册甚至个人笔记的智能问答系统。

这个方案最吸引人的地方在于:不需要微调模型就能获得领域知识处理能力。通过将PDF/Word等文档转化为向量数据库,当用户提问时,系统会先检索相关知识片段,再将片段和问题一起喂给大模型生成回答。实测在医疗咨询场景中,采用RAG架构的Mistral-7B模型准确率比裸模型提高了63%。

2. 核心组件选型与原理

2.1 Ollama:本地模型的瑞士军刀

选择Ollama而非直接使用transformers库的原因很实际:

  • 内置模型量化功能(支持GGUF格式)
  • 统一的REST API接口
  • 内存管理更友好(自动卸载闲置模型)

安装时建议使用国内镜像源加速:

curl -fsSL https://ollama.mirror.xyz/install.sh | sh

2.2 LangChain:知识处理的流水线

LangChain的核心价值在于提供了标准化组件:

  • Document Loaders:支持PDF/Markdown/HTML等格式
  • Text Splitters:按语义切分文档(推荐用RecursiveCharacterTextSplitter)
  • Embedding Models:选用bge-small-zh-v1.5中文向量模型
  • Vector Stores:ChromaDB的单机版足够应付10万级文档

2.3 RAG架构的工作流程

  1. 文档预处理:PDF→文本→语义分块→向量化
  2. 查询处理:问题向量化→向量数据库相似度检索
  3. 答案生成:将检索结果作为上下文注入prompt

3. 实战搭建步骤

3.1 环境准备

# 最小化依赖 pip install ollama langchain chromadb sentence-transformers pypdf

3.2 文档处理流水线

from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter loader = PyPDFLoader("医疗手册.pdf") text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", "。", "!", "?"] ) docs = text_splitter.split_documents(loader.load())

3.3 构建向量数据库

from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma embedding = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", encode_kwargs={'normalize_embeddings': True} ) vector_db = Chroma.from_documents(docs, embedding, persist_directory="./med_db")

3.4 实现问答链

from langchain.chains import RetrievalQA from langchain.llms import Ollama llm = Ollama(model="mistral:7b-instruct") qa_chain = RetrievalQA.from_chain_type( llm, retriever=vector_db.as_retriever(search_kwargs={"k": 3}), chain_type="stuff" ) response = qa_chain.run("糖尿病患者应该怎么控制饮食?")

4. 性能优化技巧

4.1 分块策略优化

  • 技术文档:按章节标题分块(用MarkdownHeaderTextSplitter)
  • 会议纪要:按发言者分块
  • 研究论文:摘要/方法/结果分别处理

4.2 混合检索方案

结合关键词搜索与向量搜索:

from langchain.retrievers import BM25Retriever, EnsembleRetriever bm25_retriever = BM25Retriever.from_documents(docs) ensemble_retriever = EnsembleRetriever( retrievers=[vector_db.as_retriever(), bm25_retriever], weights=[0.7, 0.3] )

4.3 缓存策略

  • 对高频问题答案进行内存缓存
  • 使用SQLite缓存embedding计算结果

5. 常见问题排查

5.1 知识检索失效

症状:返回无关内容 解决方案:

  • 检查分块大小是否合适(建议300-800字符)
  • 尝试不同embedding模型(如m3e-base)
  • 添加query改写步骤

5.2 回答质量低下

症状:回答偏离检索内容 优化方法:

from langchain.prompts import PromptTemplate custom_prompt = PromptTemplate( template="请严格根据以下上下文回答:\n{context}\n问题:{question}", input_variables=["context", "question"] )

5.3 处理长文档技巧

对于超过100页的文档:

  1. 先提取目录结构作为元数据
  2. 二级分块时保留层级关系
  3. 检索时加入章节权重

6. 进阶扩展方向

现在这个基础系统可以进一步升级为:

  • 多模态知识库(处理图片/表格)
  • 自动更新机制(监控文档变更)
  • 对话历史感知(用LangGraph管理会话状态)

实测在16GB内存的MacBook Pro上,这个系统能流畅处理200份医学论文的问答。最惊喜的是,当我把自己的Obsidian笔记库接进去后,模型竟然能准确引用三年前写的技术思考片段——这才是真正的第二大脑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 6:33:48

统信程序(十二)文档管理系统

一、档案管理依靠AI能解决人脑的以下困扰1.更方便的时间逻辑检查,避免了多资料来源检查时的头昏脑涨。2.更方便的引用联动,避免了改动一处其他各处不联动的手忙脚乱。3.更方便的文件生成,避免了几十个文件同一个名称录入的繁琐。4.更方便的标…

作者头像 李华
网站建设 2026/7/17 6:32:43

MySQL数据库 (十八) MySQL访问,C/C++引入MySQL客户端库

目录 一、C/C引入MySQL客户端库 mysql connect引入MySQL第三方库 mysql接口介绍 初始化 mysql_init() : 连接数据库 mysql_real_connect() : 下达mysql命令 mysql_query() : 关闭 mysql_close() : 总结: 示例: C/C查询的处理细节 mysql_store_result() 二、总结 平…

作者头像 李华
网站建设 2026/7/17 6:31:50

C++与OpenCV实现Photoshop曲线算法:从原理到工程实践

1. 项目概述:从Photoshop到代码的曲线艺术在图像处理的世界里,Photoshop的“曲线”工具堪称调色之王。它通过一个简单的二维坐标系,让用户能够对图像的亮度、对比度乃至色彩进行极其精细的调整。无论是专业摄影师校正曝光,还是设计…

作者头像 李华
网站建设 2026/7/17 6:31:40

腾讯SRPC框架与微线程技术:C++高并发微服务架构核心解析

1. 项目概述如果你是一名C后台开发,尤其是在国内互联网大厂工作,那么“微服务”、“高并发”、“RPC”这些词对你来说一定不陌生。今天要聊的,是腾讯内部一个曾经被广泛使用,如今已开源归档的微服务开发框架——MSEC(M…

作者头像 李华
网站建设 2026/7/17 6:30:11

AI Agent Skills开发指南:核心技能与实战解析

1. AI Agent Skills的本质与价值在AI Agent开发领域,Skills(技能)正成为提升智能体能力的核心组件。简单来说,Skills就是让AI Agent具备特定领域专业能力的模块化组件。它们就像给智能体安装的"技能插件",使…

作者头像 李华
网站建设 2026/7/17 6:30:11

数组逆向搜索与文件加密的工程化实现:从定位策略到安全处理

1. 项目概述:从“逆向搜索”到“文件加密”的工程化思考最近在重构一个老项目的文件处理模块时,遇到了一个挺有意思的需求:需要先在一个配置数组中快速定位某个特定标识符的最后一次出现位置,然后根据这个位置信息,决定…

作者头像 李华