注意:

将 OCI 与 OCI Data Science Notebook 中的 OpenSearch 和 LangChain 集成

简介

OpenSearch 近年来得到了快速采用,特别是随着公司越来越多地采用大型语言模型 (LLM),以推动数据洞察并利用智能搜索功能来处理定制业务用例。OpenSearch 持续致力于提供与最新 AI/ML 功能的无缝集成,使组织能够构建强大的观测、搜索和分析引擎,这对于 LLM 使用量增长至关重要。借助 Oracle Cloud Infrastructure Search 与 OpenSearch(OCI 与 OpenSearch),人们已经有了明显的热情,可以利用最新的 AI/ML 功能(包括生成式 AI (GenAI) 助手和学习排名)来解决战略问题。

OCI OpenSearch 2.11 发行版提供了控制台和命令行界面 (Command Line Interface,CLI) 功能,可用于执行混合搜索、语义搜索以及具有检索增强生成 (retval-augmented Generation,RAG) 的会话式搜索。然而,我们从客户那里收集到的一些关键痛点围绕配置对话搜索工作流/RAG 管道,但更重要的是,用于预处理和摄取大型非结构化或结构化卷的算法的复杂性数据,特别是来自多种格式的数据,如 PDF,CSV,EXCEL,WORD,DATA LAKES 等,并使其可用于需要速度和精度来检索信息的 LLM 驱动的应用程序。因此,将 LangChain 和 OCI 与 OpenSearch 集成变得至关重要,因为它有助于高效的查询处理和检索增强生成 (retrieval-augmented generation,RAG),从而为 LLM 提供更符合情境且更准确的响应。

LangChain 提供了一个易于使用的框架,可用于创建和管理复杂的 LLM 工作流,使开发人员能够简化 LLM 与 OpenSearch 之间的集成。这种组合通过允许语言模型从庞大的数据存储中检索最相关的信息来提高搜索相关性,从而提高最终用户的响应质量。

此外,我们与 OCI Data ScienceOCI Generative AI 的集成可以显著加快企业 AI 用例的开发和生产部署,同时尽可能减少工作量和代码。OCI Data Science 提供了一整套工具,可帮助数据科学家以最小的摩擦来构建、训练和部署模型,自动执行与数据准备和模型生命周期管理相关的繁琐工作。通过将 OCI 数据科学与 OCI 与 OpenSearch 和 LangChain 集成,我们能够以更少的资源高效运营 AI 并利用高级数据洞察。

为了提高可读性,本教程将重点介绍如何使用 OpenSearch 设置 OCI 并配置与 OCI Data Science 服务的通信;配置 LangChain 并利用其与 OCI 与 OpenSearch 的集成来执行语义搜索。下一个教程将重点介绍如何利用 LangChain、OCI 与 OpenSearch、Oracle Cloud Infrastructure Data Science AI Quick Actions (AI Quick Actions) 和 OCI Generative AI 服务之间的无缝集成来加快 LLM 应用程序开发。

目标

任务 1:创建 OpenSearch 集群并为租户设置 OCI 数据科学记事本

为您的租户设置 OCI 数据科学记事本需要一些步骤,包括创建和配置具有互联网访问的 VCN、设置组、动态组以及授予必要的 Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 策略以允许 OCI 数据科学管理租户中的特定资源。为了简单起见,我们在此处编译了所有步骤: 1_Setup_Data_Science_Notebook_In_Your_Tenancy.ipynb

OCI Data Science 团队还提供了有关该产品的所有功能的详细文档。有关详细信息,请参阅数据科学概览

注:如果您已经有一个 OpenSearch 集群,并且已经为您的租户配置了记事本,则可以跳至本教程的 LangChain 集成部分并试用语义搜索用例。

需要注意的是,创建新的 OCI 数据科学项目本身并不会产生额外的计算资源,您在数据科学项目下创建的每个记事本会话都会自带计算资源。

任务 1.1:配置虚拟云网络 (VCN)

在租户中创建 VCN,确保设置了正确的子网和安全列表,以实现数据科学操作的安全通信。

最好使用向导并单击创建具有 Internet 连接的 VCN

:一个非常关键的步骤是确保将适当的入站和出站规则添加到 VCN 的专用子网。没有这些规则可能会阻止笔记本访问 Internet,这反过来又会阻止您安装关键库和依赖项。如果您已有 VCN,只需编辑专用子网的安全列表即可添加以下入站规则。

图中显示了 VCN。 图 1.a:VNC 配置向导

映像入站规则配置 图 1.b:为专用子网配置入站规则

任务 1.2:创建 OpenSearch 集群

您需要具有 2.11 映像或更高版本的 OpenSearch 集群。

如果您还没有现有集群,请参阅使用带有 OpenSearch 的 Oracle Cloud Infrastructure Search 搜索数据和可视化数据。使用在任务 1.1 中创建的同一 VCN 创建集群。

或者

如果您已经有要使用的现有集群,只需导航到集群的专用子网,并确保在安全列表中添加上述出站规则。

任务 1.3:创建必需的组和动态组

为数据科学家定义一个组,为 OCI 数据科学资源定义一个动态组。这为在 OCI 中执行数据科学活动提供了适当的权限。有关手动配置所需组和动态组的更多信息,请参见 Creating a Data Scientists User Group

您还可以选择使用 OCI 资源管理器堆栈动态创建这些资源。

  1. 转到 OCI 控制台,导航到开发人员服务资源管理器,然后单击堆栈

  2. 单击创建堆栈,然后按照向导从 OCI 数据科学模板创建堆栈。

    注:单击选择模板时,您将在服务选项卡下找到数据科学模板。

任务 1.4:为记事本配置 OCI IAM 策略

您需要配置一些 OCI IAM 策略,以向您的组和动态组授予权限,并允许 OCI 数据科学服务管理租户中的某些资源。确保策略涵盖网络通信和数据访问权限。有关详细信息,请参阅模型部署策略

任务 1.5:为 AI 快速操作配置 OCI IAM 策略

如果您打算利用租户 AI Quick Actions 的强大功能来自动执行和加速模型训练、评估和部署,则需要配置一组 OCI IAM 策略和动态组,以授予对租户中合适资源的访问权限。如果未配置这些必需的策略,AI Quick Actions 将在记事本会话中不起作用。有关更多信息,请参阅 AI 快速操作策略

Define tenancy datascience as ocid1.tenancy.oc1..aaaaaaaax5hdic7xxxxxxxxxxxxxxxxxnrncdzp3m75ubbvzqqzn3q
Endorse any-user to read data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}
Endorse any-user to inspect data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}
Endorse any-user to read object in tenancy datascience where ALL {target.compartment.name='service-managed-models', target.bucket.name='service-managed-models'}

在根区间中创建 OCI IAM 策略文档非常重要。您可以将所有必需的规则添加到同一策略文档中。为了简单起见,您可以找到本教程中使用的笔记本和 AI Quick Actions 的所有 OCI IAM 策略集。有关更多信息,请参见 data-science-iam-policies

注:请确保更新组和动态组名称以及区间名称。您可以根据您的设计进一步使这些策略更具限制性或更加开放。

任务 2:在 OCI 数据科学中启动 Jupyter Notebook

要启动记事本会话,您需要创建一个数据科学项目,在此项目中,您可以创建多个记事本。每个笔记本都有自己的虚拟机 (VM),可以独立启动。在每个记事本会话中,您可以部署和管理多个模型,链接现有的 GitHub 或 Bitbucket 存储库,或创建和管理新存储库,开发多个 Jupyter 记事本,构建完整的应用程序,或编排整个机器学习工作流。

  1. 转到 OCI 控制台,导航到数据科学项目,然后单击创建项目

    注:为了简单起见,我们将在同一区间中创建所有资源。请务必选择创建 VCN 的同一区间和 OpenSearch 集群。

    图中显示了 VCN。

    图 2:创建新的数据科学项目

  2. 创建新的记事本会话。

    1. 项目详细信息页面中,单击记事本会话创建记事本会话

      图中显示了 VCN。

    2. 您可以选择所需的计算配置并附加必要的数据源。创建记事本会话时,您需要确保选择正确的 VCN 和用于 OpenSearch 集群的同一专用子网。

      图中显示了 VCN。

      图 3:创建新的记事本会话

  3. 单击 Open 以启动记事本会话。现在,您可以使用 pip 直接从笔记本界面安装所需的库,包括 LangChain 和 OpenSearch Python 客户机。

    图中显示了 VCN。

    图中显示了 VCN。

    图 4:启动记事本会话

任务 3:使用 Jupyter Notebook 配置 LangChain

将 LangChain 与 Jupyter Notebook 环境或脚本中的其他库一起安装,并利用它与 OCI 的无缝集成以及 OpenSearch、HuggingFace、OCI Generative AI 服务等功能来执行语义搜索或对话搜索。

在 Jupyter Notebook 的顶部添加以下代码。

!pip install -U langchain langchain-community opensearch-py pypdf  sentence-transformers oci  langchain-huggingface oracle_ads

为了避免每次在笔记本会话中创建的每个 Jupyter Notebook 中重新安装这些软件包,建议您创建并激活 conda 环境并在其中安装所有依赖项,这样您就可以用多个 Jupyter 笔记本重用此环境。Launcher 下有多个预配置的 conda 环境。您可以随时在终端中选择并安装这些预配置环境中的任何环境,然后在顶部安装任何其他库。安装完成后,只需将笔记本中的内核设置为此活动 conda 环境。

  1. 启动新终端。转到文件新建,然后单击终端

    图中显示了 VCN。

    图 5:启动新终端

  2. 运行以下命令以创建 conda 环境。

    odsc conda install -s python_p310_any_x86_64_v1
    conda activate <environment name>
    
  3. 运行以下命令以在终端中使用 pip 安装 LangChain。

    pip install  -U oracle_ads oci langchain langchain-community opensearch-py pypdf  sentence-transformers oci  langchain-huggingface oracle_ads
    

任务 4:使用 LangChain 处理文档

LangChain 的一个显著优势是它提供了高效处理大量文档的功能,并且能够以最少的编码进行处理,无论是结构化数据还是非结构化数据。您只需导入最适合您使用的必要文档处理类,然后调用加载方法来处理文档。运行以下命令。

import os
from langchain.document_loaders import PyPDFLoader, CSVLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Step 1: Load PDF and CSV Documents
def load_documents():
    # Load PDF Document
    pdf_loader = PyPDFLoader("data/sample_document.pdf")
    pdf_documents = pdf_loader.load()

    # Load CSV Document
    csv_loader = CSVLoader(file_path="data/sample_data.csv")
    csv_documents = csv_loader.load()

    # Combine both sets of documents
    all_documents = pdf_documents + csv_documents
    return all_documents

# Step 2: Split the documents into smaller chunks for better processing
def split_documents(documents):
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=100
    )
    split_docs = text_splitter.split_documents(documents)
    return split_docs


# Load and process documents
documents = load_documents()
split_docs = split_documents(documents)

在 noteBook 环境中安装 LangChain 后,您可以利用 OCI 与 LangChain 的 OpenSearch 集成来执行语义搜索,而不是从头开始编写代码,从而按照包含多个 API 调用的漫长步骤 OpenSearch 指南进行操作。

  1. 使用 LangChain 文档库处理和分块非结构化数据,如任务 4 所示。

  2. 定义要用于在摄取期间自动生成数据嵌入的嵌入模型。再次,利用与 HuggingFace 的 LangChain 集成,您可以使用一行代码部署任何预先训练的 HuggingFace 模型。您只需要指定要使用的嵌入模型的名称。您还可以为此目的使用定制的微调模型。运行以下命令。

    from langchain.embeddings import HuggingFaceEmbeddings
    embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L12-v2")
    
  3. 使用 LangChain 通过 OpenSearch 创建与 OCI 的连接,以指定要使用的索引名称、验证方法以及嵌入模型。使用此方法,将在数据摄取期间创建具有指定索引名称的索引,如果索引已存在,则使用新数据进行更新。运行以下命令。

    from langchain.vectorstores import OpenSearchVectorSearch
    import oci
    
    # set up your script to use Resource principal for authentication
    auth_provider = oci.auth.signers.get_resource_principals_signer()
    auth = ("username", "password")
    AUTH_TYPE="RESOURCE_PRINCIPAL"
    opensearch_url="https://amaaaaaallb3......................opensearch.us-ashburn-1.oci.oraclecloud.com:9200"   // replace this whole value your opensearch url. Be sure sure to have the :9200 port in your url
    
    # Initialize OpenSearch as the vector database
    vector_db = OpenSearchVectorSearch(opensearch_url=opensearch_url,
                               index_name="<YOUR-INDEX-NAME>",
                               embedding_function=embedding_model,
                               signer=auth_provider,
                               auth_type="RESOURCE_PRINCIPAL",
                               http_auth=auth)
    
  4. 您还可以使用 LangChain 将处理的数据块直接摄取到 OpenSearch 集群中。以下示例说明如何对已处理的文档块列表执行批量摄取。使用 tqdm 库可以跟踪数据摄取的进度。运行以下命令。

    from langchain.vectorstores import OpenSearchVectorSearch
    import oci
    from tqdm import tqdm
    
    batch_size=100
    documents = load_documents() # function defined above feel free to or define a new one to process documents
    document_chunks = split_documents(documents) // function defined above feel free to edit
    index_name= <YOUR-INDEX-NAME>
    
    # Ingest documents in batches
    for i in tqdm(range(0, len(document_chunks), batch_size), desc="Ingesting batches"):
    batch = document_chunks[i:i + batch_size]
    vector_db.add_texts(texts=batch,
                      bulk_size=batch_size,
                      embedding=embedding_model,
                      opensearch_url=opensearch_url,
                      index_name= index_name,
                      signer=auth_provider,
                      auth_type=AUTH_TYPE,
                      http_auth=("username", "password"))
    
    #refresh index
    vector_db.client.indices.refresh(index=index_name)
    
  5. 摄取数据后,运行以下命令对索引执行语义搜索。

    # Generate topK documents with scores
    query = "what can you tell me about picasso?"
    search_results = vector_db.similarity_search_with_score_by_vector(embedding_model.embed_query(query), k=5)
    
    # Iterate over the search results and print the text along with the relevance scores
    for document, score in search_results:
       print(f"Score: {score}")
       print(f"Document: {document.page_content}\n")
    

后续步骤

OCI 与 OpenSearch 集成,与 LangChain 和 OCI Data Science 改变了游戏规则,将显著加快企业应用在语义搜索和 LLM 方面的业务用例开发。本教程提供了完整的指南,其中提供了在租户中使用 OpenSearch 和 OCI 数据科学设置 OCI 的示例,并利用 LangChain 执行语义搜索。

在下一个教程中:教程 2:将 LangChain、OCI 数据科学记事本、OCI 与 OpenSearch 和 OCI Generative AI 集成,以加速用于 RAG 和会话搜索的 LLM 开发,我们将讨论如何利用 LangChain、OCI Data Science、AI Quick Action 和 OCI Generative AI 服务之间的无缝集成来开发您自己的定制 LLM 应用程序。我们邀请您使用 OpenSearch 为企业业务 AI/ML 使用场景试用 OCI。

您可以在以下 GitHub 存储库中找到代码。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心