员工入职的RAG系统

公共网站是与广大受众分享信息的好方法。然而,如果你不熟悉网站的结构或使用的术语,找到正确的信息可能会很困难。这就是搜索栏的作用,但如果你还不熟悉内容,制定一个能返回所需结果的查询并不总是容易的。这在企业环境中更为重要,对于刚开始学习的新员工来说,他们甚至不知道如何提出正确的问题。你可能拥有最好的内联网页面,但入职不仅仅是阅读文档,而是理解流程。语义搜索可以帮助更容易地找到正确的资源,但与网站聊天,就像与同事聊天一样,不是更容易吗?

技术进步使得使用自然语言与网站交互成为可能。本教程将指导您如何将Cohere的语言模型与Qdrant集成,以在您的文档上实现自然语言搜索。我们将使用LangChain作为协调器。所有内容都将托管在Oracle 云基础设施 (OCI)上,因此您可以根据需要扩展您的应用程序,并且不会将您的数据发送给第三方。这在处理机密或敏感数据时尤为重要。

构建应用程序

我们的应用程序将包含两个主要过程:索引和搜索。Langchain 将把所有内容粘合在一起,因为我们将使用一些组件,包括 Cohere 和 Qdrant,以及一些 OCI 服务。以下是架构的高级概述:

Architecture diagram of the target system

先决条件

在我们深入实施之前,请确保设置好所有必要的账户和工具。

我们将使用一些Python库。当然,Langchain将是我们的主要框架,但OCI上的Cohere模型可以通过OCI SDK访问。让我们安装所有必要的库:

pip install langchain oci qdrant-client langchainhub

Oracle 云

我们的应用程序将完全运行在Oracle云基础设施(OCI)上。您可以选择如何部署您的应用程序。Qdrant混合云将在您的运行在Oracle云上的Kubernetes集群(OKE)中运行,因此所有进程也可能部署在那里。您可以从在Oracle云上注册账户开始。

Cohere模型在OCI上作为生成式AI服务的一部分提供。我们需要生成模型嵌入模型。请按照链接的教程来掌握在那里使用Cohere模型的基础知识。

以编程方式访问模型需要知道 compartment OCID。请参考描述如何找到它的文档。 为了进一步参考,我们将假设 compartment 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 Embedding模型将文本转换为向量,然后将它们存储在Qdrant中。Langchain与OCI生成式AI服务集成,因此我们可以轻松访问这些模型。

我们的数据集将非常简单,因为它将包含来自Oracle Cloud Free Tier FAQ页面的问题和答案。

Some examples of the Oracle Cloud 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)上。实际应用中需要将此机制集成到您组织的系统中,但我们建立了一个坚实的基础,可以进一步开发。

这个页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 你可以在GitHub上编辑这个页面,或者创建一个GitHub问题。