Enhancing ChatGPT With Infinite External Memory Using Vector Database and ChatGPT Retrieval Plugin(c
I. 引言
ChatGPT+Vector数据库+prompt编码的综合解决方案,解决了AI模型的限制问题。通过嵌入向量、向量搜索和prompt编码的组合使用,解锁了ChatGPT等大型语言模型的全部潜力。
II. ChatGPT模型概述
ChatGPT是一种大型语言模型,用于生成人机交互的自然语言响应。这类模型基于Transformer架构,可以进行多轮对话,并具有生成图文回复的能力。
III. Vector数据库的使用
向量数据库提供了ChatGPT模型的外部存储,实现了无穷的外部记忆能力。
- 第一步:将用户的输入数据(问题)进行嵌入处理。
- 第二步:连接到VectorDB进行语义搜索。
- 第三步:检索相关的响应并返回给用户。
IV. prompt编码的利用
提供了用于自定义对话风格的prompt编码,为聊天机器人定制拟人化对话风格。在query_data.py文件中,QA_PROMPT是一个用于定制对话风格的重要部份。
V. ChatGPT与VectorDB的集成
设定聊天历史记录,以跟踪上一次的对话交互。进入循环,用户可以输入问题或提示。使用ChatGPT模型对用户输入的问题进行处理,并将其转换为向量表示。连接到VectorDB进行语义搜索,并检索相关的响应。
VI. ChatGPT自动查询生成
创建一个插件,不再使用prompt编码来搜索向量数据库。ChatGPT生成查询文本,并将其用于获得相关的响应。
VII. prompt工程化指南和资源
提供有关prompt工程化的指南,论文,讲座,笔记和资源。实验项目,将Embedbase向量数据库和ChatGPT API结合使用。
总结:
ChatGPT+VectorDB+Prompt的综合解决方案为定制化AI人机交互提供了强大的功能。通过向量数据库的嵌入和搜索,和使用prompt编码,用户可以实现个性化的对话风格,并且ChatGPT模型能够无穷地获得外部记忆。此技术在自然语言处理和对话系统的领域具有广泛的利用前景。
chatgpt + vectordb + prompt的进一步展开说明
标题:使用向量数据库和ChatGPT检索插件增强ChatGPT的外部无尽记忆
摘要:在GPT中加入无穷的外部记忆可以提高其在定制任务中的性能。本文介绍了一种不需要对模型本身进行任何修改的方法,即便用外部向量数据库存储数据,并让GPT从数据库中检索相关数据来回答问题。使用本文的逐渐指南,我们将探讨怎样使用向量数据库为GPT提供无穷的外部记忆,以实现定制任务的潜力。
引言:
GPT是自然语言处理任务中一种非常强大的工具。但是,对定制任务来讲,由于输入标记大小的限制,它的功能可能会遭到限制。
例如,GPT的输入大小是有限的(GPT3.5为4,096),但你可能有一本非常长的书(例如)需要发问。虽然使用私有数据对GPT进行微调是一种潜伏的解决方案,但这多是一个复杂且昂贵的进程,需要高计算能力和机器学习专业知识。
荣幸的是,还有一种替换方案,可以在不需要对模型本身进行任何更改的情况下增强GPT的性能:使用外部向量数据库存储数据,并让GPT检索相关数据以回答问题。在本步骤指南中,我们将探索怎样使用向量数据库为GPT提供无穷的外部记忆,释放其用于定制任务的潜力。
本指南适用于希望使用GPT分析特定数据的任何人,不管他们在机器学习或数据库管理方面会不会有经验。
整体思路:
让我们先来概述这个项目的整体思路:
1. 将长文本分成能被GPT处理的小块。
2. 将每一个块存储在向量数据库中,并通过索引向量进行索引。
3. 当向GPT发问问题时,首先将问题转换成问题嵌入向量。
4. 使用问题嵌入向量从向量数据库中搜索块。
5. 将块和问题组合成提示,然后将其输入GPT。
6. 从GPT获得回答。
在本教程中,我将实现一个演示项目,以实现这些步骤,从而使GPT能够访问无穷的外部记忆。
在示例数据中,我将准备一些定制的文本文件,这些文件在GPT之前是不可见的,并将它们作为GPT的记忆输入。然后,我们可以就这些大型输入文本发问,这在普通的ChatGPT中是不可能的,由于它有输入令牌的限制。
术语解释:
这篇文章适用于所有读者,不管他们在机器学习或数据库管理方面的背景如何。如果你已熟习这些主题,可以跳过本部份。但对那些对这些概念还不熟习的读者,我将扼要解释一些关键术语,以帮助你更好地理解内容。
甚么是嵌入(embedding)?
嵌入就是一个向量,一个只有机器可以理解的语义意义的数字列表。
这很有用,由于它让计算性能够理解单词的含义和它们之间的关系,即便对计算机来讲,它们只是一堆字母。
例如,假定我们有单词”dog”和”cat”。我们可以将”dog”表示为一个数字向量,”cat”表示为另外一个向量。如果你比较”dog”和”cat”的向量,你会发现它们在数学上是靠近的,由于它们都是常见的宠物。
在我们的例子中,当提交一个问题时,它会被转换成一个问题嵌入。通过将问题的向量表示与数据库中块的向量表示进行比较,可以检索与该问题最相关的块。
甚么是向量数据库?
向量数据库是一种将信息存储为向量或数字数组的数据库类型。每条信息都表示为一个向量,其中向量中的每一个数字对应数据的特定属性或特点。
在这类情况下,你可使用向量作为索引来从数据库中搜索和检索数据。查询向量不需要完全匹配数据库向量。数据库引擎可以高效地检索与接近向量相关的数据。在本案例中,它能检索与你的问题语义相关的块。
设计:
下面是本教程演示的架构。在本教程中,我将逐渐介绍怎么实现这个架构。
如上节所述,用户可以履行以下两个操作:
1. 将外部数据上传到数据库。
2. 关于外部数据发问问题。
图表中有两个用户。
在这个演示中,我们使用了两个OpenAI模型:
1. gpt⑶.5-turbo:你最熟习的模型:ChatGPT。
2. text-embedding-ada-002:一个专门设计用于以非常低的本钱生成准确的嵌入向量的OpenAI模型。
查询接口:
该接口接收用户输入的问题并调用text-embedding-ada-002生成嵌入。然后,使用这个嵌入向量向Database Interface查询与问题相关的块。
它将检索到的块和用户的原始问题组合,并调用gpt⑶.5-turbo(ChatGPT)进行回答。
然后将ChatGPT的答案返回给用户。
数据库接口:
1. 查询:接收查询接口的用户问题并查询向量数据库。
2. 插入:接收用户的长文本,将文本分割成小块,将每一个块转换成嵌入向量,并将
向量数据库:
Database Interface背后的实际数据库。在这个演示中,我们使用的是Pinecone数据库。
工具:
上述设计听起来像是一个复杂的项目,但我们不需要重复发明轮子。下面是我们需要实现这个项目所需的工具列表。
1. OpenAI API:调用上述两个模型
2. Pinecone:向量数据库
3. GPT检索插件:OpenAI最近发布的一个工具。这是我们处理所有块划分、嵌入模型调用和向量数据库交互的Database Interface
4. FastAPI:用Python构建API的快速Web框架。这是GPT检索插件的内置框架
设置GPT检索插件(Database Interface):
GPT检索插件处理文本分块、向量数据库搜索和插入。这是OpenAI最近发布的一个工具。该工具将作为一个基于FastAPI的服务器在您的本地机器上运行。
它的GitHub页面已包括了配置步骤。我将介绍本演示所需的步骤:
1. 克隆项目:
git clone https://github.com/openai/chatgpt-retrieval-plugin.git
2. 进入克隆的存储库目录:
cd /path/to/chatgpt-retrieval-plugin
3. 安装Poetry:
Python Poetry是一个用于Python项目的依赖管理和打包工具。如果你是JS开发者,它类似于NPM。
这个项目中所有需要的依赖项都在GitHub项目的Pyproject.toml文件中指定。
pip install poetry
4. 创建一个使用Python 3.10的新虚拟环境:
这样,你的cmd/terminal就会在Poetry的虚拟环境下运行,可以访问项目的依赖项。
poetry env use python3.10
poetry shell
然后运行:
poetry install
使用Poetry,你不需要手动安装每一个依赖项。上述一行代码将安装运行项目所需的所有依赖项。
然后,你需要在shell中设置一些环境变量。检索插件将访问这些信息。在上面的导出命令中,将<...>替换为你自己的资源,并在shell中运行以下脚本:
export DATASTORE=pinecone
export BEARER_TOKEN=
export OPENAI_API_KEY=
export PINECONE_API_KEY=
export PINECONE_ENVIRONMENT=
export PINECONE_INDEX=
DATASTORE是你选择的向量数据库提供商的名称。在这里,我将使用Pinecone。其他向量数据库也受支持。请查看GitHub文档。
OPENAI_API_KEY是调用OpenAI模型的API密钥。你可以从https://platform.openai.com/获得一个密钥。
至于PINECONE资源,我将在后面的部份介绍如何取得它们。
BEARER_TOKEN是设置给你的数据库接口的安全令牌。它是调用你自己的服务器的API密钥。使用https://jwt.io/生成一个任意的密钥。在“Decoded”选项卡的”PayLoad”部份:
{“sub”: “1234567890”,”name”: “Write any name”,”iat”: 1516239022}
将此值更改成你喜欢的任意值。然后返回”Encoded”选项卡并复制生成的令牌。将密钥粘贴到上面的export命令中。当服务器启动时,服务器将获得此变量并将其设置为安全令牌。将此令牌保存在某个文件中,由于在发送要求时你将需要它。
设置Pinecone向量数据库:
现在我们设置一个Pinecone向量数据库。
前往https://www.pinecone.io/,注册一个账户并登录。
进入你的仪表盘,点击“Create Index”。这将带你进入创建第一个向量数据库的页面:
你可以依照我的设置进行设置。记住将1536作为你的维数。该维数应与嵌入模型(text-embedding-ada-002)的输出维数相同。
你的仪表板应当以下所示:
一旦你的索引显示”Ready”状态,一切准备就绪。
记住之前我们设置的这些shell变量:
export PINECONE_API_KEY=
export PINECONE_ENVIRONMENT=
export PINECONE_INDEX=
从仪表盘的”API KEY”获得PINECONE_API_KEY。
PINECONE_ENVIRONMENT是你的索引的”Environment”。在我的例子中,它是” us-west4-gcp “。
PINECONE_INDEX是索引名称。在上面的示例中,它是”gpt-test”。
设置这些变量并在命令行中运行它们。
运行数据库接口服务器:
配置就绪。在项目目录下运行:
Poetry run start
它会启动你的数据库接口服务器。在浏览器中打开http://0.0.0.0:8000/docs#/.如果页面打开了,就说明你已成功实现了带有检索插件的数据库接口模块。
数据库接口助手:
我为您编写了一些助手函数,以通过Retrieval Plugin使用向量数据库上传和查询数据。
打开您的Python编辑器(本文假定读者已了解Python并已准备好与Python相关的所有内容)。
创建一个名为secrets.py的文件来存储所有所需的api_key:
OPENAI_API_KEY = “
DATABASE_INTERFACE_BEARER_TOKEN = “
创建一个名为database_utils.py的文件并粘贴以下代码:
“`python
import requests
import os
from secrets import DATABASE_INTERFACE_BEARER_TOKEN
SEARCH_TOP_K = 3
def upsert_file(directory: str):
“””
Upload all files under a directory to the vector database.
“””
url = “http://0.0.0.0:8000/upsert-file”
headers = {“Authorization”: “Bearer ” + DATABASE_INTERFACE_BEARER_TOKEN}
files = []
for filename in os.listdir(directory):
if os.path.isfile(os.path.join(directory, filename)):
file_path = os.path.join(directory, filename)
with open(file_path, “rb”) as f:
file_content = f.read()
files.append((“file”, (filename, file_content, “text/plain”)))
response = requests.post(url, headers=headers, files=files, timeout=600)
if response.status_code == 200:
print(filename + ” uploaded successfully.”)
else:
print(f”Error: {response.status_code} {response.content} for uploading ” + filename)
def upsert(id: str, content: str):
“””
Upload one piece of text to the database.
“””
url = “http://0.0.0.0:8000/upsert”
headers = {“accept”: “application/json”, “Content-Type”: “application/json”, “Authorization”: “Bearer ” + DATABASE_INTERFACE_BEARER_TOKEN}
data = {“documents”: [{“id”: id, “text”: content}]}
response = requests.post(url, json=data, headers=headers, timeout=600)
if response.status_code == 200:
print(“uploaded successfully.”)
else:
print(f”Error: {response.status_code} {response.content}”)
def query_database(query_prompt: str) -> Dict[str, Any]:
“””
Query vector database to retrieve chunk with user’s input question.
“””
url = “http://0.0.0.0:8000/query”
headers = {“Content-Type”: “application/json”, “accept”: “application/json”, “Authorization”: f”Bearer {DATABASE_INTERFACE_BEARER_TOKEN}”}
data = {“queries”: [{“query”: query_prompt, “top_k”: SEARCH_TOP_K}]}
response = requests.post(url, json=data, headers=headers, timeout=600)
if response.status_code == 200:
result = response.json()
# process the result
return result
else:
raise ValueError(f”Error: {response.status_code} : {response.content}”)
if __name__ == “__main__”:
upsert_file(“
“`
chatgpt + vectordb + prompt的常见问答Q&A
问题1:ChatGPT+ Vector database + prompt-as-code – The CVP Stack是甚么?
答案:ChatGPT+ Vector database + prompt-as-code – The CVP Stack是一个AI技术栈,由ChatGPT、向量数据库(VectorDB)和prompt-as-code组成。它的目标是解决使用大型语言模型时的限制。该技术栈结合了嵌入、向量搜索和prompt工程的能力,可以释放出ChatGPT等大型语言模型的全部潜力。
- ChatGPT是一个基于深度学习的语言模型,具有生成自然语言对话的能力。
- VectorDB是一个用于存储和高效搜索向量的数据库,它能够为ChatGPT提供无穷的外部内存,从而扩大其利用领域。
- prompt-as-code是一种编程技术,用于在代码中定义ChatGPT的提示和指点信息,从而定制其输出结果。
问题2:怎样在自己的数据上使用ChatGPT进行问答?
答案:要在自己的数据上使用ChatGPT进行问答,可以依照以下步骤进行:
- 准备自己的数据集,其中包括问题和答案的对应关系。
- 使用ChatGPT API将问题传递给ChatGPT模型,并获得生成的回答。
- 处理返回的回答,以提取有用的信息。
- 将问题和生成的回答进行匹配,找到最好的答案。
这样,就能够在自己的数据上使用ChatGPT进行问答了。
问题3:如何通过无穷的外部内存增强ChatGPT?
答案:要通过无穷的外部内存增强ChatGPT,可使用向量数据库(VectorDB)来实现。以下是实现步骤:
- 将待检索的数据转换为嵌入向量。
- 将嵌入向量存储在VectorDB中。
- 使用ChatGPT生成的问题的嵌入向量进行语义搜索。
- 从VectorDB中检索与问题最相关的响应。
这样,通过将ChatGPT与VectorDB结合起来,就能够实现ChatGPT的无穷外部内存,从而扩大其利用范围。
问题4:怎样创建个性化的AI利用程序?
答案:要创建个性化的AI利用程序,可以依照以下步骤进行:
- 准备要用于个性化AI的数据集,并根据需要进行预处理。
- 使用ChatGPT API将问题传递给ChatGPT模型,并获得生成的回答。
- 处理返回的回答,提取有用的信息。
- 根据利用程序的需求,定制回答的格式和内容。
- 将定制后的回答展现给用户。
通过这些步骤,就能够创建一个个性化的AI利用程序,满足特定需求。
问题5:LangChain上的ChatGPT Over Your Data教程是甚么?
答案:LangChain上的ChatGPT Over Your Data教程是一篇教程,指点怎样在LangChain平台上使用ChatGPT处理自己的数据。以下是教程的主要内容:
- 介绍如何准备自己的数据集。
- 讲授怎样使用ChatGPT API将问题传递给ChatGPT模型。
- 演示怎么处理返回的回答,并提取有用的信息。
- 展现如何根据自己的需求进行定制,并定制输出的格式和内容。
通过这个教程,读者可以学习怎样在LangChain平台上使用ChatGPT处理自己的数据,进一步扩大ChatGPT的利用领域。
问题6:怎样使用OpenAI和VectorDB定制ChatGPT的输出?
答案:要使用OpenAI和VectorDB定制ChatGPT的输出,可以依照以下步骤进行:
- 准备自己的数据集,并将其存储在VectorDB中。
- 使用ChatGPT API将问题传递给ChatGPT模型,并获得生成的回答。
- 将生成的回答解析为查询字符串。
- 使用查询字符串在VectorDB中进行搜索,找到与问题相关的响应。
- 根据需求定制响应的格式和内容。
这样,通过使用OpenAI和VectorDB,就能够定制ChatGPT的输出,使其更符合特定需求。
问题7:VectorDB和插件的用例有哪几种?
答案:VectorDB和插件有以下几个用例:
- 在聊天机器人中使用VectorDB来存储和搜索内部知识库,以提供更精准的回答。
- 创建ChatGPT插件,使用嵌入向量而不是prompt嵌入进行向量数据库的搜索。
- 将VectorDB与其他AI技术组合使用,如情感分析、主题分类等。
- 将VectorDB与其他数据库集成,以提高搜索效力和准确性。
通过这些用例,可以发挥VectorDB和插件的潜力,增强ChatGPT的功能和性能。
问题8:ChatGPT、VectorDB和嵌入等是甚么?
答案:ChatGPT是一个基于深度学习的语言模型,具有生成自然语言对话的能力。VectorDB是一个用于存储和高效搜索向量的数据库,能够为ChatGPT提供无穷的外部内存。嵌入(Embedding)是用于将文本或数据转换为向量表示的技术,它可以在向量空间中表示语义和语法信息。
问题9:ChatGPT、VectorDB和Embeddings等在GitHub上有哪几种相关主题?
答案:在GitHub上,与ChatGPT、VectorDB和Embeddings相关的主题有很多。一些主题包括:
- ChatGPT的源代码、示例和教程。
- 使用VectorDB和ChatGPT构建个性化AI利用的项目。
- 关于Embeddings的研究论文、笔记本和资源。
通过GitHub上的这些主题,可以深入了解ChatGPT、VectorDB和Embeddings的开发和利用。