← Обзор / ai-search / how-to
Использование собственной модели генерации
По умолчанию AI Search использует модель Workers AI для генерации ответов. Чтобы использовать модель за пределами Workers AI, используйте AI Search для search и передайте полученный контент другой модели для генерации ответа. В этом руководстве используется модель OpenAI.
Предварительные требования
- Зарегистрируйтесь для получения Аккаунт Cloudflare ↗.
- Установка
Node.js↗.
менеджер версий Node.js
Используйте менеджер версий Node, например Volta ↗ или nvm ↗ чтобы избежать проблем с правами доступа и переключать версии Node.js. Wrangler, о котором пойдёт речь далее в этом руководстве, требует версию Node 16.17.0 или более поздней версии.
Вам также потребуется:
- Экземпляр AI Search, в котором уже есть проиндексированный контент. Чтобы создать его и добавить контент, см. Начало работы.
- Одна OpenAI API key ↗.
1. Создайте проект Worker
Создайте новый проект Worker с помощью create-cloudflare CLI (C3). C3 ↗ это инструмент командной строки, который помогает настраивать и развёртывать новые приложения в Cloudflare.
Создайте новый проект с именем byo-model выполнив:
npm create cloudflare@latest -- byo-modelДля настройки выберите следующие параметры:
- Для С чего вы хотите начать?, выберите
Hello World example. - Для Какой шаблон вы хотите использовать?, выберите
Worker only. - Для Какой язык вы хотите использовать?, выберите
TypeScript. - Для Хотите использовать git для контроля версий?, выберите
Yes. - Для Хотите развернуть приложение?, выберите
No(мы внесём некоторые изменения перед развёртыванием).
Перейдите в каталог вашего приложения:
cd byo-model2. Установите AI SDK и провайдер OpenAI
Установите AI SDK ↗ и его провайдера OpenAI:
npm i ai @ai-sdk/openai3. Привяжите 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 файл в корне проекта:
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"4. Добавьте код
Обновите src/index.ts. Этот Worker выполняет поиск в вашем экземпляре, форматирует найденные чанки и передаёт их в OpenAI для генерации ответа. Замените my-instance с именем вашего экземпляра.
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 });
},
};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