INTEGRITY Документация

Использование собственной модели генерации

По умолчанию AI Search использует модель Workers AI для генерации ответов. Чтобы использовать модель за пределами Workers AI, используйте AI Search для search и передайте полученный контент другой модели для генерации ответа. В этом руководстве используется модель OpenAI.

Предварительные требования

  1. Зарегистрируйтесь для получения Аккаунт Cloudflare ↗.
  2. Установка Node.js ↗.

менеджер версий Node.js

Используйте менеджер версий Node, например Volta ↗ или nvm ↗ чтобы избежать проблем с правами доступа и переключать версии Node.js. Wrangler, о котором пойдёт речь далее в этом руководстве, требует версию Node 16.17.0 или более поздней версии.

Вам также потребуется:

1. Создайте проект Worker

Создайте новый проект Worker с помощью create-cloudflare CLI (C3). C3 ↗ это инструмент командной строки, который помогает настраивать и развёртывать новые приложения в Cloudflare.

Создайте новый проект с именем byo-model выполнив:

npm create cloudflare@latest -- byo-model

Для настройки выберите следующие параметры:

Перейдите в каталог вашего приложения:

cd byo-model

2. Установите AI SDK и провайдер OpenAI

Установите AI SDK ↗ и его провайдера OpenAI:

npm i ai @ai-sdk/openai

3. Привяжите Worker и укажите API ключ

Добавьте привязку AI Search в свой конфигурационный файл 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

Сохраните ключ API OpenAI как secret:

npx wrangler secret put OPENAI_API_KEY

Для локальной разработки добавьте ключ в .dev.vars файл в корне проекта:

.dev.vars
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

4. Добавьте код

Обновите src/index.ts. Этот Worker выполняет поиск в вашем экземпляре, форматирует найденные чанки и передаёт их в OpenAI для генерации ответа. Замените my-instance с именем вашего экземпляра.

src/index.js
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.ts
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, чтобы сделать его доступным в интернете:

npx wrangler login
npx wrangler deploy

Следующие шаги

Модели

Используйте сторонние модели напрямую через AI Gateway.

Привязка Workers для поиска

Полный справочник по поиску и общению из Worker.