跳转到内容
搜索文档

使用自有生成模型

最后更新 查看 MarkdownAgent 设置

默认情况下,AI Search 使用 Workers AI 模型生成响应。若要使用 Workers AI 以外的模型,可使用 AI Search 进行 search,并将检索到的内容传给其他模型进行生成。本指南使用 OpenAI 模型。

前提条件

  1. 注册 Cloudflare 账户 ↗。
  2. 安装 Node.js ↗。

Node.js 版本管理器

使用 Volta ↗ 或 nvm ↗ 等 Node 版本管理器,以避免权限问题并切换 Node.js 版本。本指南后续将介绍的 Wrangler 需要 Node 版本 16.17.0 或更高。

你还需要:

1. 创建 Worker 项目

使用 create-cloudflare CLI(C3)创建新的 Worker 项目。C3 ↗ 是一个命令行工具,用于帮助你设置并部署应用到 Cloudflare。

通过运行以下命令创建名为 byo-model 的新项目:

npm create cloudflare@latest -- byo-model

进行设置时,请选择以下选项:

  • 对于 What would you like to start with?,选择 Hello World example。
  • 对于 Which template would you like to use?,选择 Worker only。
  • 对于 Which language do you want to use?,选择 TypeScript。
  • 对于 Do you want to use git for version control?,选择 Yes。
  • 对于 Do you want to deploy your application?,选择 No(部署前我们还会做一些修改)。

进入应用目录:

cd byo-model

2. 安装 AI SDK 与 OpenAI 提供商

安装 AI SDK ↗ 及其 OpenAI 提供商:

npm i ai @ai-sdk/openai

3. 绑定 Worker 并设置 API key

将 AI Search 绑定(binding)添加到你的 Wrangler 配置文件:

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "ai_search_namespaces": [
    {
      "binding": "AI_SEARCH",
      "namespace": "default",
      "remote": true
    }
  ]
}
[[ai_search_namespaces]]
binding = "AI_SEARCH"
namespace = "default"
remote = true

将 OpenAI API key 存储为 secret:

npx wrangler secret put OPENAI_API_KEY

对于本地开发,请改为将密钥添加到项目根目录的 .dev.vars 文件中:

.dev.varstxt
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

4. 添加代码

更新 src/index.ts。该 Worker 会搜索你的实例,格式化检索到的分块,并将其传给 OpenAI 以生成答案。将 my-instance 替换为你的实例名称。

src/index.jsjs
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";

export default {
	async fetch(request, env) {
		const url = new URL(request.url);
		const userQuery = url.searchParams.get("query") ?? "What is Cloudflare?";

		// Search for documents in AI Search.
		const searchResult = await env.AI_SEARCH.get("my-instance").search({
			messages: [{ role: "user", content: userQuery }],
		});

		if (searchResult.chunks.length === 0) {
			return Response.json({ text: `No data found for query "${userQuery}"` });
		}

		// Join the retrieved chunks into a single string.
		const chunks = searchResult.chunks
			.map((chunk) => `<file name="${chunk.item.key}">${chunk.text}</file>`)
			.join("\n\n");

		// Send the query and retrieved content to OpenAI for the answer.
		const openai = createOpenAI({ apiKey: env.OPENAI_API_KEY });
		const generateResult = await generateText({
			model: openai("gpt-4o-mini"),
			messages: [
				{
					role: "system",
					content:
						"You are a helpful assistant. Answer the user question using the provided files.",
				},
				{ role: "user", content: chunks },
				{ role: "user", content: userQuery },
			],
		});

		return Response.json({ text: generateResult.text });
	},
};
src/index.tsts
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";

export interface Env {
	AI_SEARCH: AiSearchNamespace;
	OPENAI_API_KEY: string;
}

export default {
	async fetch(request, env): Promise<Response> {
		const url = new URL(request.url);
		const userQuery = url.searchParams.get("query") ?? "What is Cloudflare?";

		// Search for documents in AI Search.
		const searchResult = await env.AI_SEARCH.get("my-instance").search({
			messages: [{ role: "user", content: userQuery }],
		});

		if (searchResult.chunks.length === 0) {
			return Response.json({ text: `No data found for query "${userQuery}"` });
		}

		// Join the retrieved chunks into a single string.
		const chunks = searchResult.chunks
			.map((chunk) => `<file name="${chunk.item.key}">${chunk.text}</file>`)
			.join("\n\n");

		// Send the query and retrieved content to OpenAI for the answer.
		const openai = createOpenAI({ apiKey: env.OPENAI_API_KEY });
		const generateResult = await generateText({
			model: openai("gpt-4o-mini"),
			messages: [
				{
					role: "system",
					content:
						"You are a helpful assistant. Answer the user question using the provided files.",
				},
				{ role: "user", content: chunks },
				{ role: "user", content: userQuery },
			],
		});

		return Response.json({ text: generateResult.text });
	},
} satisfies ExportedHandler<Env>;

5. 运行与部署

启动本地开发服务器,然后通过 /?query=your+search+terms 进行查询:

npx wrangler dev

使用 Cloudflare 账户登录,然后部署 Worker,使其可在 Internet 上访问:

npx wrangler login
npx wrangler deploy

后续步骤

模型

通过 AI Gateway 原生使用第三方模型。

这篇文档对您有帮助吗?