使用langchain搭建本地知识库系统(新)

news2024/11/15 17:51:42

使用langchain搭建自己的本地知识库系统(新)

前些时候字节上了自己的扣子,用来构建我们自己的 agent [AI 实战:手把手教你使用「扣子/coze」来搭建个人blog知识库 受到启发,想在本地或者自己的服务器上面搭建一个知识库,所以就有了本文。

什么是 RAG

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

LLM 现存的痛点

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

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

如何解决

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

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

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

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

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

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

简单介绍

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

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

更多的介绍可以去官网:Introduction | 🦜️🔗 Langchain

安装 langchain 相关依赖包

  • pip install langchain
  • pip install langchain-community
  • pip install langchain-core
  • pip install langchain-experimental
  • 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 的服务。

py
复制代码
 import os
 os.environ["AZURE_OPENAI_ENDPOINT"] = ""
 os.environ["AZURE_OPENAI_API_KEY"] = ""

embedding model 账户配置

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

py
复制代码
 import os
 os.environ["AZURE_OPENAI_ENDPOINT"] = ""
 os.environ["AZURE_OPENAI_API_KEY"] = ""
 os.environ["OPENAI_API_VERSION"] = "2023-05-15"
 os.environ["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

python
复制代码
  from langchain_community.embeddings import QianfanEmbeddingsEndpoint

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

embedding model 的作用有两点

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

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

定义 embedding model的初始化

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

定义 OpenAI 实现

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

javascript
复制代码
  def openai`LLM `() -> AzureChatOpenAI:
      # 设置环境变量
      os.environ["AZURE_OPENAI_ENDPOINT"] = ""
      os.environ["AZURE_OPENAI_API_KEY"] = ""
      # os.environ["OPENAI_API_VERSION"] = "2023-05-15"
      # os.environ["OPENAI_API_TYPE"] = "gpt-35-turbo"
      from langchain_openai import AzureChatOpenAI
      `LLM ` = AzureChatOpenAI(
          azure_deployment="gpt-4",
          openai_api_version="2023-05-15"
      )
      return `LLM `

OpenAI

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

scss
复制代码
  os.environ["OPENAI_API_KEY"] = getpass.getpass()
  `LLM ` = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

整体代码实现详解

py
复制代码
  # 导入 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(china.invoke("dify如何导入 nation 数据?"))
 ​

启动项目

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

复制代码
  langchain serve
less
复制代码
   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]: sucessfully 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、文件拆分
ini
复制代码
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)

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

总结:

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

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

最后

为了帮助大家更好的学习人工智能,这里给大家准备了一份人工智能入门/进阶学习资料,里面的内容都是适合学习的笔记和资料,不懂编程也能听懂、看懂,所有资料朋友们如果有需要全套人工智能入门+进阶学习资源包,可以在评论区或扫.码领取哦)~

在线教程

  • 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
  • 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
  • EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
  • 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
  • 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
  • 机器学习 – 有指导和无指导情况下的基本机器学习算法
  • 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
  • 斯坦福统计学习

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

  • OpenCV(中文版).(布拉德斯基等)
  • OpenCV+3计算机视觉++Python语言实现+第二版
  • OpenCV3编程入门 毛星云编著
  • 数字图像处理_第三版
  • 人工智能:一种现代的方法
  • 深度学习面试宝典
  • 深度学习之PyTorch物体检测实战
  • 吴恩达DeepLearning.ai中文版笔记
  • 计算机视觉中的多视图几何
  • PyTorch-官方推荐教程-英文版
  • 《神经网络与深度学习》(邱锡鹏-20191121)

  • 在这里插入图片描述
    😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

在这里插入图片描述
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

震惊!性能一下子提升10倍,用Performance面板分析性能瓶颈全流程!

工作中发现了一个下拉框打开的数据比较慢&#xff0c;并且打开弹框的时候会有相当长一段时间的延迟&#xff0c;下拉的弹框不是使用组件库的&#xff0c;而是自己封装的一个组件&#xff0c;怀疑存在数据量过大影响的情况&#xff0c;所以借助性能分析工具来找出具体的原因。 如…

渲染农场与并行处理:大规模渲染任务的高效解决方案

随着数字技术与计算机图形学的突飞猛进&#xff0c;大规模渲染任务已成为电影制作、游戏开发、建筑设计以及科学计算等诸多行业的常态化需求。面对这些日益增长的需求&#xff0c;渲染农场与并行处理技术凭借其卓越的效率和精准度&#xff0c;已然成为应对这些挑战的核心高效解…

bigemap在水利科学研究院是如何应用的?

使用场景&#xff1a; 1.数据采集&#xff1a;客户主要是做科研方向的&#xff0c;前期的工作内容就是野外调查使用Bigemap APP去采集点位数据回传到电脑上&#xff0c;电脑端再进行查看分类、二次编辑标注和统计数据。 2.矢量处理&#xff1a;客户其他部门用GPS采集回来的项目…

YUNBEE-腾讯云TDSQL MySQL和PostgreSQL TCA初级认证考试

腾讯云TDSQL(MySQL版)‍ TCA 数据库交付运维工程师-腾讯云TDSQL(MySQL版) - 课程体系 - 云贝教育 (yunbee.net) 培训概述 数据库交付运维工程师-腾讯云TDSQL&#xff08;MySQL版&#xff09;培训&#xff0c;将通过理论与上机演练相结合的方式&#xff0c;以腾讯分布式OLTP数…

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文&#xff1a;https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译&#xff1a;OneBlock 区块链领域不断发展&#xff0c;随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …

OceanMind海睿思数据资产管理平台更新,文件资产管理能力大幅提升!

海睿思数据资产管理平台 再度迎来重磅更新&#xff01; 新版本的文件资产管理能力得到了大幅提升&#xff0c;更贴合项目实际使用场景&#xff0c;安全性更高、功能更全、使用更便捷。 本期更新亮点&#xff1a; 新增文件资产注册功能新增资产标签管理功能新增文件资产打标签…

非父子通信- event bus 事件总线

非父子通信 (兄弟) - event bus 事件总线 作用&#xff1a;非父子组件之间&#xff0c;进行简易消息传递。(复杂场景 → Vuex) 创建一个都能访问到的事件总线 (空 Vue 实例) → utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus. A 组件(接收…

Springboot多环境切换最灵活配置,没有之一

在日常的开发中&#xff0c;一般都会分好几种环境&#xff0c;比如通常的 开发环境&#xff1a;一般在开发的过程中&#xff0c;一个比较随意地环境&#xff0c;通常可以随意重启&#xff0c;删除数据 测试环境&#xff1a;面向测试同学的环境&#xff0c;需要相对稳定&…

测试点点延迟和带宽的脚本总结

从队列中获取节点名 我们有时候需要从任务队列中取出完整的节点名称&#xff0c;比如cn[8044-8046,8358-8360,8926-8928,9002-9004]&#xff0c;可以给定参数input_str也可以在脚本中直接写死。 import re import subprocess import sysinput_str "cn[7512-7519,7545-75…

音视频数字化(视频线缆与接口)

目录 1、DVI接口 2、DP接口 之前的文章【音视频数字化(线缆与接口)】提到了部分视频线缆,今天再补充几个。 视频模拟信号连接从莲花头的“复合”线开始,经历了S端子、色差分量接口,通过亮度、色度尽量分离的办法提高画面质量,到VGA已经到了模拟的顶峰,实现了RGB的独立…

面试问答之MySQL数据库进阶

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380; MySQL架构&#x1f415;数据库引擎&#x1f415; InnoDB存储存储引擎&#x1f415;MYISAM &#x1f3e8;索引&#x1f415;哪些情况需要创建…

学习c语言:预处理详解(宏定义)

1.预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&…

Docker镜像及Dockerfile详解

1 Docker镜像用途 统一应用发布的标准格式支撑一个Docker容器的运行 2 Docker镜像的创建方法 基于已有镜像创建基于本地模板创建基于Dockerfile创建 &#xff08;实际环境中用的最多&#xff09; 2.1 基于已有镜像的创建 将容器里面运行的程序及运行环境打包生成新的镜像 …

盘点美貌与个性兼备的国漫女神,她们绝不是花瓶!

在近年来的影视作品里&#xff0c;女性角色不再只是简单的陪衬或是花瓶&#xff0c;她们以各具特色的形象&#xff0c;展现了独立、坚韧和多元的女性力量。而在二次元的世界里&#xff0c;众多女角色同样散发着耀眼的光芒。正值国际妇女节&#xff0c;一起来看看国漫中那些兼具…

新能源车高压线束更换VR虚拟互动教学保障了培训安全可控

随着新能源汽车市场的快速发展&#xff0c;对于新能源汽车检修人才的需求也日益增长。然而&#xff0c;传统的培训模式往往存在一些限制&#xff0c;如培训周期长、成本高、实践机会少等。为了解决这些问题&#xff0c;新能源车检修VR互动培训应运而生&#xff0c;成为一种创新…

分享MDN前端结构化技能、实践指南、学习资源

前言 MDN课程为成为一名成功的前端开发人员提供了一个结构化的基本技能和实践指南&#xff0c;以及推荐的学习资源。 先看下让人不得不服的书《宝宝的网页设计》&#xff08;套装共3册&#xff09; 宝宝的HTML、宝宝的CSS、宝宝的JavaScript 全球首套中英文宝宝编程启蒙书&a…

文献学习-14-一种用于高精度微创手术的纤维机器人

Authors: Mohamed E. M. K. Abdelaziz1,2 †, Jinshi Zhao1,3 †, Bruno Gil Rosa1,2 , Hyun-Taek Lee4 , Daniel Simon3,5 , Khushi Vyas1,2 , Bing Li6,7 , Hanifa Koguna3 , Yue Li1 , Ali Anil Demircali3 , Huseyin Uvet8 , Gulsum Gencoglan9,10, Arzu Akcay11,12, Moham…

WinCE USB驱动架构及术语明析

一、层式驱动的概念。 WinCE驱动多为层式驱动&#xff0c;分为MDD和PDD两层。 MDD包含通用的驱动代码&#xff0c;向操作系统提供了驱动接口&#xff0c;该层代码调用PDD功能访问硬件。 PDD部分包含与硬件平台相关的特殊代码&#xff0c;不具有通用性。 之所以要分层&#xff0…

050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

050-WEB攻防-PHP应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒 #知识点&#xff1a; 1、文件包含-原理&分类&危害-LFI&RFI 2、文件包含-利用-黑白盒&无文件&伪协议 演示案例&#xff1a; ➢文件包含-原理&分类&am…

C语言从入门到精通 第十一章(文件操作)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…