注意:

使用多代理通信协议服务器构建 AI 代理以解决发票问题

简介

处理大量产品(如分销商、行业和零售连锁店)的公司通常面临着基于不准确、不完整或多种文本描述来识别产品的挑战。在手动输入数据的环境中,输入错误、缩写和不同的贸易名称会使企业资源计划 (Enterprise Resource Planning,ERP)、客户关系管理 (Customer Relationship Management,CRM) 和电子商务平台等系统中难以正确识别项目。

在这种情况下,通常需要具有以下功能的工具:

在本教程中,我们将学习如何创建专门用于解决客户退货发票中不一致的 AI 代理。座席能够与提供向量搜索和发票检索工具的 MCP 服务器进行交互,使座席能够根据客户提供的信息自动查找公司的原始应收账款发票。

MCP 服务器(模型上下文协议)是一个软件组件,负责通过标准化的消息和工具协议中介智能代理与外部服务之间的通信。它充当语言模型 (LLM) 与现有 API 之间的桥梁,允许 AI 代理访问传统系统的特定功能,而无需重新编写或直接调整这些功能。

如何工作?

MCP 服务器:

使用旧有应用程序

传统应用通常已通过数据库、文件或内部 API 提供功能。使用 MCP Server ,您可以:

优点

此代理基于 Oracle Cloud Infrastructure (OCI) 生成式 AI 语言模型,并与由 MCP 服务器管理的动态声明的工具集成。

通过这两个组件的集成,系统可以启用基于 Oracle LLM 的代理:

这种模块化设计允许系统的可重用性和轻松演化到发票以外的领域。

目标

Prerequisites

任务 1:创建 Oracle Database 23ai(始终免费)

在本任务中,我们将学习如何在始终免费模式下预配 Oracle Database 23ai。此版本提供完全托管的环境,非常适合开发、测试和学习,且无需额外付费。

  1. 登录 OCI 控制台,导航到 Oracle DatabaseAutonomous Database ,然后单击创建 Autonomous Database 实例

  2. 输入以下信息。

    • 数据库名称:输入实例的标识名称。
    • 工作量类型:根据您的需要选择数据仓库事务处理
    • 区间:选择合适的区间来组织资源。
  3. 选择始终免费以确保实例是免费预配的。

  4. ADMIN 用户创建安全密码,该密码将用于访问数据库。

  5. 查看设置,然后单击创建 Autonomous Database 。等待几分钟,让实例进行预配并可供使用。

任务 2:运行 Autonomous Database 表创建脚本

为我们的用例准备数据库。从此处下载并运行 SQL 脚本:script.sql ,用于为发票与 AI 代理进行对账的方案创建三个基本表(PRODUCTSINVOICEITEM_INVOICE)。

  1. 转到 OCI 控制台,导航到 Oracle DatabaseAutonomous Database ,然后单击新创建的实例的名称。

  2. 单击 Database Actions(数据库操作)SQL 在浏览器中打开 SQL 控制台。

  3. 在本地下载并打开 script.sql 文件,并将所有内容粘贴到 SQL 控制台编辑器中。

  4. 单击 Run 或按 Ctrl + Enter 。等待确认命令已成功执行。

  5. 运行以下命令以验证是否已创建表。

    SELECT table_name FROM user_tables;
    

任务 3:将示例数据插入表中

插入虚拟数据,以模拟用于应用 AI 代理的实际方案。我们将使用两个 SQL 脚本:

AI 座席将使用此数据解决退货发票中的不一致问题。

  1. 转到 OCI 控制台,导航到 Oracle DatabaseAutonomous Database ,然后单击新创建的实例的名称。

  2. 单击 Database Actions(数据库操作)SQL 在浏览器中打开 SQL 控制台。

  3. 从此处下载 insert_products_books.sql 文件内容:insert_products_books.sql 并将其粘贴到 SQL 编辑器中。

  4. 单击 Run 或按 Ctrl + Enter

  5. 现在,从此处下载 invoice_data_insert.sql 文件内容:invoice_data_insert.sql 文件并将其粘贴到编辑器中。

  6. 单击 Run 或按 Ctrl + Enter

  7. 运行以下命令以检查数据。

    SELECT * FROM PRODUCTS;
    SELECT * FROM INVOICE;
    SELECT * FROM ITEM_INVOICE;
    

任务 4:在数据库中创建和编译高级搜索功能

创建一个名为 fn_advanced_search 的 PL/SQL 函数,用于对产品说明中的关键字执行智能搜索。AI 代理将使用此函数作为 resolve_ean 工具的一部分,允许他们根据客户在退货单上提供的说明查找最近的 EAN 代码。

该函数的作用是什么?

执行相应步骤:

  1. 将完整的 similarity_search.sql 脚本复制并粘贴到自治数据库 SQL 控制台中。

    这包括:

    • 创建 products 表(如果尚未完成)。
    • 创建文本索引。
    • 类型 product_resultproduct_result_tab
    • fn_advanced_search 函数。
    • 可选测试。
  2. 运行完整的脚本。结果应为 Function createdType created

  3. 运行以下查询以使用模拟说明测试函数。

    SELECT *
    FROM TABLE(fn_advanced_search('harry poter askaban'))
    ORDER BY similarity DESC;
    

任务 5:使用 AI 向量化产品以进行语义搜索

在本任务中,我们将使用基于语义向量的新方法来补充基于 SQL 的高级搜索。这对于使用嵌入(短语的数字表示)来比较产品描述之间的相似性的人工智能代理尤其有用 - 比单词或语音搜索更灵活,更智能。

为此,我们将使用 Python 脚本 (process_vector_products.py ),该脚本连接到 Oracle 数据库,从 PRODUCTS 表中提取产品,将其说明转换为向量(嵌入),并使用 Oracle 数据库本身构建向量索引。

脚本的作用是什么?

注:嵌入将转换为带 np.float32.tobytes() 的字节,以存储为 BLOB。要检索向量,请使用 np.frombuffer(blob, dtype=np.float32)

此格式允许将来的相似性搜索直接使用 SQL 或从数据库中加载向量以进行 np.dotcosine_similarity 操作或与 LLM 集成。

此脚本为产品生成语义嵌入,并将这些向量写入 Oracle Database 23ai。主要要点如下:

运行以下脚本:

注:您需要下载并配置 Oracle Wallet。

在最终机中运行该命令。

python process_vector_products.py

结束了!数据库中的产品已向量化。

为什么这很重要?

矢量搜索对于寻找产品非常有效,即使描述是主观,不精确或自然语言。

了解代码:使用 MCP 服务器的 LLM 代理

此项目由 3 个主要组件组成:

了解每个组件的功能,并详细突出显示代码的最重要部分。

任务 6:在 MCP 代理中配置模型和嵌入

让我们使用 OCI Generative AI 服务配置基于 MCP 协议的会话代理使用的语言模型和嵌入。

  1. 配置语言模型 (LLM)。

    语言模型负责解释消息,生成响应并充当代理的主要大脑。

    • main.py 文件中进行配置。

      from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI
      
      llm = ChatOCIGenAI(
          model_id="cohere.command-r-08-2024",
          service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
          compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          auth_profile="DEFAULT",
          model_kwargs={"temperature": 0.1, "top_p": 0.75, "max_tokens": 2000}
      )
      
      Parameter (参数) 说明
      model_id 生成式 AI 模型 ID,例如 cohere.command-r-08-2024
      service_endpoint 生成式 AI 服务区域端点
      compartment_id OCI 区间的 OCID
      auth_profile 文件 ~/.oci/config 中配置的配置文件的名称
      model_kwargs 温度、顶部 p 和响应大小
    • 列出可用模型。

      • 使用 OCI CLI:

        oci generative-ai model list --compartment-id <seu_compartment_id>
        
      • 使用 Python SDK:

        from oci.generative_ai import GenerativeAiClient
        from oci.config import from_file
        
        config = from_file(profile_name="DEFAULT")
        client = GenerativeAiClient(config)
        
        models = client.list_models(compartment_id=config["compartment_id"])
        for model in models.data:
            print(model.display_name, model.model_id)
        
  2. 配置用于语义搜索的嵌入。

    搜索类似产品或上下文信息取决于向量嵌入。

    在代理中使用的示例:

    @mcp.tool()
    def search_vectorized_product(description: str) -> dict:
        """
            Searches for a product by description using embeddings.
        """
        return sercher.search_similar_products(description)
    

    更改参数 (product_search.py ),如下所示:

    
    class SimilarProductSearch:
        def __init__(
                self,
                top_k=5,
                minimum_distance=1.0,
                model_id="cohere.embed-english-light-v3.0",
                service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
                compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                auth_profile="DEFAULT",
                wallet_path="/WALLET_PATH/Wallet_oradb23ai",
                db_alias="oradb23ai_high",
                username="USER",
                password="Password"
        ):
    
    Parameter (参数) 说明
    top_k 返回的建议数。
    minimum_distance 考虑相关结果的最大距离。
    model_id OCI 中嵌入模型的 ID(例如 cohere.embed-english-light-v3.0)。
    service_endpoint OCI Generative AI 区域端点。
    compartment_id 区间 OCID。
    auth_profile ~/.oci/config 文件中的配置文件名称。
    wallet_path Oracle Database 23ai wallet 的路径。
    db_alias 数据库别名,
    username 数据库用户。
    password 数据库口令。

    配置 MCP 服务器:

    就像执行 process_vector_products.py 代码时所做的那样,您需要为 Oracle Database 23ai 数据库配置 Oracle Wallet。

    根据您的设置修改参数:

    import os
    
    # Oracle Wallet settings
    WALLET_PATH = "/path/to/Wallet"
    DB_ALIAS = "oradb23ai_high"
    USERNAME = "admin"
    PASSWORD = "..."
    
    # Define the environment variable required for the Oracle client
    os.environ["TNS_ADMIN"] = WALLET_PATH
    

    然后执行 process_vector_products.py ,将产品向量化到 Oracle Database 23ai 中。

    python process_vector_products.py
    

因此,LLM 模型和嵌入可供 MCP 代理使用 LangGraph 和 LangChain。

  1. 使用以下命令运行 main.py 文件。

    python main.py
    
  2. 当出现 You: 提示时,输入以下语句。

    { "customer": "Customer 108",  "description": "Harry Poter askaban", "price": 82.26, "location": "SP"}
    

    注:工作簿 Harry PotterAzkaban 的名称拼写错误,但引擎可以毫无问题地找到它。

    img.png

    img_1.png

    请注意,服务已执行:

    fetch_vectorized_product
    resolve_ean
    search_invoices_by_criteria
    
  3. 现在,输入以下语句。

    { "customer": "Customer 108",  "description": "Harry Poter askaban", "price": 82.26}
    

    您将看到未找到发票记录。这是因为地点是查找发票的关键。

    img_2.png

  4. 现在,输入以下语句。

    { "customer": "Customer 108",  "description": "Harry Poter", "location": "SP"}
    

    这一次,我们输入了地点,但省略了单价。

    img_3.png

    但已找到发票。这是因为价格不是基本的,但它确实有助于缩小差距,使其更加自信。

    测试的一些示例包括:

     { "customer": "Customer 108",  "description": "Harry Poter askaban", "price": 82.26, "location": "SP"}
    
     { "customer": "Customer 108",  "description": "Harry Poter askaban", "price": 82.26}
    
     { "customer": "Customer 108",  "description": "Harry Poter askaban", "location": "SP"}
    
     { "customer": "Customer 108",  "description": "Harry Poter askaban", "price": 82.26, "location": "RJ"}
    
     { "customer": "Customer 125",  "description": "Harry Potter Chamber", "price": 79.16, "location": "SP"}
    
     { "customer": "Customer 125",  "description": "Harry Potter Chamber", "price": 79.15, "location": "SP"}
    

任务 8:查看凤凰城的可观测性

在浏览器中输入 http://localhost:6006/ 以查看凤凰城的可观测性。

img.png

img.png

img.png

确认

更多学习资源

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

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