Search
Code115
/** @jsxImportSource npm:hono@3/jsx */import bots from "https://esm.town/v/tmcw/surprisingEmbeddings/bots"import * as v from "jsr:@valibot/valibot" <p> Embeddings. They're one of the parts of the LLM/AI wave that I sort of like. </p> <p> Embeddings are pretty cool when they work, because they sort of capture the idea of{" "} <a href="https://blog.val.town/blog/val-vibes/">'vibes', which makes them useful for search applications</a>. This project is based on this{" "} <a href="https://www.linkedin.com/pulse/insanity-relying-vector-embeddings-why-rag-fails-michael-wood-4iexe/?trackingId=f0RxihkCgaZ4LppqqMP%2FUw%3D%3D"> blog post I read last year const input = inputResult.output const embeddings = await client.embed({ input, word, embedding: embeddings.data?.at(i)?.embedding, } <head> <title>Surprising embeddings</title> <link rel="stylesheet" href="https://unpkg.com/missing.css@1.1.3" /> <h3> Surprising embeddings <sub-title> </script> <script type="module" src="https://esm.town/v/tmcw/surprisingEmbeddings/visualization"></script> </div> <head> <title>Surprising embeddings</title> <link rel="stylesheet" href="https://unpkg.com/missing.css@1.1.3" /> <h3> Surprising embeddings <sub-title> const embeddings = await client.embed({ input, word, embedding: embeddings.data?.at(i)?.embedding, } try { // let embeddings = await modelProvider.gen({ // embed: true, // }); // console.log(`Adding link ${counter}:`, link.title, link.url, embeddings); console.log(`Adding link ${counter}:`, link.title, link.url); data: JSON.stringify(link), // embeddings: embeddings.embedding.join(','), });export default async function semanticSearchPublicVals(query) { const allValsBlobEmbeddingsMeta = (await blob.getJSON(`allValsBlob${dimensions}EmbeddingsMeta`)) ?? {}; const allBatchDataIndexes = _.uniq(Object.values(allValsBlobEmbeddingsMeta).map((item: any) => item.batchDataIndex)); const embeddingsBatches = []; const allBatchDataIndexesPromises = []; for (const batchDataIndex of allBatchDataIndexes) { const embeddingsBatchBlobName = `allValsBlob${dimensions}EmbeddingsData_${batchDataIndex}`; const promise = blob.get(embeddingsBatchBlobName).then((response) => response.arrayBuffer()); promise.then((data) => { embeddingsBatches[batchDataIndex as any] = data; console.log(`Loaded ${embeddingsBatchBlobName} (${data.byteLength} bytes)`); }); const openai = new OpenAI(); const queryEmbedding = (await openai.embeddings.create({ model: "text-embedding-3-small", const res = []; for (const id in allValsBlobEmbeddingsMeta) { const meta = allValsBlobEmbeddingsMeta[id]; const embedding = new Float32Array( embeddingsBatches[meta.batchDataIndex], dimensions * 4 * meta.valIndex, const sqlite = createClient({ url: "libsql://valsembeddings-jpvaltown.turso.io", authToken: Deno.env.get("TURSO_AUTH_TOKEN_VALSEMBEDDINGS"), }); const embedding = await openai.embeddings.create({ model: "text-embedding-3-small", sql: "WITH matches AS (SELECT rowid, distance FROM vss_vals_embeddings WHERE vss_search(embedding, :embeddingBinary) LIMIT 50) SELECT id, distance FROM matches JOIN vals_embeddings ON matches.rowid = vals_embeddings.rowid", args: { embeddingBinary },Uses Val Town's [blob storage](https://docs.val.town/std/blob/) to search embeddings of all vals, by downloading them all and iterating through all of them to compute distance. Slow and terrible, but it works!- Get metadata from blob storage: `allValsBlob${dimensions}EmbeddingsMeta` (currently `allValsBlob1536EmbeddingsMeta`), which has a list of all indexed vals and where their embedding is stored (`batchDataIndex` points to the blob, and `valIndex` represents the offset within the blob). - The blobs have been generated by [janpaul123/indexValsBlobs](https://www.val.town/v/janpaul123/indexValsBlobs). It is not run automatically.- Get all blobs with embeddings pointed to by the metadata, e.g. `allValsBlob1536EmbeddingsData_0` for `batchDataIndex` 0.- Call OpenAI to generate an embedding for the search query.- Go through all embeddings and compute cosine similarity with the embedding for the search query.- Return list sorted by similarity.Uses [Turso](https://turso.tech/) to search embeddings of all vals, using the [sqlite-vss](https://github.com/asg017/sqlite-vss) extension.- Call OpenAI to generate an embedding for the search query.- Query the `vss_vals_embeddings` table in Turso using `vss_search`. - The `vss_vals_embeddings` table has been generated by [janpaul123/indexValsTurso](https://www.val.town/v/janpaul123/indexValsTurso). It is not run automatically. - This table is incomplete due to a [bug in Turso](https://discord.com/channels/933071162680958986/1245378515679973420/1245378515679973420). * Create a new Qdrant collection in an existing cluster with the given name * Uses recommended values for OpenAPI embeddings */ try { const r = await fetch("https://embeddings-dashboard-api.jina.ai/api/v1/api_key/user?api_key=" + encodeURIComponent(k), { signal: AbortSignal.timeout(20000) }); const rx = new RegExp(p.prefer, "i"); // never "discover" non-chat endpoints: guard/moderation, ASR, TTS, embeddings, rerankers const JUNK = /guard|safeguard|moderat|whisper|tts|speech|embed|rerank|playai|vision-only|ocr|\bstt\b/i;export async function embed(texts: string[], task: "retrieval.passage" | "retrieval.query") { const r = await fetch("https://api.jina.ai/v1/embeddings", { method: "POST", headers: { "content-type": "application/json", authorization: "Bearer " + KEY() }, body: JSON.stringify({ model: "jina-embeddings-v3", task, dimensions: DIM, input: texts }), signal: AbortSignal.timeout(50000), const rx = new RegExp(p.prefer, "i"); // never "discover" non-chat endpoints: guard/moderation, ASR, TTS, embeddings, rerankers const JUNK = /guard|safeguard|moderat|whisper|tts|speech|embed|rerank|playai|vision-only|ocr|\bstt\b/i;['MDC-001','historical_breadth',{historical_master_reaches_numbered_section:193,rule:'final manual may reorganize, but material knowledge must crosswalk rather than disappear'}],['MDC-002','ai_retrieval',{historical_topics:['embeddings','vector search','RAG','advanced RAG','HyDE','reranking','ColBERT','contextual retrieval','GraphRAG','agents','tools/function calling','skills'],rule:'final manual explains distinctions/tradeoffs/currentness rather than shallow definitions'}],['MDC-003','security',{historical_topics:['least privilege','defense in depth','deny by default','threat modeling','AuthN/AuthZ/session/token/IdP/claims/scopes/roles/permissions','JWT validation','OAuth/OIDC','secrets','OWASP classes'],rule:'security concepts keep precise boundaries and examples'}],const req = [["M001","Sistemas de IA","Computação, algoritmos e dados"],["M002","Sistemas de IA","Estatística, probabilidade e avaliação"],["M003","Sistemas de IA","Machine learning e deep learning"],["M004","Sistemas de IA","Redes neurais, embeddings, transformers e attention"],["M005","Sistemas de IA","Tokenização, context window e inferência"],["M006","Sistemas de IA","Training, fine-tuning e adaptation"],["M007","Sistemas de IA","Prompting e context engineering"],["M008","Sistemas de IA","RAG, retrieval, vector databases e knowledge graphs"],["M009","Sistemas de IA","Memory, state e context durability"],["M010","Sistemas de IA","Tools, function calling e MCP"],["M011","Sistemas de IA","Agents, subagents e multi-agent systems"],["M012","Sistemas de IA","Orchestration, routers, planners e handoffs"],["M013","Sistemas de IA","Validators, evaluators, graders e guardrails"],["M014","Sistemas de IA","Hallucination, uncertainty, provenance e currentness"],["M015","Sistemas de IA","Observability, traces, evals e regression"],["M016","Sistemas de IA","Safety, alignment, security e prompt injection"],["M017","Sistemas de IA","Inference infrastructure, GPUs, local e cloud"],["M018","Desenvolver com IA","Ideação, problema e pesquisa"],["M019","Desenvolver com IA","Requirements, PRD e build spec"],["M020","Desenvolver com IA","Context engineering e token economy"],["M021","Desenvolver com IA","Skills, Agents, Rules e instruction surfaces"],["M022","Desenvolver com IA","Tool routing, capability discovery e currentness"],["M023","Desenvolver com IA","Planning e task decomposition"],["M024","Desenvolver com IA","Coding agents e implementation workflow"],["M025","Desenvolver com IA","Testing, debugging e code review"],["M026","Desenvolver com IA","Security e side-effect semantics"],["M027","Desenvolver com IA","CI/CD, deployment e runtime verification"],["M028","Desenvolver com IA","Checkpoints, recovery e durable execution"],["M029","Desenvolver com IA","Failure mining e success mining"],["M030","Desenvolver com IA","Mutation testing, falsification e clean-room"],["M031","Engenharia de Software","Problema, domínio e requisitos"],["M032","Engenharia de Software","Arquitetura e trade-offs"],["M033","Engenharia de Software","Frontend e experiência do usuário"],["M034","Engenharia de Software","Backend e serviços"],["M035","Engenharia de Software","Bancos de dados, SQL e NoSQL"],["M036","Engenharia de Software","APIs, REST, GraphQL e RPC"],["M037","Engenharia de Software","Autenticação, autorização e segurança"],["M038","Engenharia de Software","Redes, protocolos, storage, cache, filas e eventos"],["M039","Engenharia de Software","Monolith, modular monolith e microservices"],["M040","Engenharia de Software","Clean Architecture, DDD, SOLID e patterns"],["M041","Engenharia de Software","Testing pyramid, unit, integration, E2E e contract tests"],["M042","Engenharia de Software","Performance, scalability e observability"],["M043","Engenharia de Software","Git, branches, commits e pull requests"],["M044","Engenharia de Software","CI, CD, containers e cloud"],["M045","Engenharia de Software","Environments, secrets, config e infrastructure as code"],["M046","Engenharia de Software","Deployment, rollback, maintenance e technical debt"],["M047","Engenharia de Software","Árvores de projeto e organização de repositório"],["M048","Engenharia de Software","Tipos de arquivos e formatos"],["M049","Referência transversal","Por que A e não B: decisões e trade-offs"],["M050","Referência transversal","Glossário mestre, aliases e terminologia profissional"],["M051","Referência transversal","Laboratórios, exemplos, erros e contrafactuais"],["M052","Referência transversal","Plataformas de agentes e adapters atuais"],["M053","Referência transversal","Provenance, source ledger e evidência"],["M054","Referência transversal","Portabilidade Windows/Linux/macOS"],["M055","Referência transversal","Acessibilidade, clareza e linguagem inclusiva"]];