跳转到内容
搜索文档

使用自有生成模型

最后更新 查看 MarkdownAgent 设置

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

前提条件

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

Node.js 版本管理器

使用 Voltanvm 等 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 原生使用第三方模型。

这篇文档对您有帮助吗?