LangChain与Ollama构建本地RAG知识库

文档目录

  • 一、总体说明与介绍

  • 二、为什么使用RAG

    • 优点与使用场景
  • 三、环境搭建

    • 环境依赖与安装步骤
    • 模型安装与启动
  • 四、完整的RAG代码示例

    • 代码实现与说明
  • 五、优化建议

    • 性能优化建议
    • 使用技巧提示

一、总体说明与介绍

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合向量检索和生成式语言模型(LLM)的新型技术。它通过实时从外部知识库中检索相关的知识片段作为上下文,增强模型对问题回答的准确性与实时性,广泛应用于企业内部知识库、智能客服、医疗咨询等领域。

本技术文档将指导您如何使用LangChain框架结合Ollama服务,搭建一个本地运行的高效RAG知识库。

二、为什么使用RAG

优点 说明 推荐使用场景
实时更新 无需频繁重新训练模型即可更新知识库内容 企业内部知识库,实时信息更新场景
提升准确性 减少语言模型"幻觉"现象,提高答案准确性 法律咨询、医疗健康
降低成本 维护知识库成本远低于重新训练大型模型 小型公司内部知识库、客服
数据私密性 数据本地存储和处理,保护隐私安全 企业私有数据处理

三、环境搭建

环境依赖与安装步骤

软件或包名称 安装方式 作用说明
LangChain pip install langchain langchain-community 链式调用AI任务,文档加载
ChromaDB pip install chromadb 本地向量数据库
Ollama 官网安装 本地运行LLM
sentence-transformers pip install sentence-transformers 向量嵌入
文档处理库 pip install pypdf "unstructured[all-docs]" python-docx python-pptx lxml openpyxl 加载多种文档类型,如PDF、Word、Excel等

三、模型安装与启动

操作 命令 说明
启动Ollama ollama serve 启动Ollama本地模型服务
下载DeepSeek模型 ollama pull deepseek-r1:1.5b 下载本地LLM模型用于问答
下载嵌入模型 ollama pull nomic-embed-text:latest 文本转向量的嵌入模型

四、完整的RAG代码示例

以下是完整的Python示例代码,使用LangChain实现基于Ollama的本地RAG知识库。

css 复制代码
import os
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import Ollama

def load_documents(file_paths):
    loaders = []
    for path in file_paths:
        if path.endswith(".pdf"):
            loaders.append(PyPDFLoader(path))
        elif path.endswith(".txt"):
            loaders.append(TextLoader(path))
    docs = []
    for loader in loaders:
        docs.extend(loader.load())
    return docs

# 用户输入多个文件
file_list = []
while True:
    input_path = input("请输入文件路径(输入'q'结束):")
    if inputWord.lower() == 'q':
        break
    file_list.append(input_path)

documents = load_documents(file_list)

# 文档分割与向量存储
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(documents)

embeddings = OllamaEmbeddings(model="nomic-embed-text:latest")
db = Chroma.from_documents(splits, embeddings)
retriever = db.as_retriever()

llm = Ollama(model="deepseek-r1:1.5b")
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)

# 交互式问答
print("知识库已就绪,可以开始提问(输入q退出):")
while True:
    query = input("问题:")
    if query.lower() == "q":
        break
    result = qa_chain.invoke(query)
    print("回答:", result)

五、优化建议

  • 调整 chunk_size(如300~1000字符)提高检索的准确性。
  • 根据应用需求调整检索文档数量 k(默认3-5个)提升答案相关度。
  • 使用量化模型(如DeepSeek量化版)减少内存占用,提高响应速度。

💡

Tips

  • 定期更新知识库文档,确保提供最新信息。
  • 在安全要求较高的环境中,推荐使用本地部署的Ollama模型以确保数据安全
相关推荐
云手机掌柜16 分钟前
下一代社媒运营工具:亚矩阵云手机集成AIGC与数字人技术引领内容革命
大数据·线性代数·智能手机·矩阵·aigc
九章云极AladdinEdu1 小时前
临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
人工智能·pytorch·数据挖掘·pandas·scikit-learn·paddlepaddle·gpu算力
上海锝秉工控1 小时前
超声波风向传感器:以科技之翼,捕捉风的每一次呼吸
大数据·人工智能·科技
说私域1 小时前
基于开源AI智能名片、链动2+1模式与S2B2C商城小程序的流量运营与个人IP构建研究
人工智能·小程序·流量运营
xiaoxiaoxiaolll3 小时前
期刊速递 | 《Light Sci. Appl.》超宽带光热电机理研究,推动碳纳米管传感器在制药质控中的实际应用
人工智能·学习
练习两年半的工程师3 小时前
AWS TechFest 2025: 风险模型的转变、流程设计的转型、生成式 AI 从实验走向实施的三大关键要素、评估生成式 AI 用例的适配度
人工智能·科技·金融·aws
DisonTangor4 小时前
字节开源 OneReward: 通过多任务人类偏好学习实现统一掩模引导的图像生成
学习·ai作画·开源·aigc
Elastic 中国社区官方博客6 小时前
Elasticsearch:智能搜索的 MCP
大数据·人工智能·elasticsearch·搜索引擎·全文检索
stbomei6 小时前
从“能说话”到“会做事”:AI Agent如何重构日常工作流?
人工智能
yzx9910136 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化