OP Vault
OP Vault使用OP Stack(OpenAI + Pinecone矢量数据库),允许用户上传他们自定义的知识库文件,并提问相关内容。
通过快速设置,您可以启动自己的Golang服务器版本以及一个用户友好的React前端,允许用户针对提供的特定知识库向OpenAI提问。主要关注的是人类可读内容,如书籍、信件和其他文档,使其成为知识提取和问答的实用工具。您可以上传整个图书馆的书籍和文档,并接收明确的答案以及文件名和文件中特定部分的信息!
您可以用OP Vault做什么?
使用The Vault,您可以:
- 通过简单的React前端上传各种流行文档类型以创建自定义知识库
- 根据您上传文档的内容检索准确和相关的答案
- 查看文件名和提供答案的具体上下文片段
- 在用户友好的界面中探索OP Stack(OpenAI + Pinecone Vector Database)的强大功能
- 将整个图书馆的书籍加载到The Vault中
手动依赖项
- node: v19
- go: v1.18.9 darwin/arm64
- poppler
设置
安装手动依赖项
- 安装go:
请遵循这里的go文档 go docs
- 安装node v19
我建议使用nvm来安装node v19 installing nvm
- 安装poppler
在Ubuntu上执行sudo apt-get install -y poppler-utils
,或在Mac上执行brew install poppler
在secret
文件夹中设置您的API密钥和端点
- 创建一个新文件
secret/openai_api_key
并将您的OpenAI API密钥粘贴到其中:
echo "your_openai_api_key_here" > secret/openai_api_key
- 创建一个新文件
secret/pinecone_api_key
并将您的Pinecone API密钥粘贴到其中:
echo "your_pinecone_api_key_here" > secret/pinecone_api_key
在设置您的pinecone索引时,使用1536
的矢量大小并保持所有默认设置不变。
- 创建一个新文件
secret/pinecone_api_endpoint
并将您的Pinecone API端点粘贴到其中:
echo "https://example-50709b5.svc.asia-southeast1-gcp.pinecone.io" > secret/pinecone_api_endpoint
运行开发环境
-
安装JavaScript包依赖:
npm install
-
运行Golang Web服务器(默认端口
:8100
):npm start
-
在另一个终端窗口中,运行webpack以编译JS代码并创建bundle.js文件:
npm run dev
-
访问本地版本的网站:http://localhost:8100
截图:
在示例截图中,我上传了柏拉图的几本书和亚历山大·汉密尔顿的一些信件,展示了OP Vault根据上传内容回答问题的能力。
上传文件
提问
底层实现
Golang服务器使用POST API来处理上传和回答问题:
-
/upload
用于上传文件 -
/api/question
用于回答问题
所有API端点都声明在 vault-web-server/main.go。
上传文件并将其处理成嵌入
vault-web-server/postapi/fileupload.go 文件包含UploadHandler
逻辑,用于在后端处理传入的上传。
postapi包中的UploadHandler函数负责处理文件上传(最大总上传大小为300 MB)并将其处理成嵌入以存储在Pinecone中。它接受PDF、epub、.docx和纯文本文件,从中提取文本并将内容分成块。使用OpenAI API,它为每个块获取嵌入并将嵌入(插入或更新)到Pinecone中。该函数返回包含有关上传文件及其处理状态信息的JSON响应。
- 将请求主体的最大大小限制为MAX_TOTAL_UPLOAD_SIZE(300 MB)。
- 解析传入的多部分表单数据,最大允许大小为300 MB。
- 初始化响应数据,包含成功和失败的文件上传字段。
- 遍历上传的文件,对于每个文件: a. 检查文件大小是否在允许的限制内(MAX_FILE_SIZE, 300 MB)。 b. 将文件读入内存。 c. 如果文件是PDF,则从中提取文本;否则,将内容读取为纯文本。 d. 将文件内容分成块。 e. 使用OpenAI API为每个块获取嵌入。 f. 将嵌入(插入或更新)到Pinecone中。 g. 使用有关成功和失败上传的信息更新响应数据。
- 返回包含上传文件及其处理状态信息的JSON响应。
将嵌入存储到Pinecone数据库
在获取每个上传文件块的OpenAI嵌入后,服务器将所有嵌入以及每个嵌入相关的元数据存储在Pinecone数据库中。每个嵌入的元数据在upsertEmbeddingsToPinecone函数中创建,具有以下键和值:
file_name
:提取文本块的文件名。start
:原始文件中文本块的起始字符位置。end
:原始文件中文本块的结束字符位置。title
:块的标题,在这种情况下也是文件名。text
:块的文本。
这些元数据有助于为嵌入提供上下文,并在从Pinecone数据库中检索结果时用于显示有关匹配嵌入的附加信息。
回答问题
vault-web-server/postapi/questions.go 中的QuestionHandler
函数负责处理所有传入的问题。当在前端输入问题并按下“搜索”(或回车)时,服务器再次使用OpenAI嵌入API获取问题的嵌入(即查询矢量)。此查询矢量用于查询Pinecone数据库以获取与问题最相关的上下文。最后,通过将最相关的上下文和问题打包成符合OpenAI令牌限制的提示字符串来构建提示(go tiktoken库用于估计令牌数)。
前端信息
前端是使用React.js
和less
进行样式化构建的。
带有长期记忆的生成问答
如果您想阅读更多相关主题,我推荐阅读pinecone博客中的这篇文章:
希望您喜欢(:
上传较大的文件
目前我的最大单个文件大小设置为3MB。如果您想增加此限制,请编辑fileupload.go中的MAX_FILE_SIZE
和MAX_TOTAL_UPLOAD_SIZE
常量。
支持的文件类型
PDFs、.txt、.rtf、.docx、.epub和纯文本。
New Pinecone Free Tier Restrictions
最近,Pinecone限制了免费用户的命名空间使用。如果您是新创建的免费用户,这些限制将适用于您。