员工入职 RAG 系统
公共网站是与广泛受众分享信息的绝佳途径。然而,如果您不熟悉网站结构或使用的术语,找到正确的信息可能会充满挑战。这就是搜索栏的作用,但如果您还不熟悉内容,要制定能返回所需结果的查询并非总是易事。这在企业环境中尤为重要,对于刚开始熟悉情况、甚至不知道如何提出正确问题的新员工更是如此。您可能拥有最好的内网页面,但入职不仅仅是阅读文档,更关乎理解流程。语义搜索可以帮助更轻松地找到合适的资源,但如果能像与同事聊天一样直接与网站对话,岂不更简单?
技术进步使得使用自然语言与网站进行交互成为可能。本教程将指导您完成将 Cohere 的语言模型与 Qdrant 集成,以在您的文档上启用自然语言搜索的过程。我们将使用 LangChain 作为编排器。所有内容都将托管在 Oracle 云基础设施 (OCI) 上,这样您就可以根据需要扩展您的应用程序,并且无需将数据发送给第三方。这在处理机密或敏感数据时尤为重要。
构建应用程序
我们的应用程序将包含两个主要流程:索引和搜索。Langchain 将把所有组件粘合在一起,因为我们将使用一些组件,包括 Cohere 和 Qdrant,以及一些 OCI 服务。以下是架构的高级概述
先决条件
在深入实现之前,请确保设置好所有必要的账户和工具。
库
我们将使用一些 Python 库。当然,Langchain 将是我们的主要框架,但 OCI 上的 Cohere 模型可以通过 OCI SDK 访问。让我们安装所有必需的库
pip install langchain oci qdrant-client langchainhub
Oracle Cloud
我们的应用程序将完全运行在 Oracle 云基础设施 (OCI) 上。您可以选择部署应用程序的方式。Qdrant 混合云将在您的 Oracle Cloud (OKE) 上运行的 Kubernetes 集群中运行,因此所有流程也可以部署在那里。您可以通过在 Oracle Cloud 上注册账户开始。
Cohere 模型作为 生成式 AI 服务 的一部分在 OCI 上可用。我们需要 生成模型 和 嵌入模型。请遵循链接的教程,掌握在那里使用 Cohere 模型的基础知识。
以编程方式访问模型需要知道区间 OCID。请参考 描述如何查找的文档。为了进一步参考,我们将假设区间 OCID 存储在环境变量中
export COMPARTMENT_OCID="<your-compartment-ocid>"
import os
os.environ["COMPARTMENT_OCID"] = "<your-compartment-ocid>"
Qdrant 混合云
运行在 Oracle Cloud 上的 Qdrant 混合云帮助您构建解决方案,而无需将数据发送到外部服务。我们的文档提供了关于如何 在 Oracle Cloud 上部署 Qdrant 混合云 的分步指南。
Qdrant 将运行在特定的 URL 上,访问将通过 API 密钥进行限制。请确保也将它们都存储为环境变量
export QDRANT_URL="https://qdrant.example.com"
export QDRANT_API_KEY="your-api-key"
可选:无论何时使用 LangChain,您也可以配置 LangSmith,它将帮助我们跟踪、监控和调试 LangChain 应用程序。您可以在此处注册 LangSmith。
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY="your-api-key"
export LANGCHAIN_PROJECT="your-project" # if not specified, defaults to "default"
现在您可以开始使用了
import os
os.environ["QDRANT_URL"] = "https://qdrant.example.com"
os.environ["QDRANT_API_KEY"] = "your-api-key"
让我们创建将存储索引文档的集合。我们将使用 qdrant-client
库,我们的集合将命名为 oracle-cloud-website
。我们的嵌入模型 cohere.embed-english-v3.0
生成大小为 1024 的嵌入向量,我们在创建集合时必须指定这一点。
from qdrant_client import QdrantClient, models
client = QdrantClient(
location=os.environ.get("QDRANT_URL"),
api_key=os.environ.get("QDRANT_API_KEY"),
)
client.create_collection(
collection_name="oracle-cloud-website",
vectors_config=models.VectorParams(
size=1024,
distance=models.Distance.COSINE,
),
)
索引过程
我们已经设置好了所有必要的工具,所以让我们开始索引过程。我们将使用 Cohere 嵌入模型将文本转换为向量,然后将它们存储在 Qdrant 中。Langchain 已与 OCI 生成式 AI 服务集成,因此我们可以轻松访问模型。
我们的数据集将非常简单,它将包含来自 Oracle Cloud Free Tier FAQ 页面的问题和答案。
问题和答案以 HTML 格式呈现,但我们不想手动提取文本并针对每个子页面进行调整。相反,我们将使用 WebBaseLoader
,它只需从给定的 URL 加载 HTML 内容并将其转换为文本。
from langchain_community.document_loaders.web_base import WebBaseLoader
loader = WebBaseLoader("https://www.oracle.com/cloud/free/faq/")
documents = loader.load()
我们的 documents
是一个只包含单个元素的列表,即整个页面的文本。我们需要将其分割成有意义的部分,因此我们将使用 RecursiveCharacterTextSplitter
组件。它会尽可能长时间地将所有段落(然后是句子,然后是单词)保持在一起,因为这些通常在语义上是文本中关联最紧密的部分。块大小和重叠度都可以根据特定用例进行调整。
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=100)
split_documents = splitter.split_documents(documents)
现在我们的文档可能已经索引,但我们需要将它们转换为向量。让我们配置嵌入,以便使用 cohere.embed-english-v3.0
。并非所有区域都支持生成式 AI 服务,因此我们需要指定模型存储的区域。我们将使用 us-chicago-1
,但请查看文档以获取支持区域的最新列表。
from langchain_community.embeddings.oci_generative_ai import OCIGenAIEmbeddings
embeddings = OCIGenAIEmbeddings(
model_id="cohere.embed-english-v3.0",
service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
compartment_id=os.environ.get("COMPARTMENT_OCID"),
)
现在我们可以嵌入文档并将它们存储在 Qdrant 中。我们将创建一个 Qdrant
实例并将分割的文档添加到集合中。
from langchain.vectorstores.qdrant import Qdrant
qdrant = Qdrant(
client=client,
collection_name="oracle-cloud-website",
embeddings=embeddings,
)
qdrant.add_documents(split_documents, batch_size=20)
我们的文档现在应该已经索引好,准备进行搜索了。让我们进入下一步。
与网站对话
与网站交互的预期方式是通过聊天机器人。大型语言模型(在我们的例子中是 Cohere Command)将根据 Qdrant 使用问题作为查询返回的相关文档来回答用户的问题。我们的 LLM 也托管在 OCI 上,因此我们可以像访问嵌入模型一样访问它
from langchain_community.llms.oci_generative_ai import OCIGenAI
llm = OCIGenAI(
model_id="cohere.command",
service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
compartment_id=os.environ.get("COMPARTMENT_OCID"),
)
与 Qdrant 的连接可以像我们在索引过程中那样建立。我们可以使用它来创建一个检索链,该链实现了问答过程。检索链还需要一个额外的链来在将检索到的文档发送到 LLM 之前进行组合。
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.retrieval import create_retrieval_chain
from langchain import hub
retriever = qdrant.as_retriever()
combine_docs_chain = create_stuff_documents_chain(
llm=llm,
# Default prompt is loaded from the hub, but we can also modify it
prompt=hub.pull("langchain-ai/retrieval-qa-chat"),
)
retrieval_qa_chain = create_retrieval_chain(
retriever=retriever,
combine_docs_chain=combine_docs_chain,
)
response = retrieval_qa_chain.invoke({"input": "What is the Oracle Cloud Free Tier?"})
.invoke
方法的输出是一个类似字典的结构,包含查询和答案,但我们也可以访问用于生成响应的源文档。这对于调试或进一步处理可能很有用。
{
'input': 'What is the Oracle Cloud Free Tier?',
'context': [
Document(
page_content='* Free Tier is generally available in regions where commercial Oracle Cloud Infrastructure service is available. See the data regions page for detailed service availability (the exact regions available for Free Tier may differ during the sign-up process). The US$300 cloud credit is available in',
metadata={
'language': 'en-US',
'source': 'https://www.oracle.com/cloud/free/faq/',
'title': "FAQ on Oracle's Cloud Free Tier",
'_id': 'c8cf98e0-4b88-4750-be42-4157495fed2c',
'_collection_name': 'oracle-cloud-website'
}
),
Document(
page_content='Oracle Cloud Free Tier allows you to sign up for an Oracle Cloud account which provides a number of Always Free services and a Free Trial with US$300 of free credit to use on all eligible Oracle Cloud Infrastructure services for up to 30 days. The Always Free services are available for an unlimited',
metadata={
'language': 'en-US',
'source': 'https://www.oracle.com/cloud/free/faq/',
'title': "FAQ on Oracle's Cloud Free Tier",
'_id': 'dc291430-ff7b-4181-944a-39f6e7a0de69',
'_collection_name': 'oracle-cloud-website'
}
),
Document(
page_content='Oracle Cloud Free Tier does not include SLAs. Community support through our forums is available to all customers. Customers using only Always Free resources are not eligible for Oracle Support. Limited support is available for Oracle Cloud Free Tier with Free Trial credits. After you use all of',
metadata={
'language': 'en-US',
'source': 'https://www.oracle.com/cloud/free/faq/',
'title': "FAQ on Oracle's Cloud Free Tier",
'_id': '9e831039-7ccc-47f7-9301-20dbddd2fc07',
'_collection_name': 'oracle-cloud-website'
}
),
Document(
page_content='looking to test things before moving to cloud, a student wanting to learn, or an academic developing curriculum in the cloud, Oracle Cloud Free Tier enables you to learn, explore, build and test for free.',
metadata={
'language': 'en-US',
'source': 'https://www.oracle.com/cloud/free/faq/',
'title': "FAQ on Oracle's Cloud Free Tier",
'_id': 'e2dc43e1-50ee-4678-8284-6df60a835cf5',
'_collection_name': 'oracle-cloud-website'
}
)
],
'answer': ' Oracle Cloud Free Tier is a subscription that gives you access to Always Free services and a Free Trial with $300 of credit that can be used on all eligible Oracle Cloud Infrastructure services for up to 30 days. \n\nThrough this Free Tier, you can learn, explore, build, and test for free. It is aimed at those who want to experiment with cloud services before making a commitment, as wellTheir use cases range from testing prior to cloud migration to learning and academic curriculum development. '
}
其他实验
提出基本问题只是开始。您想避免的是幻觉,即模型生成的答案并非基于实际内容。Langchain 的默认提示应该已经可以防止这一点,但您可能仍然想检查一下。让我们问一个 FAQ 页面上没有直接回答的问题
response = retrieval_qa.invoke({
"input": "Is Oracle Generative AI Service included in the free tier?"
})
输出
Oracle 生成式 AI 服务没有特别提及在免费套餐中可用。根据文本,300 美元的免费额度可用于所有符合条件的服务,最长可达 30 天。要确认 Oracle 生成式 AI 服务是否包含在免费额度优惠中,最好查看 Oracle Cloud 官方网站或联系他们的支持。
看来 Cohere Command 模型在提供的文档中未能找到确切答案,但它尝试解释上下文并提供一个合理的答案,而没有编造信息。这表明在该情况下模型没有产生幻觉。
总结
本教程展示了如何将 Cohere 的语言模型与 Qdrant 集成,以在您的网站上启用自然语言搜索。我们使用了 Langchain 作为编排器,并且所有内容都托管在 Oracle 云基础设施 (OCI) 上。现实世界需要将这种机制集成到您组织的系统中,但我们构建了一个可以进一步发展的基础。