【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南

欢迎来到人工智能的迷人世界,在那里,人与机器之间的通信越来越模糊。在这篇博客文章中,我们将探索人工智能驱动交互的一个令人兴奋的新前沿:与您的文本文档聊天!借助OpenAI模型和创新的LangChain框架的强大组合,您现在可以将静态文档转化为交互式对话。

你准备好彻底改变你使用文本文件的方式了吗?然后系好安全带,深入了解我们将OpenAI与LangChain集成的终极指南,我们将一步一步地为您介绍整个过程。

什么是LangChain?

LangChain是一个强大的框架,旨在简化大型语言模型(LLM)应用程序的开发。通过为各种LLM、提示管理、链接、数据增强生成、代理编排、内存和评估提供单一通用接口,LangChain使开发人员能够将LLM与真实世界的数据和工作流无缝集成。该框架允许LLM通过合并外部数据源和编排与不同组件的交互序列,更有效地解决现实世界中的问题。

我们将在下面的示例应用程序中使用该框架从文本文档源生成嵌入,并将这些内容持久化到Chroma矢量数据库中。然后,我们将使用LangChain在后台使用OpenAI语言模型来查询用户提供的问题,以处理请求。

这将使我们能够与自己的文本文档聊天。

设置项目

创建一个新的项目文件夹并安装以下Python包:

pip install langchain openai chromadb tiktoken

命令pip-install langchain openai chromadb tiktoken用于使用Python包管理器pip安装四个Python包。每个包都有特定的用途,它们共同帮助您将LangChain与OpenAI模型集成,并管理应用程序中的令牌。让我们对所涉及的程序包进行细分:

  1. langchain:这个包是主要的langchain库,它有助于与OpenAI模型无缝集成,以创建与文本文档的交互式聊天体验。
  2. openai:这是openai API的官方Python包,使您能够使用openai提供的强大语言模型,例如GPT-4。
  3. chromadb:ChrmaDB是一个轻量级、高性能、无模式的矢量数据库,专为人工智能应用程序设计。它允许您存储、检索和管理LangChain和OpenAI支持的文档聊天应用程序所需的矢量数据(嵌入)。
  4. tiktoken:tiktoken是OpenAI提供的一个实用程序库,它可以帮助您计算和管理文本字符串中的标记,而无需进行API调用。这对于监控令牌使用情况、保持在API限制内以及有效地使用OpenAI的模型都很有用。

通过执行此命令,您可以安装所有必要的软件包,以开始构建和部署使用OpenAI的LangChain的文本文档聊天应用程序。

将以下两个文件添加到项目文件夹中:

touch init_vectorstore.py ask.py

此外,我们还将一个txt文档添加到项目中。对于本文的示例,国情咨文文本添加为State_of_the_Union.txt,如您所见:

让我们开始将以下Python代码添加到文件init_vectorstore.py中。

该代码读取文本文档,将其拆分为更小的块,并使用OpenAI模型生成嵌入。然后,它创建并持久化一个包含嵌入和相关元数据的Chroma数据库。这允许有效地存储和检索文档嵌入,用于人工智能驱动的文本分析和交互。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chromaimport os
os.environ["OPENAI_API_KEY"] = "[INSERT YOUR OPEN AI API KEY HERE]"with open("state_of_the_union.txt") as f:state_of_the_union = f.read()text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(state_of_the_union)embeddings = OpenAIEmbeddings()docsearch = Chroma.from_texts(texts, embeddings, metadatas=[{"source": f"Text chunk {i} of {len(texts)}"} for i in range(len(texts))], persist_directory="db")docsearch.persist()
docsearch = None

以下是对代码的逐步描述:

  1. 导入必要的库和模块:
    • langchain.embeddings.openai中的openai嵌入,以使用openai模型并生成嵌入。
    • 来自langchain.text_splitter的CharacterTextSplitter,用于将输入文本拆分为更小的块。
    • langchain.vectorstores中的Chroma,用于创建Chroma数据库以存储嵌入和元数据。
    • 用于处理环境变量的操作系统。
  2. 使用os.environ将OpenAI API密钥设置为环境变量。要获取您的OpenAI API密钥,请在OpenAI的官方网站注册帐户(https://www.openai.com/)。一旦您的帐户获得批准,请导航到帐户设置或仪表板下的API密钥部分。你会在那里找到你唯一的API密钥,你可以用它来访问OpenAI的模型和服务。
  3. 打开“state_of_the_union.txt”文件的内容并将其读取到一个名为state_of_the_union的变量中。
  4. 创建一个CharacterTextSplitter实例,其chunk_size为1000个字符,chunk_overlap为0,这意味着块之间没有重叠的字符。
  5. 使用text_splitter实例的Split_text方法将state_of_the_union文本拆分为块。
  6. 创建一个名为embeddings的OpenAIEmbeddings实例,以使用OpenAI模型生成文档嵌入。
  7. 使用from_texts()方法实例化Chroma对象,该方法采用以下参数:
    • texts:前面生成的文本块。
    • embeddings:用于生成嵌入的OpenAIEmbeddings实例。
    • 元数据:每个文本块的元数据字典列表。
    • persist_directory:存储Chroma数据库的目录(在本例中为“db”)。
    • 8.使用Persist()方法将Chroma对象持久化到指定的目录。
    • 9.将docsearch变量设置为None以将其从内存中清除。

总之,此代码读取文本文档,将其拆分为更小的块,使用OpenAI模型生成嵌入,使用生成的嵌入和元数据创建Chroma数据库,并将数据库保存到指定的目录中以备将来使用。

让我们运行以下代码,通过使用以下命令为Chroma矢量数据库创建嵌入内容:

python init_vectorstore.py

然后,您应该会收到以下输出:

在您的项目文件夹中,您应该能够找到一个包含一些内容的数据库子文件夹。

与文本文档交互

让我们用文件ask.py中的文本文档实现交互逻辑。下面的代码演示了如何使用LangChain、OpenAI模型和包含嵌入的Chroma数据库创建问答(QA)系统。Chroma矢量数据库已经在最后一步中与我们的内容一起准备好了,因此我们现在准备好利用它:

from langchain.chains import RetrievalQAWithSourcesChain
from langchain import OpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddingsimport os
os.environ["OPENAI_API_KEY"] = "[INSERT YOUR OPEN AI API KEY HERE]"embeddings = OpenAIEmbeddings()docsearch = Chroma(persist_directory="db", embedding_function=embeddings)chain = RetrievalQAWithSourcesChain.from_chain_type(OpenAI(temperature=0), chain_type="stuff", retriever=docsearch.as_retriever())user_input = input("What's your question: ")result = chain({"question": user_input}, return_only_outputs=True)print("Answer: " + result["answer"].replace('\n', ' '))
print("Source: " + result["sources"])

以下是代码的说明:

  1. 导入必要的库和模块,包括RetrievalQAWithSourcesChain、OpenAI、Chroma和OpenAI嵌入。
  2. 使用os.environ将OpenAI API密钥设置为环境变量。
  3. 创建一个名为embeddings的OpenAIEmbeddings实例,以使用OpenAI模型生成文档嵌入。
  4. 使用persist_directory参数(存储先前创建的Chroma数据库的位置)和embedding_function参数(embeddings实例)实例化Chroma对象。
  5. 使用from_chain_type()方法创建RetrievalQAWithSourcesChain实例。此实例采用以下参数:
    • OpenAI(temperature=0):具有指定温度设置的OpenAI类的实例。
    • chain_type=“stuff”:要创建的链的类型(在本例中为“stuff“)。
    • retriever=docsearch.as_retriever():retriever对象,它是使用as_retriever()方法转换为retriever的Chroma实例。
  6. 使用input()函数提示用户输入问题。
  7. 将用户的问题传递给QA系统(链实例)并检索结果。
  8. 打印答案和答案来源,并从答案文本中删除换行符。

总之,这段代码使用LangChain、OpenAI模型和Chroma数据库创建了一个简单的QA系统。它提示用户提出问题,使用QA系统处理问题,并返回答案及其来源——让我们看看它的实际操作。使用启动脚本

python ask.py

然后要求您输入问题:

输入与国情咨文文本的任何内容相关的问题,例如:

然后,您将收到答案以及用于从中检索必要信息的文本块的源信息。

这使我们现在可以通过在后台使用OpenAI的语言模型来询问与文本文档相关的任何问题。

结论

OpenAI模型和LangChain的强大结合为改变我们与文本文档的交互方式开辟了新的可能性。正如我们在本指南中所展示的,集成这些尖端技术从未如此容易。

文章链接

【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南 | 开发者开聊

自我介绍

  • 做一个简单介绍,酒研年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【架构师研究会】和【开发者开聊】,有更多的内容分享,谢谢大家收藏。
  • 企业架构师需要比较广泛的知识面,了解一个企业的整体的业务,应用,技术,数据,治理和合规。之前4年主要负责企业整体的技术规划,标准的建立和项目治理。最近一年主要负责数据,涉及到数据平台,数据战略,数据分析,数据建模,数据治理,还涉及到数据主权,隐私保护和数据经济。 因为需要,比如数据资源入财务报表,另外数据如何估值和货币化需要财务和金融方面的知识,最近在学习财务,金融和法律。打算先备考CPA,然后CFA,如果可能也想学习法律,备战律考。
  • 欢迎爱学习的同学朋友关注,也欢迎大家交流。全网同号【架构师研究会】

欢迎收藏  【全球IT瞭望】,【架构师酒馆】和【开发者开聊】.

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

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

相关文章

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案

2023 CCF 大数据与计算智能大赛 基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案 WELL 刘渝 人工智能 研一 西安交通大学 中国-西安 1461003622qq.com 史政立 网络空间安全 研一 西安交通大学 中国-西安 1170774291qq.com 崔琳、张…

Vue - 实现文件导出文件保存下载

1 文件导出:使用XLSX插件 需求背景:纯前端导出,如 在前端页面勾选部分表格数据,点击"导出"按钮导出Excel文件。 实现思路: 1.通过XLSX插件的 XLSX.utils.book_new()方法,创建excel工作蒲对象wb…

Element UI之el-tabs的样式修改字体颜色、下划线、选中/未选中

目录 默认样式 修改默认字体颜色&#xff1a; 修改鼠标悬浮/选中字体颜色&#xff1a; 去掉长分割线并修改下划线颜色 完整代码 默认样式 注意事项&#xff1a;一定要在 <style scoped>不然修改的样式不会覆盖生效 修改默认字体颜色&#xff1a; ::v-deep .el-tabs__…

[鹏城杯 2022]简单包含

[鹏城杯 2022]简单包含 wp 题目代码如下&#xff1a; <?php highlight_file(__FILE__); include($_POST["flag"]); //flag in /var/www/html/flag.php; 直接 POST 传参&#xff1a; flag/var/www/html/flag.php 会触发 waf 。 尝试用伪协议读取&#xff1a; …

canvas绘制红绿灯路口

无图不欢&#xff0c;先上图 使用方法&#xff08;以vue3为例&#xff09; <template><canvas class"lane" ref"laneCanvas"></canvas> </template><script setup> import { ref, onMounted } from vue import Lane from …

C实现数组奇数在前偶数在后排序

一、运行结果&#xff1b; 二、源码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现调整函数move_odd_even函数&#xff1b; void move_odd_even(int arr[], int sz) {//初始化变量值&#xff1b;int left 0;int right sz - 1;//循环判断和…

CSP CCF 201312-2 ISBN号码 C++满分题解

解题思路&#xff1a; 1.用一个int数组单独存储每个数字&#xff1b;用char数组存储原始标识符串&#xff0c;方便输出 2.计算后得到标识码&#xff0c;判断是否正确 #include<iostream> using namespace std;int main() {int num[15]; //存储每个位置的数char arr[15…

【高性能篇】QPS概念、RT概念

什么是QPS&#xff0c;什么是RT&#xff1f; ✔️典型解析✔️扩展知识仓✔️RT ✔️QPS✔️ QPS和TPS✔️并发用户数✔️最佳线程数 ✔️典型解析 QPS&#xff0c;指的是系统每秒能处理的请求数(Query Per Second)&#xff0c;在Web应用中我们更关注的是Web应用每秒能处理的re…

Radar System Pro - Plug Play Solution

Radar System Pro是一款功能多样且可定制的资源,旨在通过功能齐全且易于使用的雷达系统增强您的Unity项目。无论您是在开发第一人称射击游戏、策略游戏还是太空探索模拟器,我们的雷达系统都将为您提供所需的工具,以创建引人入胜且身临其境的体验。 雷达系统是一个模块化资产…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述&#xff1a; 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

Unity 贝塞尔曲线工具获取运动轨迹

Unity 贝塞尔曲线工具获取运动轨迹 一、介绍贝塞尔曲线二、Unity中贝塞尔曲线工具介绍1.创建一个空物体挂在上BezierSpline.cs脚本组件2.由上图可知刚创建出来的有两个点和两个手柄组成3.我们可修改其坐标看下效果4.这样我们就可以获得这两个点之间的指定数量的点来作为某个物体…

openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述

文章目录 openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述177.1 功能描述177.2 注意事项177.3 性能 openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述 177.1 功能描述 openGauss对数据复制能力的支持情况为&#xff…

资助26项!基金委公布一批原创探索项目资助结果!

根据《国家自然科学基金原创探索计划项目实施方案&#xff08;试行&#xff09;》要求&#xff0c;现将2023年度数理科学部资助的专项项目&#xff08;指南引导类原创探索计划项目&#xff09;相关信息予以公示&#xff1a; 国家自然科学基金委员会 数理科学部 2023年12月26日…

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时&#xff0c;遇到了 hlist&#xff0c;这个 hlist 用起来像是普通的链表&#xff0c;但是为何使用 hlist&#xff0c;hlist 是怎么工作的&#xff1f; 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…

vue3项目使用pako库解压后端返回zip数据

文章目录 前言一、pako 介绍一些特点和功能&#xff1a;简单示例 二、vue3 实战示例1.安装后引入库安装:引用用自定义hooks 抽取共用逻辑部署小插曲 前言 外部接口返回一个图片数据是经过zip压缩的&#xff0c;前端需要把这个数据处理成可以显示的图片。大概思路&#xff1a;z…

68内网安全-域横向PTHPTKPTT哈希票据传递

今天讲PTH&PTK&PTT&#xff0c; PTH(pass the hash) #利用 lm 或 ntlm 的值进行的渗透测试 PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试 用的Kerberos 协议 PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试 lm加密算法是2003以前的老版&…

vitis HLS中实现canny算法的IP核

一、前言 canny边缘检测主要用于提取图像的边缘&#xff0c;是最常用且有效的边缘检测算法。在AMD赛灵思提供的库函数中&#xff0c;使用xf::cv::Canny和xf::cv::EdgeTracing两个函数实现canny边缘提取。本文举例说明如何在vitis HLS 2023.1中实现canny算法。 二、xf::cv::Cann…

JUC常用并发工具类

JUC常用并发工具类 1、什么是JUC? JUC 就是 java.util.concurrent 包&#xff0c;这个包俗称 JUC&#xff0c;里面都是解决并发问题的一些东西&#xff0c;该包的位置位于 java 下 面的 rt.jar 包下面。 2、4大常用并发工具类 2.1 CountDownLatch CountDownLatch&#x…

基于Java车间工时管理系统(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…