Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

检索增强生成

Agent 可以使用检索增强生成 (Retrieval Augmented Generation, RAG) 检索相关信息,并用其增强对 AI 模型的调用。例如:存储用户的聊天历史以作为后续对话的上下文、对文档进行摘要以构建 Agent 的知识库、或者使用来自 Agent 浏览网页 任务的数据来增强 Agent 的能力。

你可以使用 Agent 自身的 SQL 数据库 作为数据的真实来源,并将 embedding 存储在 Vectorize(或任何其他支持向量的数据库)中,使你的 Agent 能够检索到相关信息。

向量搜索

Note

如果你对向量数据库和 Vectorize 完全陌生,请访问 Vectorize 教程 学习基础知识,包括如何创建索引、插入数据以及生成 embedding。

你可以从 Agent 的任意方法中查询一个或多个向量索引:任何附加到 Agent 的 Vectorize 索引都可以通过 this.env 访问。如果你为向量关联了元数据 来映射回存储在 Agent 中的数据,就可以使用 this.sql 直接在 Agent 内查找数据。

下面是一个为 Agent 增加检索能力的示例:

JavaScript


import { Agent } from "agents";


export class RAGAgent extends Agent {

  // Other methods on our Agent

  // ...

  //

  async queryKnowledge(userQuery) {

    // Turn a query into an embedding

    const queryVector = await this.env.AI.run("@cf/baai/bge-base-en-v1.5", {

      text: [userQuery],

    });


    // Retrieve results from our vector index

    let searchResults = await this.env.VECTOR_DB.query(queryVector.data[0], {

      topK: 10,

      returnMetadata: "all",

    });


    let knowledge = [];

    for (const match of searchResults.matches) {

      console.log(match.metadata);

      knowledge.push(match.metadata);

    }


    // Use the metadata to re-associate the vector search results

    // with data in our Agent's SQL database

    let results = this

      .sql`SELECT * FROM knowledge WHERE id IN (${knowledge.map((k) => k.id)})`;


    // Return them

    return results;

  }

}


Explain Code

TypeScript


import { Agent } from "agents";


interface Env {

  AI: Ai;

  VECTOR_DB: Vectorize;

}


export class RAGAgent extends Agent {

  // Other methods on our Agent

  // ...

  //

  async queryKnowledge(userQuery: string) {

    // Turn a query into an embedding

    const queryVector = await this.env.AI.run("@cf/baai/bge-base-en-v1.5", {

      text: [userQuery],

    });


    // Retrieve results from our vector index

    let searchResults = await this.env.VECTOR_DB.query(queryVector.data[0], {

      topK: 10,

      returnMetadata: "all",

    });


    let knowledge = [];

    for (const match of searchResults.matches) {

      console.log(match.metadata);

      knowledge.push(match.metadata);

    }


    // Use the metadata to re-associate the vector search results

    // with data in our Agent's SQL database

    let results = this

      .sql`SELECT * FROM knowledge WHERE id IN (${knowledge.map((k) => k.id)})`;


    // Return them

    return results;

  }

}


Explain Code

你还需要将 Agent 连接到向量索引:

JSONC


{

  // ...

  "vectorize": [

    {

      "binding": "VECTOR_DB",

      "index_name": "your-vectorize-index-name",

    },

  ],

  // ...

}


Explain Code

TOML


[[vectorize]]

binding = "VECTOR_DB"

index_name = "your-vectorize-index-name"


如果你有多个想要使用的索引,可以提供一个 vectorize 绑定数组。

后续步骤