使用文档代理构建 AI 内容搜索

搜索信息是人工智能 (AI) 生成模型最常见的用途之一。使用 AI 为您的内容构建对话式搜索界面后,用户就可以提出特定问题并获得直接答案。

本教程介绍了如何为您的内容构建 AI 赋能的对话式搜索界面。它基于 Docs Agent,这是一个开源项目,使用 Google Gemini API 创建对话搜索界面,无需训练新的 AI 模型或使用 Gemini 模型调整模型。这意味着您可以快速构建这种搜索功能,并将其用于不同规模的内容集。

如需简要了解该项目以及如何扩展该项目(包括构建该项目的人员的见解),请观看:AI 内容搜索 | 使用 Google AI 构建。否则,您可以按照以下说明开始扩展项目。

概览

文档代理项目提供了一个用于搜索特定内容集的对话式搜索界面,并由 Google Gemini API 和生成模型提供支持。用户可以以对话的形式提出详细的问题,并根据特定内容集获得详细答案。在后台,文档代理会接受问题并搜索内容的矢量数据库,并为生成模型创建详细提示,包括相关文本的片段。生成模型生成对问题的回复,文档代理设置回复的格式并将其呈现给用户。

Google 文档代理功能图 图 1. Google 文档代理项目应用的功能图。

要使 Google 文档代理能够回答与您的内容相关的问题,关键在于创建该内容的矢量数据库。您将内容拆分为多个逻辑文本块,并为每个文本块生成一个向量。这些向量是每个分块中信息的数字表示,使用 Google 生成模型中的 AI 文本嵌入函数生成。

当用户提出问题时,文档代理使用相同的文本嵌入函数创建该问题的数字表示,并使用该值搜索矢量数据库并查找相关内容。它会获取排名靠前的结果,并将该信息添加到生成模型的提示中。AI 模型会接受问题和额外的上下文信息,并生成答案。

项目设置

以下说明会引导您设置 Google 文档代理项目,以用于开发和测试。常规步骤包括安装一些必备软件、设置一些环境变量、从代码库克隆项目,以及运行配置安装。代码项目使用 Python Poetry 管理软件包和 Python 运行时环境。

安装必备项

文档代理项目使用 Python 3 和 Python Poetry 来管理软件包和运行应用。以下安装说明适用于 Linux 主机。

如需安装所需的软件,请执行以下操作:

  1. 安装 Python 3 和 Python 版 venv 虚拟环境软件包。
    sudo apt update
    sudo apt install git pip python3-venv
    
  2. 安装 Python Poetry 以管理项目的依赖项和打包。
    curl -sSL https://install.python-poetry.org | python3 -
    

如果您要扩展项目,则可以使用 Python Poetry 添加更多 Python 库。

设置环境变量

设置运行 Google 文档代理代码项目所需的一些环境变量,包括 Google Gemini API 密钥和 Python Poetry 设置。如果您使用的是 Linux,不妨将这些变量添加到 $HOME/.bashrc 文件中,使其成为终端会话的默认设置。

如需设置环境变量,请执行以下操作:

  1. 获取 Google Gemini API 密钥并复制密钥字符串。
  2. 将 API 密钥设置为环境变量。在 Linux 主机上,请使用以下命令。
    export API_KEY=<YOUR_API_KEY_HERE>
    
  3. 通过设置 PYTHON_KEYRING_BACKEND 参数,解决 Python Poetry 的已知问题。在 Linux 主机上,请使用以下命令。
    export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
    

克隆和配置项目

下载项目代码并使用 Poetry 安装命令下载所需的依赖项并配置项目。您需要使用 git 源代码控制软件来检索项目源代码。external 如需下载并配置项目代码,请执行以下操作:

  1. 使用以下命令克隆 git 代码库。
    git clone https://github.com/google/generative-ai-docs
    
  2. (可选)将您的本地 Git 代码库配置为使用稀疏检出,这样您就只有文档代理项目的文件。
    cd generative-ai-docs/
    git sparse-checkout init --cone
    git sparse-checkout set examples/gemini/python/docs-agent/
    
  3. 移至 docs-agent 项目根目录。
    cd examples/gemini/python/docs-agent/
    
  4. 运行 Poetry 安装命令,以下载依赖项并配置项目:
    poetry install
    

准备内容

文档代理项目旨在处理文本内容,并且包含一些工具,专门用于以 Markdown 作为源格式的网站。如果您要处理网站内容,则应保留(或复制)所提供网站的目录结构,以便内容处理任务能够映射并创建指向该内容的链接。

根据内容的格式和详细信息,您可能需要清理内容,以移除非公开信息、内部备注或您不希望搜索的其他信息。您应该保留基本格式,例如标题和小标题,这有助于在内容处理步骤中创建逻辑文本拆分或区块。

如需准备内容以供处理,请执行以下操作:

  1. 为您希望 AI 代理搜索的内容创建一个目录。
    mkdir docs-agent/content/
    
  2. 将您的内容复制到 docs-agent/content/ 目录中。如果内容是网站,请保留(或复制)所提供网站的目录结构。
  3. 根据需要清理或修改内容,以移除非公开信息或您不希望包含在搜索中的其他信息。

使用 Flutter 文档进行测试

如果您需要用于测试 Google 文档代理的一组内容,可以使用 Flutter 开发者文档进行测试。

如需获取 Flutter 开发者文档,请执行以下操作:

  1. 移动到您希望 AI 代理搜索内容的内容目录。
    cd docs-agent/content/
    
  2. 将 Flutter 文档克隆到 docs-agent/content/ 目录中。
    git clone --recurse-submodules https://github.com/flutter/website.git
    

处理内容

为了让搜索代理有效地搜索与用户的问题相关的内容,您需要构建一个表示内容的向量数据库。这些向量是使用称为“文本嵌入”的 AI 生成模型函数生成的。文本嵌入是文本内容的数字表示。它们以一组数字的形式近似将文本的语义含义。通过对信息进行数字表示,系统可以获取用户的问题,使用相同的文本嵌入函数估算其含义,然后使用k-最近邻点 (k-NN) 算法通过数学计算找到相关信息。

拆分文本内容

文本嵌入矢量能够有效表示的文本量是有限的。此项目将矢量中表示的文本限制为不超过 3000 个字符,这意味着您必须将内容拆分为不超过该字符数限制的内容块。本部分介绍如何使用文档代理项目提供的脚本将 Markdown 文件拆分为较小的文本块。如需了解有关使用其他内容格式的提示,请参阅处理其他格式

如需拆分 Markdown 格式的内容,请执行以下操作:

  1. 通过修改 docs-agent/config.yaml 文件,配置处理脚本的输入参数。此示例针对 Flutter 文档的一部分:
    input:
    - path: "content/website/src/ui"
      url_prefix: "https://docs.flutter.dev/ui"
    
  2. 保存您对此配置文件所做的更改。
  3. 进入 docs-agent 项目目录:
    cd docs-agent/
    
  4. 运行 agent chunk 命令以拆分 Markdown 源内容:
    agent chunk
    

该脚本会处理输入内容,并在 docs-agent/data 目录中创建输出文本文件,根据标题、小标题和相关段落拆分文本。处理过程可能需要一些时间,具体取决于内容的大小。

创建文本嵌入向量

将内容拆分为大小合适、有意义的区块后,您可以使用文本嵌入函数用您的内容填充矢量数据库。文档代理项目使用 Chroma 向量数据库来存储文本嵌入向量。以下说明介绍了如何使用文档代理脚本将拆分的内容填充到矢量数据库中。

如需生成文本嵌入并填充向量数据库,请执行以下操作:

  1. 进入 docs-agent 项目目录:
    cd docs-agent/
    
  2. 使用 agent populate 命令使用您的内容填充矢量数据库:
    agent populate
    

此脚本使用 Google Gemini API 生成文本嵌入向量,然后将输出保存到向量数据库。处理过程可能需要一些时间,具体取决于内容的大小。

处理其他格式

文档代理项目旨在处理 Markdown 格式的网站内容。项目作者构建了一些转换器脚本,用于将其他类型的内容生成为 Markdown 格式,包括 Google 文档、便携式文档格式 (PDF) 和 Gmail。如需详细了解如何使用这些转换器,请参阅代码库的 docs-agent/apps_script 目录。

转换其他内容格式

您可以在项目中使用其他内容格式,但这些额外的方法需要由您或社区的其他成员构建。如需了解构建类似解决方案的人员,请查看代码库的问题拉取请求

为了支持其他内容格式,您需要构建的关键代码是一个分屏脚本,例如 files_to_plain_text.py 脚本。旨在构建一个可创建与此脚本类似输出的脚本或程序。请记住,最终文本输出应仅包含最少的格式和无关信息。如果您使用 HTML 或 JSON 等内容格式,请务必去除尽可能多的非信息格式(标记、脚本、CSS),以免影响您从其中生成的文本嵌入的值。

为内容格式构建分屏脚本后,您应该能够运行 populate_vector_database.py 脚本来填充您的矢量数据库。如需详细了解如何处理文件以与 Google 文档代理搭配使用,请参阅文档代理的预处理自述文件

测试应用

填充完矢量数据库后,项目即可进行测试。项目提供了一个打包函数,可让您在本地运行项目。

如需运行和测试项目网页界面,请执行以下操作:

  1. 进入 docs-agent 项目目录:
    cd docs-agent/
    
  2. 运行 Web 应用启动脚本:
    agent chatbot
    
  3. 使用网络浏览器导航到启动脚本输出中显示的网址,然后测试应用。
    * Running on http://your-hostname-here:5000
    

实现选项

Gemini API 提供的编程工具可以取代 Google 文档代理实现的各个组件,特别是语义检索和归因问答 (AQA) Gemini 模型变体。您可以使用 Gemini API 的语义检索功能替换单独的向量数据库。借助语义检索功能,您可以为内容生成嵌入,并存储该内容。AQA Gemini 模型已经过调整,能够使用提示中提供的源内容回答问题。您可以将语义检索与 AQA 模型结合使用,以在 Gemini API 中回答与您的内容相关的问题

文档代理包含使用语义检索 API 功能和/或该 AQA Gemini 模型的配置选项。如需了解详情,请参阅文档代理自述文件

其他资源

如需详细了解文档代理项目,请参阅代码库。 如果您在构建应用方面需要帮助,或者正在寻找开发者协作者,请查看 Google Developers 社区 Discord 服务器。

生产应用

如果您计划为大量受众群体部署 Google 文档代理,请注意,您在使用 Google Gemini API 时可能会受到速率限制和其他使用限制的约束。如果您考虑使用 Gemini API 构建生产应用(例如 Docs Agent),请查看 Google Cloud Vertex AI 服务以提高应用的可伸缩性和可靠性。