None of the old way felt fast: staring at blank screen for 3–10 seconds while the model computes. With SSE, each token shows instantly—perception improves even if total time is unchanged. On one GPT-4 deployment, time-to-first-token went from 3 seconds to 150 ms; the full reply still needed 10 seconds. Over five years, we've added streaming to more than 30 projects—chatbots, assistants with memory, and None of the simple query tools. Our integrations span OpenAI, Anthropic, and open-weight models. Streaming cuts perceived wait by 80% and reduces support ticket volume by 30%. Faster first word lifts conversions by 15%.
Official SSE documentation
Why SSE Fits Token Delivery
SSE is a standard browser API—None of the extra libraries. Unlike WebSocket, it's one-way (server to client) over HTTP, so it passes through proxies like Nginx without issue. For LLM token streaming, this is perfect: each chunk arrives as an event. None of the complexity of bidirectional protocols. Our implementation uses None of the custom parsing; the browser handles it natively.
AI Integration: Chatbots, RAG, Semantic Search, Recommendations
In 8 out of 10 projects, an "AI chatbot" turns out to be an expensive wrapper over GPT-4o with a system prompt. Without access to real company data. The user asks "how much does the Premium plan cost?" — the bot hallucinates a price out of thin air. Asks "when will my order arrive?" — gets a polite "contact support." This is not integration — it's imitation. We have implemented RAG solutions in 30+ projects over 5 years: from e-commerce stores to medical portals. We guarantee: useful AI assistance begins where the model reads your documents, not generic answers.
How do we build RAG systems?
Retrieval-Augmented Generation — standard architecture: query → find relevant fragments in a vector DB → insert found context → model response. But the devil is in the implementation details. Let's break down key components that determine quality.
Chunking. Cutting a document into 500-token pieces without regard for structure is a guarantee of losing meaning. If the cut lands in the middle of a paragraph, context breaks. Solution — recursive RecursiveCharacterTextSplitter with 10–15% overlap for documentation. For contracts and instructions, we use a semantic splitter: extract headings, lists, code blocks — each section becomes an independent chunk. Difference in search quality: on a medical project, precision increased from 0.55 to 0.84 just by proper chunking.
Embedding model. For Russian-language texts, intfloat/multilingual-e5-large gives a noticeable accuracy boost over outdated text-embedding-ada-002. In our measurements, NDCG@10 on a test set of 10,000 query-document pairs is 12% higher. OpenAI text-embedding-3-large is good for English content, but for Russian we recommend BAAI/bge-m3 or the mentioned e5-large.
Vector DB. If you already have PostgreSQL — pgvector saves resources. Install extension CREATE EXTENSION vector, add column vector(1024), create HNSW index. On a project with 80,000 support articles, p95 search time was 12 ms. That's enough. For catalogs with millions of items — Qdrant or Weaviate: native hybrid search and sharding out of the box.
What does hybrid search give?
Vector-only search is blind to exact matches: SKUs like "ABC-123", proper names, abbreviations are lost. Full-text-only search doesn't catch synonyms and paraphrasing. Combining via RRF (Reciprocal Rank Fusion) gives the best of both worlds: BM25 + vector search, results merged. In practice, recall@20 increases from 0.65 to 0.92 — the difference is noticeable to the user.
Reranking — final filter: top-20 candidates from hybrid search are run through a cross-encoder cross-encoder/ms-marco-MiniLM-L-6-v2. It adds 50–100 ms to response time, but relevance improves by another 5–10%. Without reranking, the chatbot may show irrelevant documents.
How to implement semantic search on a site?
A search for "comfortable leather armchairs" should find products described as "soft chairs made of natural leather" — ordinary LIKE search cannot do this. Our architecture: when adding a product/post, automatically generate an embedding via multilingual-e5-large, store it in pgvector. On query, embed it with the same model, search nearest neighbors via cosine distance with HNSW index. For a catalog of 100,000 items, index builds in 3 minutes, memory ~400 MB (1536-dimensional vectors). Average search time: 20 ms.
What about recommendation systems?
Collaborative filtering ("users like you bought X") requires history — at least 2–3 months of data with 1000+ active users. For startups or small projects, we use content-based: embedding of current product → search nearest neighbors by cosine similarity. When enough statistics accumulate (usually 15–20 interactions per user), we switch to a hybrid LightFM model. It combines behavior and product features. In our e-commerce project with 50,000 SKUs, the hybrid model increased conversion in the recommendation block by 18% (A/B test lasted 2 weeks).
How does streaming work?
Users shouldn't wait for the entire text to be generated — it kills UX. Server-Sent Events (SSE) is the protocol for token streaming. OpenAI SDK supports stream: true, returning an AsyncIterator. On frontend — Vercel AI SDK (useChat) or custom EventSource. Typical mistake: using WebSocket for unidirectional streaming — SSE is simpler (less code, built-in reconnect). Stack: Node.js + SSE + React.
How to orchestrate agents?
A simple chatbot answers. An agent performs actions: creates a Jira ticket, checks order status in CRM, books a calendar slot. For orchestration, we use LangGraph: state graph where each node is a model or tool call. Vercel AI SDK useChat + tools for Next.js allows adding integration in 10 lines of code. Main challenge — reliability: the model sometimes calls the wrong tool or passes malformed parameters. Protection — Zod schemas for each tool and structured outputs to guarantee JSON.
What does the work include?
| Stage |
Result |
Duration |
| Audit of data and business logic |
Source map, document format, quality assessment |
1–2 days |
| Prototype of RAG or recommendation system |
Demo with metrics (recall, precision, latency) |
1–2 weeks |
| Integration into existing web application |
API endpoints, chatbot/search interface |
1–2 weeks |
| A/B testing and optimization |
Report on metrics (CTR, conversion, hallucination rate) |
1 week |
| Documentation and team training |
Operations manual, code review |
2–3 days |
Additionally: we hand over vectorizer source code, monitoring dashboards (Langfuse), admin panel access for knowledge base updates. Post-production support — 1 month free.
What are the timelines?
| Task |
Estimated Time |
| RAG chatbot based on existing knowledge base |
3–6 weeks |
| Semantic catalog search |
2–4 weeks |
| Recommendation system with A/B testing |
6–10 weeks |
| Multi-agent system with integrations |
from 8 weeks |
Pricing is calculated individually after project discovery. We'll evaluate your project in 1 day. Contact us — we'll show how to turn AI from a toy into a profit-driving tool.