LangChain入门(四)-构建本地知识库问答机器人

news2024/11/23 22:15:11

在这个例子中,我们会介绍如何从我们本地读取多个文档构建知识库,并且使用 Openai API 在知识库中进行搜索并给出答案。

目录

一、安装向量数据库chromadb和tiktoken

二、使用案例

三、embeddings持久化

四、在线的向量数据库Pinecone


一、安装向量数据库chromadb和tiktoken

pip install chromadb

  

其中hnswlib安装不了,去一下网站下载源码解压后,将hnswlib文件夹放在了项目的\Lib\site-packages文件夹中

GitHub - nmslib/hnswlib: Header-only C++/python library for fast approximate nearest neighbors

 

 

 安装一下 pybind1

pip install pybind11

安装hnswlib,cd到site-packages\hnswlib-master目录下执行

python setup.py install

可能会直接成功,也可能报下面的错误 

解决方案: 

 Rust 在 Windows10 下安装/执行出错的解决方法 | 蓝色梦想

 

  

 重新安装hnswlib,cd到site-packages\hnswlib-master目录下执行

python setup.py install

 下载Visualstudio安装,勾选如图https://download.visualstudio.microsoft.com/download/pr/473f1a59-e5bc-4332-8f76-5ff45df9cd24/c237d0f541dff305e3cd6d591710bf175a040af24570a6fdefca4a39fa7f0a93/vs_BuildTools.exehttps://download.visualstudio.microsoft.com/download/pr/473f1a59-e5bc-4332-8f76-5ff45df9cd24/c237d0f541dff305e3cd6d591710bf175a040af24570a6fdefca4a39fa7f0a93/vs_BuildTools.exe

安装完毕后,再次安装hnswlib

python setup.py install

 

 再次安装chromadb即可成功。

pip install chromadb

安装依赖 

pip install tiktoken

二、使用案例

在项目中新建一个data文件夹,里面放一个doc.txt,内容我摘抄一段朱炫大师兄的年少荒唐中的文章。

import os

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI, VectorDBQA
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA

# openAI的Key
os.environ["OPENAI_API_KEY"] = '**********************'

# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('D:\pythonwork\mindlangchain\data', glob='**/*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()

# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings)

# 创建问答对象
qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch, return_source_documents=True)
# 进行问答
result = qa({"query": "有哪些开心的事情?"})
print(result)

三、embeddings持久化

 上个案例里面有一步是将 document 信息转换成向量信息和embeddings的信息并临时存入 Chroma 数据库。

因为是临时存入,所以当我们上面的代码执行完成后,上面的向量化后的数据将会丢失。如果想下次使用,那么就还需要再计算一次embeddings,这肯定不是我们想要的。

那么,这个案例我们就来通过 Chroma 和 Pinecone 这两个数据库来讲一下如何做向量数据持久化。

上面的案例中我们只是将embeddings临时存进了Chroma,只需多加一个路径参数就可以实现持久化。

import os

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI, VectorDBQA
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA

# openAI的Key
os.environ["OPENAI_API_KEY"] = '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'

# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('D:\pythonwork\mindlangchain\data', glob='**/*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()

# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
vector_store_path = r"D:\pythonwork\mindlangchain\vector_store"
docsearch = Chroma.from_documents(documents=split_docs,
                                  embedding=embeddings,
                                  persist_directory=vector_store_path)

# docsearch = Chroma(persist_directory=vector_store_path,embedding_function=embeddings)
# 创建问答对象
qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch, return_source_documents=True)
# 进行问答
result = qa({"query": "有哪些开心的事情?"})
print(result)

 读取持久化的embeddings:

import os

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI, VectorDBQA
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA

# openAI的Key
os.environ["OPENAI_API_KEY"] = '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'

# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('D:\pythonwork\mindlangchain\data', glob='**/*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()

# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)

# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
vector_store_path = r"D:\pythonwork\mindlangchain\vector_store"
# docsearch = Chroma.from_documents(documents=split_docs,
#                                   embedding=embeddings,
#                                   persist_directory=vector_store_path)

docsearch = Chroma(persist_directory=vector_store_path,embedding_function=embeddings)
# 创建问答对象
qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch, return_source_documents=True)
# 进行问答
result = qa({"query": "有哪些开心的事情?"})
print(result)

四、在线的向量数据库Pinecone

Pinecone 是一个在线的向量数据库。所以,我可以第一步依旧是注册,然后拿到对应的 api key。(免费版如果索引14天不使用会被自动清除)

Pinecone ConsoleWeb site created using create-react-apphttps://app.pinecone.io/

创建数据库

 

 

# 持久化数据
docsearch = Pinecone.from_texts([t.page_content for t in split_docs], embeddings, index_name=index_name)

# 加载数据
docsearch = Pinecone.from_existing_index(index_name, embeddings)

 

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

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

相关文章

Maya云渲染怎么操作?看这一篇就够了

Autodesk Maya 是一款3D动画和视觉效果软件,拥有强大的角色建模、绑定、动画和模拟工具集,与Maya兼容的渲染器包括 Arnold(默认渲染器)、iRay、Maxwell、ProRender、Octane、Redshift、V-Ray、RenderMan 等。 与 Autodesk 的所有产…

异常排查 | 有关页面部署Tomcat造成的端口冲突问题

今日在写Servlet的时候,将网页部署到tomcat时,出现了如下错误👇 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8080]]一开始其实还没有发现这个地方出了问题&…

安装适用于Linux的Windows11子系统(WSL2)

1. 主板BIOS开启虚拟化 开启虚拟化需要在BIOS中进行设置,进入主板BIOS→找到虚拟化设置→开启。 2. 检验是否开启虚拟化 打开Windows命令行,并运行 systeminfo固件中已启用虚拟化为是,代表主板BIOS已经开启虚拟化。 3. 启用Windows功能…

操作系统——内存管理

0.关注博主有更多知识 操作系统入门知识合集 目录 7.1内存管理功能 思考题: 7.2物理内存管理 7.2.1分区内存管理 思考题: 7.2.2分区放置策略 7.2.3内存覆盖技术 7.2.4内存交换技术 7.2.5内存碎片 7.3虚拟内存管理 7.3.1页式虚拟存储管理 思…

安全服务体系建设主体内容

安全服务体系建设总共10类工作内容,每类分若干咨询方案或技术实施方案,同时也是一个长期建设与服务的工作,这些工作都是依据《网络安全等级保护基本要求》、《网络安全等级保护安全设计技术要求》《网络安全等级保护定级指南》。关于如何定级在这篇 等保定级报告模版_luozho…

STM32F4_USMART调试组件

目录 1. USMART是什么? 2. USMART的特点 3. USMART实现流程 4. USMART组件 5. 在usmart_config.c中添加想要被USMART调用的函数 6. 实验程序 6.1 main.c 6.2 usmart.c 6.3 usmart.h 7. USMART调试的优越性说明 1. USMART是什么? USMART 是 AL…

压力测试工具Jmeter安装及使用

1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi 1.2.解压 因为下载的是zip包&#xff…

三次样条曲线CubicSpline

本文参考老张在上海轨迹规划 之 三次样条曲线(概念性质) - 知乎 (zhihu.com) 什么是三次样条曲线 之 三次 样条是一种数据插值的方式,在多项式插值中,多项式是给出的单一公式来尽可能满足所有的数据点,而样条则使用多…

刷题刷题。

租用游艇 1.格式化输入二维数组&#xff1a;1-2&#xff0c;1-3&#xff0c;1-4&#xff0c;2-3&#xff0c;2-4&#xff0c;3-4... ... for(int i1; i<n-1; i) for(int ji1; j<n; j) 2.三重for循环枚举路径&#xff1a;第…

D. Unique Palindromes(回文串/构造)

题目 题意 给定字符串的长度&#xff0c;以及k个条件。 对于每个条件&#xff0c;给定x和c&#xff0c;表示原字符串的长度为x的前缀字符串&#xff0c;存在c个互不相同的回文子串。 原字符串由26个小写字母组成。 构造出长度为n&#xff0c;且满足上述k个条件的字符串。如果…

不黑艺术学社京藏行——参观五台山孙溟㠭为五台山红英师治印

不黑学社社长孙溟㠭先生与五台山菩萨顶主事红英师 不黑学社京藏行&#xff0c;路经五台把佛拜。 巍巍五台清凉境&#xff0c;参访伊始菩萨顶。 感恩“天珠”刘诗语&#xff0c;芬芳佛语满香华。 感恩慈悲红英师&#xff0c;带众参拜大白塔。 菩萨顶上如意宝&#xff0c;莲…

springboot+vue口腔管理平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的口腔管理平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

微服务---分布式多级缓存集群实现方案(Caffeine+redis+nginx本地缓存+Canal数据同步)

分布式多级缓存集群实现方案 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的…

DJ5-1/2 输入输出系统(第一节课)

目录 5.1 I/O 系统的功能、模型和接口 5.1.1 I/O 系统的基本功能 5.1.2 I/O 系统的层次结构和模型 5.1.3 I/O 系统接口 5.2 I/O 设备和设备控制器 5.2.1 I/O 设备 5.2.2 设备控制器 5.2.3 I/O 通道 5.2.4 总线系统 5.1 I/O 系统的功能、模型和接口 5.1.1 …

Python进阶篇(五)-- 邮件客户端实现与电子邮件发送

1 SMTP 通过完成本实验&#xff0c;我们将更加了解SMTP协议。还将学到使用Python实现标准协议的经验。 主要任务是开发一个简单的邮件客户端&#xff0c;将邮件发送给任意收件人。客户端将需要连接到邮件服务器&#xff0c;使用SMTP协议与邮件服务器进行对话&#xff0c;并向邮…

【P5】JMeter HTTP Cookie管理器

文章目录 一、测试网站二、Cookie 设置规则2.1、无配置元件时&#xff0c;Cookie 不会自动设置&#xff08;与线程组设置无关&#xff09;2.2、有配置元件&#xff0c;不选任何参数时&#xff0c;Cookie 自动设置&#xff08;与线程组设置无关&#xff09;2.3、有配置元件&…

【iOS KVO(上)实现过程】

前言 KVO 也适用于传值&#xff0c;在之前的学习只是学习了KVO的传值&#xff0c;今天详细学习 监听和实现 源码放在下一节学习 1.1 KVO KVO&#xff08;Key-Value Observing&#xff09;是Objective-C语言中一种观察者模式的实现&#xff0c;可以用来监听对象属性值的变化…

Kafka基础概念介绍

背景 Kafka是我们项目用的最多的消息中间件&#xff0c;但里面也有很多存在的问题&#xff0c;如重复消费、带宽瓶颈、部分分区消费不下来的异常场景。 重复消费问题有些让人头疼&#xff08;reblance导致offset提交失败&#xff09;&#xff0c;这里会持续更新&#xff08;基…

UML简介与类图详解

1 UML简介 1.1 UML是什么 UML&#xff0c;全称为Unified Model Language&#xff0c;即统一建模语言&#xff0c;是由一整套图表组成的&#xff0c;为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践&#xff0c;这些实践已被证明在…

【路径规划】基于哈里斯鹰优化算法的栅格法路径规划 机器人路径规划【Matlab代码#20】

文章目录 1. 原始HHO算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取方式 1. 原始HHO算法 详细介绍此处略&#xff0c;可参考HHO算法介绍 2. 机器人路径规划环境创建 对机器人工作空间的进行环境建模是机器人路径规划研究的重要…