使用 Activeloop 的 DeepLake 进行问答
概述
在这个教程中,我们将使用 Langchain + Activeloop 的 Deep Lake 以及 GPT4 来语义搜索并在群聊中提问。
1. 安装所需包
!python3 -m pip install --upgrade langchain 'deeplake[enterprise]' openai tiktoken
2. 添加 API 密钥
import getpass
import os
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import DeepLake
from langchain_openai import OpenAI, OpenAIEmbeddings
from langchain_text_splitters import (
CharacterTextSplitter,
RecursiveCharacterTextSplitter,
)
# 隐藏输入以获取 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
# 隐藏输入以获取 Activeloop Token
activeloop_token = getpass.getpass("Activeloop Token:")
# 设置环境变量
os.environ["ACTIVELOOP_TOKEN"] = activeloop_token
os.environ["ACTIVELOOP_ORG"] = getpass.getpass("Activeloop Org:")
# 从环境变量获取组织ID
org_id = os.environ["ACTIVELOOP_ORG"]
embeddings = OpenAIEmbeddings()
# 设置数据集路径
dataset_path = "hub://" + org_id + "/data"
3. 创建示例数据
您可以使用 ChatGPT 生成示例群聊对话,使用以下提示:
生成一个群聊对话,三个朋友谈论他们的一天,提及真实地点和虚构名字。使其尽可能有趣和详细。
我已经在 messages.txt 中生成了这样一个聊天。我们可以保持简单,并使用这个作为我们的示例。
4. 摄取聊天嵌入
我们加载文本文件中的消息,分块并上传到 ActiveLoop 向量存储。
with open("messages.txt") as f:
# 读取文件内容
state_of_the_union = f.read()
# 创建基于字符的文本分割器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 分割文本
pages = text_splitter.split_text(state_of_the_union)
# 创建递归字符文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
# 创建文档
texts = text_splitter.create_documents(pages)
# 打印文档
print(texts)
# 设置数据集路径
dataset_path = "hub://" + org_id + "/data"
# 初始化 OpenAI 嵌入
embeddings = OpenAIEmbeddings()
# 从文档创建 DeepLake 实例
db = DeepLake.from_documents(
texts, embeddings, dataset_path=dataset_path, overwrite=True
)
可选步骤:使用 Deep Lake 的托管张量数据库作为托管服务并在那里运行查询
您也可以使用 Deep Lake 的托管张量数据库作为托管服务,并在那里运行查询。为此,在创建向量存储时,需要指定运行时参数为 {'tensor_db': True}
。此配置启用在托管张量数据库上执行查询,而不是在客户端上。需要注意的是,此功能不适用于本地存储或内存中的数据集。如果向量存储已经在托管张量数据库之外创建,可以通过遵循规定的步骤将其转移到托管张量数据库。
with open("messages.txt" as f:
state_of_the_union = f.read()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
pages = text_splitter.split_text(state_of_the_union)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = text_splitter.create_documents(pages)
print(texts)
dataset_path = "hub://" + org + "/data"
embeddings = OpenAIEmbeddings()
db = DeepLake.from_documents(
texts, embeddings, dataset_path=dataset_path, overwrite=True, runtime={"tensor_db": True}
)
5. 提问
现在我们可以提出问题并进行语义搜索以获得答案:
db = DeepLake(dataset_path=dataset_path, read_only=True, embedding=embeddings)
# 创建检索器
retriever = db.as_retriever()
# 设置搜索参数
retriever.search_kwargs["distance_metric"] = "cos"
retriever.search_kwargs["k"] = 4
# 创建问答系统
qa = RetrievalQA.from_chain_type(
llm=OpenAI(), chain_type="stuff", retriever=retriever, return_source_documents=False
)
# 示例问题:群聊中提到的餐厅叫什么名字?
query = input("Enter query:")
The Hungry Lobster
# 执行问答
ans = qa({"query": query})
print(ans)
总结
本文介绍了如何结合使用 Langchain、Activeloop 的 Deep Lake 和 GPT4 进行语义搜索和群聊中的问答。首先,介绍了安装所需软件包的步骤,然后指导如何添加 API 密钥,并创建示例群聊数据。接着,详细解释了如何将聊天内容分块并上传到 ActiveLoop 向量存储中。此外,还提供了一个可选步骤,介绍了如何使用 Deep Lake 的托管张量数据库作为托管服务来运行查询。最后,展示了如何通过语义搜索提出问题并获取答案。整个过程为在群聊环境中进行高效的信息检索和问答提供了一种有效的方法。