使用 Gemini 构建 AI 数据探索代理

为您的企业系统编程接口构建一个由人工智能 (AI) 赋能的聊天界面,让您的同事可以询问与您的业务数据相关的问题。对贵组织的数据进行分析和生成报告对改进您的业务运营方式至关重要。有了正确的数据,您就可以发现问题、发现趋势和调查结果,但作为开发者,帮助非编码同事发现正确的数据可能并非易事。

SQL Talk 项目是一个开源应用,可使用生成式 AI 技术回答与业务数据相关的问题。该项目使用 Gemini API 和函数调用功能将业务数据问题转换为 SQL 查询和 API 调用,然后将结果转换回普通语言。您可以将此项目用作构建您自己业务的数据代理的起点,帮助同事获得答案,而无需编写大量一次性代码。

如需观看有关该项目及其扩展方式的视频简介(包括项目开发者的深入解析),请参阅 AI 数据智能体 | 使用 Google AI 构建。否则,您可以开始按照以下说明扩展项目。

SQL Talk 项目应用界面

图 1. SQL Talk 项目应用界面。

项目设置

以下说明将引导您设置 SQL Talk 项目,以便进行开发和测试。一般步骤包括创建 SQL Talk 项目、设置 Google Cloud Shell 编辑器开发项目、获取 Google Cloud 项目 ID,以及使用脚本配置项目设置。这些说明介绍了如何使用 Cloud Shell Editor 设置项目,这样可以快速便捷地设置、运行和更新项目。

为项目创建 Cloud Shell 实例

您可以通过将项目代码库克隆到 Cloud Shell 实例中来设置 SQL Talk 项目。此过程会在 Google Cloud 基础架构中为项目设置虚拟开发环境实例,并将代码库克隆到该虚拟环境中。

如需为 SQL Talk 创建 Cloud Shell 实例,请执行以下操作:

此链接会设置一个 Google Cloud Shell Editor 实例,并将 SQL Talk 的代码库克隆到该实例中。

显示 SQL Talk 项目代码的 Google Cloud Shell 编辑器

图 2. 克隆到 Google Cloud Shell Editor 开发环境中的 SQL Talk 项目。

获取 Cloud 项目 ID

SQL Talk 项目使用 Google Cloud 项目 ID 连接到 Google Cloud 服务,包括 Gemini 模型。您需要在 Cloud Shell 编辑器中配置项目 ID,以允许应用连接到这些服务。

如需将 Cloud Shell Editor 连接到项目 ID,请执行以下操作:

  1. 前往 Google Cloud 控制台并登录(如有必要)。
  2. 选择现有 Cloud 项目,或创建新项目
  3. 记下该项目的 Cloud 项目 ID。
  4. 将编辑器实例连接到您的项目并配置项目。 在 Cloud Shell 编辑器窗口的“终端”面板中,输入以下命令:

    gcloud config set project YOUR_PROJECT_ID
    

配置 SQL Talk 项目

SQL Talk 项目使用 Google Cloud 服务来运行该项目,包括 BigQuery 数据库服务和用于连接到 Gemini 模型的 Vertex AI API。SQL Talk 项目包含一个 setup.sh 脚本,用于使用所需的 Google Cloud 服务配置项目,并启动项目的默认版本。

如需配置和运行项目 Cloud Shell 编辑器实例,请执行以下操作:

  1. 在 Cloud Shell Editor 窗口终端面板中,导航到 Cloud Shell SQL Talk (/sql-talk-app) 项目目录:

    cd ~/cloudshell_open/generative-ai/gemini/function-calling/sql-talk-app
    
  2. 在终端面板中,输入以下命令:

    bash setup.sh
    

设置脚本成功完成后,您应该会在 Cloud Shell 编辑器终端窗口中看到类似以下内容的消息。此消息表示设置过程已成功完成,并且 SQL Talk 应用正在运行:

You can now view your Streamlit app in your browser.
Network URL: http://##.##.##.##:8080
External URL: http://##.##.##.##:8080

测试项目

完成 SQL Talk 项目的设置后,您可以测试该应用,以验证其是否按预期运行。设置脚本会在您运行时自动启动应用,您也可以按照以下步骤重启应用。

如需运行 SQL Talk 应用,请执行以下操作:

  1. 如果 Cloud Shell Editor 处于空闲状态且已断开连接,您可能需要重新连接到您的 Cloud 项目 ID。

    gcloud config set project YOUR_PROJECT_ID
    
  2. 在 Cloud Shell Editor 窗口的终端面板中,导航到 Cloud Shell SQL Talk 项目目录。

    cd ~/cloudshell_open/generative-ai/gemini/function-calling/sql-talk-app
    
  3. 在终端面板中,输入以下命令。

    ~/miniforge/bin/streamlit run app.py --server.enableCORS=false \
        --server.enableXsrfProtection=false --server.port 8080
    
  4. 查看 SQL Talk 应用。在 Cloud Shell 编辑器窗口的右上角,依次选择网页预览按钮和在端口 8080 上预览

Cloud Shell Editor 标题,其中突出显示了“Web Preview”按钮

如需查看 SQL Talk 应用的更新,请执行以下操作:

  • 在 SQL Talk Web 应用的 Web 预览中,重新加载浏览器或浏览器标签页。

如需停止 SQL Talk 应用,请执行以下操作:

  • 在 Cloud Shell Editor 窗口的终端面板中,按 Ctrl-C

修改应用

您可以通过修改 SQL Talk 应用的 Python 代码来更改其行为并为其添加功能。本部分介绍了如何向 SQL Talk 应用添加新的函数调用。

Gemini API 函数调用功能使用特定语法来定义生成式模型用于回答问题或解决问题的函数。此语法无需与实际 API 调用的语法完全匹配。而是使用函数调用功能强制生成式模型提供符合 API 调用语法的特定数据输入或参数,然后使用这些参数在应用代码中执行实际的 API 调用。

此示例实现展示了如何创建用于列出近期数据库查询或作业的函数调用定义,然后将该定义映射到 SQL Talk 应用代码中的实际 API 调用。

添加函数调用定义

添加了用于列出近期数据库查询或作业的新函数调用。生成式模型会使用此定义来了解 API 调用的用途以及所需的输入参数。此示例函数定义不带参数。

如需向应用添加新函数调用,请执行以下操作:

  1. 在 Cloud Shell Editor 窗口中,打开 sql-talk-app/app.py 代码文件。
  2. list_datasets_func 函数声明后面,添加一个新的 FunctionDeclaration

    list_jobs_func = FunctionDeclaration(
        name="list_jobs",
        description="Get a list of the 10 most recent database requests to help answer the user's question",
        parameters={
            "type": "object",
            "properties": {
      },
    },
    )
    
  3. 将新函数添加到 sql_query_tool 对象。

    sql_query_tool = Tool(
        function_declarations=[
            sql_query_func,
            list_datasets_func,
            List_jobs_func,  # add this new function
            list_tables_func,
            get_table_func,
        ],
    )
    

如需添加代码以运行新函数的 API 调用,请执行以下操作:

  • sql-talk-app/app.py 代码文件中,向 while function_calling_in_process: 循环添加新的 if 子句。

    if response.function_call.name == "list_datasets":
        ...
    
    # add this if clause for list_jobs function
    if response.function_call.name == "list_jobs":
        api_response = client.list_jobs(max_results=10)  # API request(s)
        api_response = str([job.job_id for job in api_response])
        api_requests_and_responses.append(
          [response.function_call.name,params, api_response])
    

其他资源

如需详细了解 SQL 查询项目,请参阅代码库,并查看有关 SQL Talk 项目的 Cloud 社区博文。如果您需要构建应用方面的帮助,或者希望与其他开发者协作,请访问 Google 开发者社区 Discord 服务器和 Google Cloud AI/ML 论坛。如需查看更多“利用 Google AI 构建”项目,请参阅视频播放列表