如何基于 langchain与 LLM 构建自己的知识库系统

news2024/11/29 4:43:30

如何基于 langchain与 LLM 构建自己的知识库系统

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


针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈


什么是 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 相关依赖包

  • • 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 相关配置

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

embedding model 账户配置


     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

定义 embedding model的初始化


 from langchain_community.embeddings import QianfanEmbeddingsEndpoint
 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"] = ""
     # 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 官方的服务,那么使用就更加的简单了

 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(china.invoke("dify如何导入 nation 数据?"))

启动项目

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

 `langchain serve`

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

提问示例

  • • dify 是什么?

  • • dify 能干什么?请用列表形式回答

切换文档后继续提问,观察输出

  • • dify 可以导入哪些数据?

总结:

注意点:

1、文件拆分
 `text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)`

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

思考点:

1、prompt 缓存思考

RAG 知识库的中存在慢的点:

  • • query 向量化

  • • query LLM 得到 answer

我们需要构建 query 缓存策略,直接在 query 的时候找到最相似的 answer.

2、脱离项目 langchain template
  • • 构建自己 AI Agent 的方式

AI 实战:手把手教你使用「扣子/coze」来搭建个人blog知识库 - 掘金 (juejin.cn)[2]

更多相关文章持续更新中,欢迎关注! ❤️

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

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

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

相关文章

机器学习第五十二周周报 Distribution Shift of GNN

文章目录 week52 Distribution Shift of GNN摘要Abstract一、文献阅读1. 题目2. Abstract3. 预测标准3.1 问题提出3.2 图结构3.3 分布转移 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论 二、若依框架1. 框架概述2. 核心功能 3. 技术栈4. 框架特点优缺点小结参考…

写作小白2024年逆袭,AI写作工具top4的正确打开方式

以前,人们总觉得写文章、编故事是人特有的本事,机器肯定搞不定。但现在,AI越来越牛,这些AI写作工具,用上了深度学习、自然语言处理这些高科技,能模仿人的思路来写东西。它们不仅能帮人写,有时候…

AI大模型日报#0822:OpenAI推GPT-4o微调服务、混元大模型负责人专访

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)、“智谱AI”(glm-4-0520)生成了今日要点以及每条资讯的摘要。欢迎阅…

APO 集成生态exporter一键完成指标采集

Metrics 作为可观测性领域的三大支柱之一,Metrics数据采集显得尤为重要。传统的prometheus工具采集指标,需要指定路径抓取,当指标越来越多配置会显得复杂。同时prometheus只能采集指定的指标,当用户需要节点系统相关、中间件等指标…

虚幻5|制作一个木桩,含血量及伤害数字

一,基础设置 1.创建Actor蓝图类 2.编辑胶囊体和网格体的碰撞预设 3.打开敌人的角色蓝图,编辑飙血特效 二,创建敌人血量的ui,命名为敌人血量,如下 1. 2,打开后,添加一个画布画板和进度条&#…

为什么有了session和cookie还要使用JWT

session和cookie 为什么要使用session和cookie,他的流程是怎么样的 因为浏览器是无状态的,相当于每一次访问都是一次全新的访问,我们一般是登录来进行校验获取他的全部信息,所以会出现这个情况 这样当然也可以使用,但是很繁琐,并且影响性能,所以出现了session和cookie,他会生…

MDN边看边记

css css应用于文档的三种方法:使用外部样式表、使用内部样式表和使用内联样式。 css的层叠(cascade)和优先级(specificity): 层叠: 在css中,顺序很重要,当应用两条同级…

苹果手机怎么连接蓝牙耳机?3个方案,3秒连接

在快节奏的现代生活中,无线蓝牙耳机因其便捷性和自由度成为了许多人的首选。那么,苹果手机怎么连接蓝牙耳机呢?本文将为您介绍3种快速连接苹果设备与蓝牙耳机的方案,让您在享受音乐、通话或观看视频时,不再受线缆束缚&…

‌无人机干扰技术及其法律约束

无人机作为一种先进的航空器,‌近年来在民用、‌商用、‌军事等领域得到了广泛应用。‌然而,‌随着无人机技术的不断发展,‌其受到的潜在威胁也日益增多。‌许多外部因素可以干扰无人机的正常运行,‌甚至导致其失控或坠毁。‌本文…

linux内核驱动流程

norflash:可线性访问(和内存的访问方式相同) nandflash: 不可线性访问,必须配个专门的程序访问 Linux启动: 1. 引导程序 bootloader,为内核启动准备环境 2.启动内核(kernel) 3. 加载根文件系统(挂载) 1.bootloader启动(裸机程序)--uboot.bin --为内…

[240822] X-CMD 发布 v0.4.7: 新增 htop 、btop 和 ncdu 模块;优化 colr 和 scoop 模块

X-CMD 发布 v0.4.7 目录 X-CMD 发布 v0.4.7📃Changelog✨ htop✨ btop✨ ncdu✨ colr✨ scoop✅ 升级指南 📃Changelog ✨ htop 新增 htop 模块。本模块优先使用环境中的 htop 命令;若当前环境没有 htop 命令,模块将使用 pixi 模…

线程池的构造以及相关方法

手写线程池 package cn.itcast.n8;import lombok.extern.slf4j.Slf4j; import org.springframework.core.log.LogDelegateFactory; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.concurrent.TimeUnit; import java.util…

【卡码网C++基础课 6.数组的倒序与隔位输出】

目录 题目描述与分析一、数组二、Vector三、倒序输出数组四、隔位输出五、完整代码 题目描述与分析 题目描述: 给定一个整数数组,编写一个程序实现以下功能: 1.将输入的整数数组倒序输出,每个数之间用空格分隔。 2.从正序数组中&…

可视化大屏-实现自动滚动

一、背景:可视化大屏通常需要用到自动滚动的效果,本文主要采用的是vue-seamless-scroll组件来实现(可参考官方文档) 二、实现效果: 自动滚动 三、代码实现: 解题思路: 1.先安装依赖包 npm inst…

zTree 异步加载实现 点击加载

效果图如下 每级最多显示5000条数据&#xff0c;点击加载 会再次加载5000条数据 可以监听滚动条 动态加载 我这没实现这种方式。 <!-- ztreejs --> <script src".ztree/js/jquery.ztree.core.min.js" type"text/javascript"></script>…

DLAFormer:微软提出多任务统一的端到端文本分析Transformer模型 | ICDAR 2024

论文提出新颖的基于Transformer的端到端方法DLAFormer&#xff0c;在统一的模型中集成多个文档布局分析任务&#xff0c;包括图形页面对象检测、文本区域检测、逻辑角色分类和阅读顺序预测。为了实现这一目标&#xff0c;将各种DLA子任务视为关系预测问题并提出了统一标签空间方…

kafka监控工具EFAK

kafka监控工具&#xff08;EFAK&#xff09; 1、下载2、解压3、配置3.1、安装数据库&#xff0c;需要是mysql&#xff0c;并创建ke数据库3.2、修改配置文件 4、启动4.1、启动zookeeper4.2、启动kafka4.3、启动EFAK 5、访问http://ip:8048 github地址&#xff1a;https://github…

colmap的几种相机类型和内外参取得方法

colmap的相机类型可以参考models.h文件。 主要有以下几种相机类型&#xff1a; SimplePinhole&#xff1a; 内参格式&#xff1a;f, cx, cy 实际用的时候&#xff1a;fxfyf Pinhole: 内参格式&#xff1a;fx, fy, cx, cy 其他可以自行查看models.h文件。 内参存放在images.b…

《微信小程序开发》系列:第1篇—微信小程序简介

1.什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题。它实现了应用“触手可及”的梦想&…

回归分析系列14— 多项式回归

17 多项式回归 17.1 简介 多项式回归是线性回归的一种扩展&#xff0c;它允许回归模型包括输入变量的高次项。这种方法特别适合处理非线性关系的数据。 17.2 多项式回归模型 在多项式回归中&#xff0c;模型形式如下&#xff1a; 其中&#xff0c;p 是多项式的阶数&#xf…