# AI Search Patterns ## search() vs aiSearch() | Use | Method | Returns | |-----|--------|---------| | Custom UI, analytics | `search()` | Raw chunks only (~100-300ms) | | Chatbots, Q&A | `aiSearch()` | AI response + chunks (~500-2000ms) | ## rewrite_query | Setting | Use When | |---------|----------| | `true` | User input (typos, vague queries) | | `false` | LLM-generated queries (already optimized) | ## Multitenancy (Folder-Based) ```typescript const answer = await env.AI.autorag("saas-docs").aiSearch({ query: "refund policy", model: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", filters: { column: "folder", operator: "gte", // "starts with" pattern value: `tenants/${tenantId}/` } }); ``` ## Streaming ```typescript const stream = await env.AI.autorag("docs").aiSearch({ query, model: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", stream: true }); return new Response(stream, { headers: { "Content-Type": "text/event-stream" } }); ``` ## Score Threshold | Threshold | Use | |-----------|-----| | 0.3 (default) | Broad recall, exploratory | | 0.5 | Balanced, production default | | 0.7 | High precision, critical accuracy | ## System Prompt Template ```typescript const systemPrompt = `You are a documentation assistant. - Answer ONLY based on provided context - If context doesn't contain answer, say "I don't have information" - Include code examples from context`; ``` ## Compound Filters ```typescript // OR: Multiple folders filters: { operator: "or", filters: [ { column: "folder", operator: "gte", value: "docs/api/" }, { column: "folder", operator: "gte", value: "docs/auth/" } ] } // AND: Folder + date filters: { operator: "and", filters: [ { column: "folder", operator: "gte", value: "docs/" }, { column: "timestamp", operator: "gte", value: oneWeekAgoSeconds } ] } ``` ## Reranking Enable for high-stakes use cases (adds ~300ms latency): ```typescript reranking: { enabled: true, model: "@cf/baai/bge-reranker-base" } ```