准备好革新处理文本文件的方式了吗?那就坐稳了,跟着我们逐步了解如何将 OpenAI 与 LangChain 集成的终极指南。
什么是 LangChain?
LangChain 是一个强大的框架,旨在简化大型语言模型 (LLM) 应用程序的开发。通过提供一个通用接口来管理各种 LLM、提示、链接、数据增强生成、代理编排、内存和评估,LangChain 使开发人员能够无缝地将 LLM 与现实世界的数据和工作流集成。该框架允许 LLM 通过整合外部数据源和编排与不同组件的交互序列更有效地解决现实世界的问题。
我们将使用该框架在以下示例应用程序中,从文本文档源生成嵌入并将此内容保留在 Chroma 向量数据库中。然后,我们将使用 LangChain 在后台处理用户提供的问题,使用 OpenAI 语言模型进行查询。
这将使我们能够与我们自己的文本文档聊天。
设置项目
创建一个新的项目文件夹,并安装以下 Python 包:
pip install langchain openai chromadb tiktoken
使用 Python 包管理器 pip 安装 langchain
、openai
、chromadb
和 tiktoken
四个 Python 包。每个包都有特定的目的,它们一起协同工作,帮助你将 LangChain 与 OpenAI 模型集成,并在应用程序中管理令牌。我们来分解一下涉及到的包:
langchain
:这个包是主要的 LangChain 库,用于为创建与文本文档交互的交互式聊天体验与 OpenAI 模型实现无缝集成。openai
:这是 OpenAI 的官方 Python 包,使你能够使用 OpenAI 提供的强大语言模型,如 GPT-4。chromadb
:ChromaDB 是一个轻量级、高性能、无模式向量数据库,专为 AI 应用程序而设计。它允许你存储、检索和管理用于 LangChain 和 OpenAI 驱动的文档聊天应用程序所需的向量数据(嵌入)。tiktoken
:Tiktoken 是由 OpenAI 提供的实用库,可帮助你在不进行 API 调用的情况下计数和管理文本字符串中的令牌。这对于监视令牌使用情况、保持在 API 限制范围内以及高效地使用 OpenAI 的模型非常有用。
通过执行此命令,你将安装所有必要的包,以开始构建和部署利用 LangChain 与 OpenAI 的文本文档聊天应用程序。
将以下两个文件添加到项目文件夹中:
touch init_vectorstore.py ask.py
此外,让我们将一个 txt 文档也添加到项目中。对于本文例子,将国情咨文文本添加为 state_of_the_union.txt,如下所示:
现在,将以下 Python 代码添加到文件 init_vectorstore.py 中。
该代码读取文本文档,将其分成较小的块,并使用 OpenAI 模型生成嵌入。然后,它创建并保留一个包含嵌入和相关元数据的 Chroma 数据库。这允许有效地存储和检索文档嵌入,以进行基于 AI 的文本分析和交互。
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
import 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
以下是代码的逐步说明:
-
导入必要的库和模块:
-
langchain.embeddings.openai
中的OpenAIEmbeddings
用于使用 OpenAI 模型并生成嵌入。 -
langchain.text_splitter
中的CharacterTextSplitter
用于将输入文本分成较小的块。 -
langchain.vectorstores
中的Chroma
用于创建 Chroma 数据库以存储嵌入和元数据。 -
os
用于处理环境变量。
-
使用
os.environ
将 OpenAI API 密钥设置为环境变量。要获取 OpenAI API 密钥,请在 OpenAI 的官方网站(https://www.openai.com/)上注册账户。一旦你的账户获得批准,在你的账户设置或仪表板下找到 API 密钥部分。你将在那里找到你的唯一 API 密钥,可以用它来访问 OpenAI 的模型和服务。 -
打开并读取 “state_of_the_union.txt” 文件的内容到一个名为
state_of_the_union
的变量中。 -
使用
text_splitter
实例的split_text
方法,使用chunk_size
为 1000 个字符和chunk_overlap
为 0,将state_of_the_union
文本分成块。 -
创建一个名为
embeddings
的OpenAIEmbeddings
实例,使用 OpenAI 模型生成文档嵌入。 -
使用
from_texts()
方法实例化Chroma
对象,该方法接受以下参数:
texts
: 先前生成的文本块。embeddings
: 用于生成嵌入向量的 OpenAIEmbeddings 实例。metadatas
: 每个文本块的元数据字典列表。persist_directory
: 存储 Chroma 数据库的目录(在此示例中为“db”)。
-
使用
persist()
方法将Chroma
对象持久化到指定目录中。 -
将
docsearch
变量设置为None
以将其从内存中清除。
简而言之,这段代码读取文本文档,将其分割成较小的块,使用 OpenAI 模型生成嵌入向量,使用生成的嵌入向量和元数据创建 Chroma 数据库,并将数据库持久化到指定目录中以供将来使用。
让我们使用以下命令运行此代码,以创建 Chroma 向量数据库的嵌入内容:
python init_vectorstore.py
然后,你应该收到以下输出:
在你的项目文件夹中,你应该能够找到一个包含一些内容的 db 子文件夹。
与文本文档交互
让我们在文件 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 OpenAIEmbeddings
import 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"])
这里是代码的说明:
-
导入必要的库和模块,包括
RetrievalQAWithSourcesChain
、OpenAI
、Chroma
和OpenAIEmbeddings
。 -
使用
os.environ
将 OpenAI API 密钥设置为环境变量。 -
创建一个名为
embeddings
的OpenAIEmbeddings
实例,使用 OpenAI 模型生成文档嵌入向量。 -
使用
persist_directory
参数(存储先前创建的 Chroma 数据库的目录)和embedding_function
参数(embeddings
实例)实例化Chroma
对象。 -
使用
from_chain_type()
方法创建一个RetrievalQAWithSourcesChain
实例。该实例采用以下参数: -
OpenAI(temperature=0)
:一个具有指定温度设置的OpenAI
类实例。 -
chain_type="stuff"
:要创建的链的类型(在本例中为“stuff”)。 -
retriever=docsearch.as_retriever()
:检索器对象,这是将 Chroma 实例转换为检索器的as_retriever()
方法。
-
使用
input()
函数提示用户输入一个问题。 -
将用户的问题传递给 QA 系统(
chain
实例)并检索结果。 -
打印答案和答案的来源,从答案文本中删除换行符。
简而言之,这段代码使用 LangChain、OpenAI 模型和包含嵌入向量的 Chroma 数据库创建了一个简单的 QA 系统。它提示用户提出问题,使用 QA 系统处理问题,并返回答案以及其来源——让我们看看它的运行情况。使用以下命令启动脚本:
python ask.py
然后你将被要求输入问题:
输入与国情咨文文本的任何内容相关的问题,例如:
然后,你将收到答案以及所用于检索所需信息的文本块的来源信息。
现在,我们可以通过在后台使用 OpenAI 的语言模型来提出与文本文档相关的任何问题。
结论
OpenAI 模型和 LangChain 的强大组合开启了使用文本文档交互方式的新可能性。正如我们在本指南中演示的那样,集成这些尖端技术从未如此简单。
评论(0)