构建自定义聊天机器人,以使用 LangChain、OpenAI 和 PineconeDB 从任何数据源开发问答应用程序
介绍
大型语言模型的出现是我们这个时代最令人兴奋的技术发展之一。它为人工智能领域开辟了无限可能,为各行业的现实问题提供了解决方案。这些模型最有趣的应用之一是开发来自个人或组织数据源的自定义问答或聊天机器人。然而,由于LLMS接受的是公开可用的一般数据的培训,因此他们的答案可能并不总是具体或对最终用户有用。为了解决这个问题,我们可以使用LangChain等框架来开发自定义聊天机器人,根据我们的数据提供特定的答案。在本文中,我们将学习如何构建自定义问答应用程序并部署在 Streamlit Cloud 上。那么让我们开始吧!
学习目标:
- 了解为什么自定义问答应用程序比微调语言模型更好
- 学习使用 OpenAI 和 Pinecone 开发语义搜索管道
- 开发自定义问答应用程序并将其部署在 Streamlit 云上。
目录:
- 问答应用概述
- 什么是 Pinecone 矢量数据库?
- 使用 OpenAI 和 Pinecone 构建语义搜索管道
- 带 Streamlit 的自定义问答应用程序
- 结论
- 常见问题解答
问答应用概述
问答或“通过数据聊天”是LLMs 和 LangChain 的一个流行用例。LangChain 提供了一系列组件来加载您可以为您的用例找到的任何数据源。它支持大量数据源和转换器转换为一系列字符串以存储在矢量数据库中。一旦数据存储在数据库中,就可以使用称为检索器的组件查询数据库。此外,通过使用LLMS,我们可以像聊天机器人一样获得准确的答案,而无需处理大量文档。
LangChain支持以下数据源。如图所示,它允许超过 120 个集成来连接您可能拥有的每个数据源。
图片
问答应用程序工作流程
我们了解了LangChain支持的数据源,这使我们能够使用LangChain中可用的组件开发问答管道。以下是 LLM 用于文档加载、存储、检索和生成输出的组件。
- 文档加载器:加载用户文档以进行矢量化和存储
- 文本分割器:这些是文档转换器,可将文档转换为固定的块长度以有效地存储它们
- 矢量存储:矢量数据库集成,用于存储输入文本的矢量嵌入
- 文档检索:根据用户对数据库的查询来检索文本。他们使用相似性搜索技术来检索相同的内容。
- 模型输出:根据查询的输入提示和检索到的文本生成的用户查询的最终模型输出。
这是问答管道的高级工作流程,可以解决多种类型的现实问题。我没有深入研究每个 LangChain 组件
图片
自定义问答相对于模型微调的优势
- 针对具体情况的答案
- 适应新的输入文档
- 无需对模型进行微调,节省模型训练成本
- 比一般答案更准确和具体的答案
什么是Pinecone 矢量数据库?
Pinecone
Pinecone 是一种流行的矢量数据库,用于构建 LLM 支持的应用程序。它具有多功能性和可扩展性,适用于高性能人工智能应用。它是一个完全托管的云原生矢量数据库,不会给用户带来任何基础设施麻烦。
LLMS基础应用程序涉及大量非结构化数据,需要复杂的长期记忆才能以最大准确度检索信息。生成式人工智能应用程序依靠向量嵌入的语义搜索来根据用户输入返回合适的上下文。
Pinecone 非常适合此类应用程序,并经过优化以低延迟存储和查询大量向量,以构建用户友好的应用程序。让我们学习如何为我们的问答应用程序设置松果矢量数据库。
# install pinecone-client
pip install pinecone-client
# 导入 pinecone 并使用您的 API 密钥和环境名称进行初始化
import pinecone
pinecone.init(api_key= "YOUR_API_KEY" ,envirnotallow= "YOUR_ENVIRONMENT" )
# 创建您的第一个索引以开始存储Vectors
pinecone.create_index( "first_index" ,Dimension= 8 , metric= "cosine" )
# 更新插入样本数据(5个8维向量)
index.upsert([
( "A" , [ 0.1 , 0.1 , 0.1 , 0.1 , 0.1 ) , 0.1 , 0.1 , 0.1 ]),
( "B" , [ 0.2 , 0.2 , 0.2 , 0.2 , 0.2 , 0.2 , 0.2 , 0.2 ]),
( "C" , [ 0.3 , 0.3 , 0.3 , 0.3 , 0.3 , 0.3 , 0.3 , 0.3 ]),
( "D" , [ 0.4 , 0.4 , 0.4 , 0.4 , 0.4 , 0.4 , 0.4 , 0.4 ]),
( "E" , [ 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 ])
])
# 使用 list_indexes() 方法调用 db 中可用的多个索引
pinecone.list_indexes()
[Output]>>> [ 'first_index' ]
分享说明:转发分享请注明出处。