该项目提供了一个简单的Web应用程序,该应用程序使用户能够上传PDF文档,从其内容中生成向量嵌入,然后使用文本查询在文档中搜索信息。 OpenAI的嵌入和语言模型用于创建向量嵌入和信息检索。
PDF文档摄入:用户可以通过Web界面上传PDF文档以进行信息检索。
生成矢量嵌入:从PDF提取文本内容,并使用Langchain分为较小的块。使用OpenAI的文本嵌入模型(例如,text-embedding-ada-002)为每个块生成嵌入。
向量数据库存储:将生成的向量嵌入在诸如Pinecone之类的向量数据库中存储,以进行相似性搜索。
完善的用户查询:使用OpenAI的聊天完成API来完善用户查询,以提高搜索准确性。
搜索信息:用户可以输入文本查询以搜索上传文档中的信息。该系统根据其向量相似性与查询嵌入的相似性检索相关的文本块。
生成响应:基于检索到的文本块,上下文(以前的查询和响应)以及用户的查询,使用OpenAI模型(GPT-4O,GPT-4或GPT-3.5-Turbo)生成响应。用户可以通过Web界面选择OpenAI模型。模型的选择会影响响应方式,细节和准确性。
需求.txt文件列出了运行该应用程序所需的必要的Python软件包及其版本。这是每个软件包的分解:
烧瓶:用于构建Web应用程序的轻质Python Web框架。
Pinecone-Client :用于与Pinecone进行交互的官方Python客户库,Pinecone是您应用程序中使用的矢量数据库。
OpenAI :OpenAI API的官方Python客户库库,用于生成文本嵌入并与OpenAI语言模型进行交互。
PYPDF2 :一个用于从PDF文件中提取文本的纯Python库。
Langchain :用于使用大型语言模型构建应用程序的框架,用于您的应用程序进行文本分割和分解。
Numpy :用于Python中科学计算的软件包,用于使用多维阵列和向量。
要安装这些依赖项,您可以创建一个新的Python虚拟环境并运行以下命令:
pip install -r要求.txt
要与OpenAI和Pinecone集成,您需要为这些平台获取并配置相应的API键,主机(Pinecone)信息。将您的OpenAI和Pinecone API键,以及Pinecone主机作为Linux中的环境变量。使用以下Linux命令导出这些变量:
导出openai_api_key ='your-openai-api-key'
导出pinecone_api_key ='your-pinecone-api-key'
导出pinecone_host ='your pinecone-host'
确保您拥有带有有效API键的OpenAI帐户。您可以从OpenAI平台(https://platform.openai.com/)创建或获取API键并管理它们(https://platform.openai.com/organization/api-keys)。此外,请确保您的帐户具有足够的用法配额,因为本示例需要一个付费的OpenAI帐户。
Pinecone环境(Pinecone免费帐户使用https://www.pinecone.io/):1)使用Pinecone索引2)尺寸:1536 3)主机类型:无服务器。
CentOS Linux版本8.5.2111用作Linux OS。具有公共IP(可选)的Cloud Linux VM已针对Web界面进行了测试。也可以使用本地IP。创建一个Python虚拟环境(可选但建议)以隔离项目依赖性。
该应用程序提供了一个使用烧瓶(Python Web框架)构建的Web接口。用户可以上传PDF文档,输入查询,选择要使用的OpenAI语言模型(GPT-3.5-Turbo,GPT-4或GPT-4O),并根据从上传的PDF文档中提取的信息获得详细的响应。
摄入PDF文档并创建向量嵌入
该应用程序提供了一个Web接口,用户可以在其中上传PDF文档。上载PDF文件后,将从文档中提取文本内容,并使用Langchain库中的recursivecharactertextsplitter分为较小的块。这种分裂过程可确保文本分为可管理的块,同时保持上下文。
接下来,使用OpenAI的Text-Embedding-ADA-002型号为每个文本块生成矢量嵌入。这些嵌入是高维向量,可捕获文本的语义含义,从而实现有效的相似性搜索。
将矢量嵌入在松果中
生成的向量嵌入及其相应的文本块和页码都存储在Pinecone矢量数据库中。 Pinecone是一个可扩展有效的矢量数据库,旨在存储和查询高维矢量。
查询处理
当用户通过Web界面提交查询时,应用程序将在以下步骤中对其进行处理:
查询细化:
用户的查询将发送到OpenAI的语言模型(例如,GPT-3.5-Turbo,GPT-4或GPT-4O),以完善和改进查询以提高搜索准确性。
嵌入查询的生成
精制查询使用OpenAI的Text-Embedding-ADA-002型号转换为嵌入向量嵌入。
相似性搜索:
查询嵌入用于搜索Pinecone Vector数据库,以基于向量相似性来为最相似的文本块。
注意:要查询Pinecone索引并检索顶部结果,使用以下代码(app.py)
#ADJUST并根据您的用例实验TOP_K值
结果= pinecone_index.query(vector = paded_query_vector.tolist(),top_k = 1,include_metadata = true)
TOP_K参数指定从查询返回的顶部结果数。调整TOP_K值可能会影响查询响应的质量。更高的TOP_K值可能会提供更全面的结果,但也可能引入较少的相关数据。相反,较低的TOP_K值可能会产生更精确但更少的结果。重要的是要尝试不同的TOP_K值,以找到特定用例的最佳平衡。此外,请注意,提高TOP_K值也会影响成本,尤其是在使用付费OpenAI模型处理结果时。较高的TOP_K值会导致更多数据发送到模型并处理的数据,这可能导致使用费用增加。
注意:score_threshold参数确定要考虑结果可能影响查询响应质量的结果所需的最小相关得分。因此,根据您的用例和实验(app.py)调整阈值值。
#根据您的用例调整阈值
score_threshold = 0.65
响应生成:
从数据库中检索到的相关文本块与先前的上下文(如果有)和原始用户查询结合使用。然后将此信息发送到OpenAI的语言模型(与查询细化的相同模型),以生成全面且相关的响应。
上下文意识回应:
该应用程序维护先前查询和响应的上下文。在响应生成步骤中,此上下文将传递给OpenAI的语言模型,以确保生成的响应考虑了对话历史记录并提供准确且上下文相关的信息。
要运行该应用程序,请按照以下步骤:
激活您的python虚拟环境(可选):( venv)[user@host project_directory]#
运行app.py脚本:python app.py
该应用程序将开始在端口5000上运行,您可能会看到类似的输出如下:
确保应用程序正在积极收听端口5000上的传入连接:
Netstat -Auttpn | GREP -I 5000 TCP 0 0 0.0.0.0:5000 0.0.0.0.0 :**听525661/python
http://127.0.0.1:5000/(用于本地访问)
http:// vm公共IP:5000/(用于通过Internet进行远程访问)
注意:如果您打算通过公共IP访问该应用程序,请确保通过VM的防火墙允许在端口5000上传入流量。这将确保允许通过公共IP进行通信,并且您可以远程访问Web界面。
另外,请确保您的Linux计算机上的文件夹(其中包含上传的PDF文件)不包含具有相同名称的PDF文件。如果文件已经存在,将被覆盖。
选择PDF文件,然后使用“上传”按钮上传。
单击“进程文件”(在此阶段,将创建矢量嵌入并存储在Pinecone数据库中)。
输入您的搜索查询。从下拉菜单中选择OpenAI语言模型。
检查查询响应。提交后续查询。
完成后,单击“结束会话”(它将触发清理 - 在数据库中删除上传的文件和矢量嵌入)
在Linux Macine上,按CTRL+C关闭应用程序(app.py)。