跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

利用 LangChain 构建高效本地知识库系统

基于 LangChain 框架搭建本地知识库系统的流程。首先阐述了 RAG(检索增强生成)技术如何解决大模型知识滞后和幻觉问题,随后详细说明了环境依赖安装、Embedding 模型配置及向量数据库 Chroma 的使用。通过 WebBaseLoader 加载文档,利用 RecursiveCharacterTextSplitter 进行分块,结合 Azure OpenAI 或百度千帆模型实现文本向量化与检索。最后展示了使用 LCEL 表达式构建问答链并启动服务的完整代码示例,实现了基于私有数据的智能问答功能。

机器人发布于 2025/2/6更新于 2026/7/2743 浏览
利用 LangChain 构建高效本地知识库系统

使用 LangChain 搭建本地知识库系统

什么是 RAG

RAG 是 retrieval-augmented-generation 的缩写,翻译为中文的意思是检索增强,以基于最新、最准确的数据建立 LLM 的语料知识库。

LLM 现存的痛点

我们知道 LLM 的知识库是通过现有的网络公开的数据作为数据源来训练的。现在公开的很多模型他们基于的训练数据会比我们现在网络上公开的数据早很多,那自然就会产生一种问题:网络上最新的数据和知识 LLM 是不知道的。还有一种情况就是很多企业对自己的数据的安全做得很好,也就是私有化数据(这些数据是有价值的,也是企业的立足之本)。这些数据网络上肯定是不存在,那自然 LLM 也是不知道的。

我们在提问 LLM 对于一些不知道的知识时,LLM 很多时候是不知道如何回答问题的,甚至会对我们的问题进行胡诌随机回答,也就是瞎说。

如何解决

那如何让 LLM 知道这些最新/私有的数据的知识呢?

那就是 RAG。通过将模型建立在外部知识来源的基础上来补充回答,从而提高 LLM 生成回答的质量。

在基于 LLM 实现的问答系统中使用 RAG 有三方面的好处:

  • 确保 LLM 可以回答最新、最准确的内容。并且用户可以访问模型内容的来源,确保可以检查其声明的准确性并最终可信。
  • 通过将 LLM 建立在一组外部的、可验证的事实数据之上,该模型将信息提取到其参数中的机会更少。这减少了 LLM 泄露敏感数据或'幻觉'不正确或误导性信息的机会。
  • RAG 还减少了用户根据新数据不断训练模型并随着数据的变化更新训练参数的需要。通过这种方式企业可以降低相关财务成本。

现在支撑所有基础模型的是一种称为 transformer 的 AI 架构。它将大量原始数据转换为其基本结构的压缩表示形式。从这种原始表示开始,基础模型可以适应各种任务,并对标记的、特定于领域的知识进行一些额外的微调。

但是,仅靠微调很少能为模型提供在不断变化的环境中回答高度具体问题所需的全部知识,并且微调的时间周期还比较长。所以当时的 Facebook 提出了 RAG,让 LLM 能够访问训练数据之外的信息。RAG 允许 LLM 建立在专门的知识体系之上,以更准确的方式回答问题。

简单介绍

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够:

  • 具有上下文感知能力:将语言模型与上下文源(提示说明、少量镜头示例、基于其响应的内容等)联系起来。
  • 推理:依靠语言模型进行推理(关于如何根据提供的上下文回答,采取什么行动等)

安装 langchain 相关依赖包

pip install langchain
pip install langchain-community
pip install langchain-core
pip install langchain-experimental
pip install "langserve[all]"
pip install langchain-cli
pip install langsmith

实现知识库

OpenAI 相关配置

如果你不使用 OpenAI,那么你需要参考官网的关于 model I/O 的部分去实例化你对应的 LLM model。本文中的 LLM 使用的是 AZURE_OPENAI 的服务。

import os
os.environ["AZURE_OPENAI_ENDPOINT"] = ""
os.environ["AZURE_OPENAI_API_KEY"] = ""

Embedding Model 账户配置

根据自己的实际 LLM 情况去配置相关的参数。

import os
os.environ["AZURE_OPENAI_ENDPOINT"] = ""
os.environ[] = 
os.environ[] = 
os.environ[] = 
"AZURE_OPENAI_API_KEY"
""
"OPENAI_API_VERSION"
"2023-05-15"
"OPENAI_API_TYPE"
"azure"

RAG 增强检索的流程图

RAG 流程示意图

代码执行流程

  • 加载 langchain 相关包
  • 加载 URL 网页的文档并生成 langchain Document raw_documents
  • 将 raw_documents 拆分为适合 embedding model 能够处理大小的 chunk 小文档
  • 使用 embedding model API 将小的 chunk 向量化,并保存向量数据库
  • 构建 RAG prompt 提示,并使用变量 {context} 和 {question},并限定回答问题所使用的文本
  • 使用 LCEL 表达式构建 RAG chain
  • 在 app/server.py 中添加 add_routes(app, rag_chroma_chain, path="/dify") 代码
  • 执行代码 langchain serve 启动服务

代码实现

导入 langchain 的百度千帆 embedding model。

from langchain_community.embeddings import QianfanEmbeddingsEndpoint

我这里使用的百度千帆的 embedding model,具体你要使用哪个产品的 embedding model 在对应的地方修改为自己的即可。

embedding model 的作用有两点:

  • 将我们拆分后的 documents 做向量化,然后并保存到对应的向量数据库中。
  • 用户在查找相关问题的时候,先从向量数据库中查找出相似的文档。

也就是提供了存储和查询的功能。

定义 embedding model 的初始化

import os

def embedQianfan():
    os.environ["QIANFAN_AK"] = "" # 这里需要修改为自己的实际值
    os.environ["QIANFAN_SK"] = "" # 这里需要修改为自己的实际值
    embed = QianfanEmbeddingsEndpoint()
    return embed

定义 OpenAI 实现

根据自己的账户情况去配置相关参数。

def openai_llm() -> AzureChatOpenAI:
    # 设置环境变量
    os.environ["AZURE_OPENAI_ENDPOINT"] = ""
    os.environ["AZURE_OPENAI_API_KEY"] = ""
    from langchain_openai import AzureChatOpenAI
    llm = AzureChatOpenAI(
        azure_deployment="gpt-4",
        openai_api_version="2023-05-15"
    )
    return llm

OpenAI 官方服务

如果你用的是 OpenAI 官方的服务,那么使用就更加的简单了。

import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass()
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

整体代码实现详解

# 导入 langchain 相关的依赖包

# 导入向量数据库(向量存储、查询)
from langchain_community.vectorstores import Chroma

# 导入 langchain 输出函数 (格式化输出)
from langchain_core.output_parsers import StrOutputParser

# 导入 langchain Prompt 模板,prompt 管理
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel

# 导入 langchain 的 LCEL 解释器包
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

# 导入 langchain 文本拆分器
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 导入 langchain 的文件加载器 (WebBaseLoader 的功能是拉取网页数据,解析为 langchain Document 结构)
from langchain_community.document_loaders import WebBaseLoader

# 加载网页 https://docs.dify.ai/v/zh-hans/getting-started/readme 的数据
raw_documents = WebBaseLoader("https://docs.dify.ai/v/zh-hans/getting-started/readme").load()
# raw_documents = WebBaseLoader("https://docs.dify.ai/v/zh-hans/guides/knowledge-base").load()

# 将网页数据拆分为 chunk 的大小
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
all_splits = text_splitter.split_documents(raw_documents)

# 将文本编码为向量,并保存为向量
vectorstore = Chroma.from_documents(
    documents=all_splits,
    collection_name="RAG-chroma",
    embedding=embedQianfan(),
)
retriever = vectorstore.as_retriever()

# 构建 RAG prompt
template = """Answer the question with chinese and based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 初始化 LLM
# model = ChatOpenAI()
model = openai_llm()

# 使用 LCEL 表达式构建 RAG chain
chain = (
        RunnableParallel({"context": retriever, "question": RunnablePassthrough()})
        | prompt
        | model
        | StrOutputParser()
)

# Add typing for input
class Question(BaseModel):
    __root__: str

chain = chain.with_types(input_type=Question)

print(chain.invoke("dify 是什么"))
print(chain.invoke("dify 能干什么?请用列表形式回答"))
print(chain.invoke("dify 可以导入哪些数据?"))
print(chain.invoke("dify 如何导入 nation 数据?"))

启动项目

如果你使用的是 langchain serve 构建的,那么你可以按下面的启动命令启动服务。服务你只是一个单文件,那么执行 python 你的文件。

langchain serve
INFO:     Will watch for changes in these directories: ['/Users/oo7/Developer/langchain/chat_llm']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [87768] using WatchFiles
[INFO] [02-28 16:30:15] openapi_requestor.py:316 [t:140704718436288]: requesting LLM api endpoint: /embeddings/embedding-v1
[INFO] [02-28 16:30:15] oauth.py:207 [t:140704718436288]: trying to refresh access_token for ak r5KIlr***
[INFO] [02-28 16:30:15] oauth.py:220 [t:140704718436288]: successfully refresh access_token
INFO:     Started server process [87777]
INFO:     Waiting for application startup.

LANGSERVE: Playground for chain "/pirate-speak/" is live at:
LANGSERVE: │
LANGSERVE: └──> /pirate-speak/playground/
LANGSERVE:
LANGSERVE: Playground for chain "/dify/" is live at:
LANGSERVE: │
LANGSERVE: └──> /dify/playground/
LANGSERVE:
LANGSERVE: See all available routes at /docs/

启动成功后访问地址:http://127.0.0.1:8000/dify/playground/

提问示例
  • dify 是什么?
  • dify 能干什么?请用列表形式回答
切换文档后继续提问,观察输出
  • dify 可以导入哪些数据?
注意点
1、文件拆分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)

文本拆分一定需要注意 embedding model 窗口所能处理的 token 数量。如果超出则会出问题。

总结

本文主要是介绍了如何使用 LangChain 构建一个自己的知识库系统。

  • 介绍了知识库构建的 RAG 相关的知识
  • LLM 不能做什么,如何将最新的数据与 LLM 相结合来提升 LLM 的能力
  • LangChain 的基本介绍,他是一个用于开发由语言模型驱动的应用程序的框架
  • 向量数据库的作用:存储向量化后的文本然后提供查找语义相关的内容
  • 构建知识库的步骤和相关代码的介绍

目录

  1. 使用 LangChain 搭建本地知识库系统
  2. 什么是 RAG
  3. LLM 现存的痛点
  4. 如何解决
  5. 简单介绍
  6. 安装 langchain 相关依赖包
  7. 实现知识库
  8. OpenAI 相关配置
  9. Embedding Model 账户配置
  10. RAG 增强检索的流程图
  11. 代码执行流程
  12. 代码实现
  13. 定义 embedding model 的初始化
  14. 定义 OpenAI 实现
  15. OpenAI 官方服务
  16. 整体代码实现详解
  17. 导入 langchain 相关的依赖包
  18. 导入向量数据库(向量存储、查询)
  19. 导入 langchain 输出函数 (格式化输出)
  20. 导入 langchain Prompt 模板,prompt 管理
  21. 导入 langchain 的 LCEL 解释器包
  22. 导入 langchain 文本拆分器
  23. 导入 langchain 的文件加载器 (WebBaseLoader 的功能是拉取网页数据,解析为 langchain Document 结构)
  24. 加载网页 https://docs.dify.ai/v/zh-hans/getting-started/readme 的数据
  25. raw_documents = WebBaseLoader("https://docs.dify.ai/v/zh-hans/guides/knowledge-base").load()
  26. 将网页数据拆分为 chunk 的大小
  27. 将文本编码为向量,并保存为向量
  28. 构建 RAG prompt
  29. 初始化 LLM
  30. model = ChatOpenAI()
  31. 使用 LCEL 表达式构建 RAG chain
  32. Add typing for input
  33. 启动项目
  34. 提问示例
  35. 切换文档后继续提问,观察输出
  36. 注意点
  37. 1、文件拆分
  38. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MATLAB 图像处理:冈萨雷斯 DIPUM 工具箱功能详解与实战
  • Stable Diffusion v1.5 核心原理与部署实战
  • 2023 年网络安全入职与转行职业规划指南
  • 云开发 Copilot 实战:AI 辅助生成低代码应用
  • TypeError: undefined 属性访问错误排查与根治方案
  • VSCode Python venv 环境加载失败排查与解决指南
  • 基于 AI Agent 的米家智能家居通用控制方案
  • Python 移动端反爬实战:Charles 抓包与 Frida Hook 破解
  • 网络安全人才缺口巨大为何招聘岗位较少
  • 10 款主流 AI 降重工具对比与选型建议
  • Open-AutoGLM 打造专属手机机器人
  • YOLOv11 数据集训练与推理指南及网络结构解析
  • 前端函数防抖详解:原理、手写与 Lodash 实战
  • 数据结构:快速排序分区逻辑与冒泡排序效率对比
  • Windows 本地部署 Ollama 与 OpenClaw 构建 AI 工作流
  • Windows 11 下使用 llama.cpp 运行 Qwen3.5 量化模型测试
  • 小厂架构师 AI Agent 落地实战:从概念到 Bug 修复工具
  • IPv6+DDNS-GO 连接故障排查与三种替代方案对比
  • Prompt 驱动的 SQL 生成与查询优化
  • 基于 SRS 与 WebRTC 的 RTSP 多路摄像头低延迟监控方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online