{"product_id":"tạo-embeddings-với-voyage-ai-text-thanh-vector","title":"Tạo Embeddings với Voyage AI — Text thành vector","description":"\n\u003cp\u003e\u003cstrong\u003eEmbeddings\u003c\/strong\u003e là nền tảng của mọi RAG system — chúng chuyển đổi văn bản thành vector số học sao cho các đoạn văn có nghĩa gần nhau sẽ có vector gần nhau trong không gian đa chiều. \u003cstrong\u003eVoyage AI\u003c\/strong\u003e là nhà cung cấp embedding models được Anthropic khuyến nghị chính thức, được tối ưu hóa để hoạt động tốt nhất với Claude.\u003c\/p\u003e\n\n\u003cp\u003eBài viết này giải thích embedding là gì, cách dùng Voyage AI API, và cách tích hợp vào pipeline RAG của bạn.\u003c\/p\u003e\n\n\u003ch2\u003eEmbedding là gì?\u003c\/h2\u003e\n\n\u003cp\u003eHãy tưởng tượng mỗi từ hay câu được đặt vào một \"bản đồ ý nghĩa\" nhiều chiều. Các từ\/câu có nghĩa tương tự sẽ nằm gần nhau, khác nghĩa sẽ nằm xa. Một embedding model chuyển văn bản thành tọa độ trong bản đồ đó.\u003c\/p\u003e\n\n\u003cp\u003eVí dụ:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\"Con chó\" và \"Con mèo\" — vector gần nhau (cùng là thú cưng)\u003c\/li\u003e\n  \u003cli\u003e\"Con chó\" và \"Xe ô tô\" — vector xa nhau (khác category)\u003c\/li\u003e\n  \u003cli\u003e\"API key bị lỗi\" và \"Không thể xác thực\" — gần nhau (cùng về authentication issues)\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eVoyage AI Models\u003c\/h2\u003e\n\n\u003cp\u003eVoyage AI cung cấp nhiều models cho các use cases khác nhau:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eModel\u003c\/th\u003e\n\u003cth\u003eDimension\u003c\/th\u003e\n\u003cth\u003eUse case\u003c\/th\u003e\n\u003cth\u003eContext\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003evoyage-3\u003c\/td\u003e\n\u003ctd\u003e1024\u003c\/td\u003e\n\u003ctd\u003eGeneral purpose, cân bằng\u003c\/td\u003e\n\u003ctd\u003e32K tokens\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003evoyage-3-lite\u003c\/td\u003e\n\u003ctd\u003e512\u003c\/td\u003e\n\u003ctd\u003eCost-efficient, high volume\u003c\/td\u003e\n\u003ctd\u003e32K tokens\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003evoyage-code-3\u003c\/td\u003e\n\u003ctd\u003e1024\u003c\/td\u003e\n\u003ctd\u003eSource code, technical docs\u003c\/td\u003e\n\u003ctd\u003e32K tokens\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003evoyage-finance-2\u003c\/td\u003e\n\u003ctd\u003e1024\u003c\/td\u003e\n\u003ctd\u003eFinancial documents\u003c\/td\u003e\n\u003ctd\u003e32K tokens\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003evoyage-law-2\u003c\/td\u003e\n\u003ctd\u003e1024\u003c\/td\u003e\n\u003ctd\u003eLegal documents\u003c\/td\u003e\n\u003ctd\u003e16K tokens\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003ch2\u003eCài đặt và khởi tạo\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install voyageai numpy\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nimport voyageai\nimport numpy as np\n\nclient = voyageai.Client(api_key=os.environ.get(\"VOYAGE_API_KEY\"))\nprint(\"Voyage AI client ready\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo embeddings cơ bản\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef embed_texts(texts, model=\"voyage-3\", input_type=None):\n    \"\"\"\n    Tạo embeddings cho danh sách văn bản.\n\n    input_type options:\n    - None: Không specify (dùng cho general tasks)\n    - \"document\": Văn bản cần index (tối ưu cho retrieval)\n    - \"query\": Câu hỏi tìm kiếm (tối ưu cho search)\n    \"\"\"\n    result = client.embed(\n        texts=texts,\n        model=model,\n        input_type=input_type\n    )\n    return result.embeddings\n\n# Ví dụ cơ bản\ntexts = [\n    \"Hướng dẫn cài đặt Claude API\",\n    \"Claude API installation guide\",\n    \"Cách nấu phở bò ngon\",\n    \"Lỗi 401 Unauthorized khi gọi API\",\n    \"Không thể xác thực — thiếu API key\"\n]\n\nembeddings = embed_texts(texts)\nprint(f\"Embedded {len(texts)} texts\")\nprint(f\"Embedding dimension: {len(embeddings[0])}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTính Cosine Similarity\u003c\/h2\u003e\n\n\u003cp\u003eCosine similarity đo góc giữa hai vectors — giá trị từ -1 (ngược chiều) đến 1 (cùng chiều). Thực tế với embeddings: 0.8+ = rất tương tự, 0.5-0.8 = liên quan, dưới 0.5 = khác nhau.\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef cosine_similarity(vec1, vec2):\n    \"\"\"Tính cosine similarity giữa hai vectors.\"\"\"\n    vec1 = np.array(vec1)\n    vec2 = np.array(vec2)\n\n    dot_product = np.dot(vec1, vec2)\n    norm1 = np.linalg.norm(vec1)\n    norm2 = np.linalg.norm(vec2)\n\n    if norm1 == 0 or norm2 == 0:\n        return 0.0\n\n    return dot_product \/ (norm1 * norm2)\n\n# So sánh similarity giữa các cặp\nprint(\"Similarity scores:\")\nreference = texts[0]  # \"Hướng dẫn cài đặt Claude API\"\nref_embedding = embeddings[0]\n\nfor i, (text, emb) in enumerate(zip(texts, embeddings)):\n    if i == 0:\n        continue\n    score = cosine_similarity(ref_embedding, emb)\n    print(f\"  [{score:.3f}] {text}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eKết quả mong đợi:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e  [0.912] Claude API installation guide  (bản dịch tiếng Anh = rất giống)\n  [0.234] Cách nấu phở bò ngon           (hoàn toàn khác topic)\n  [0.687] Lỗi 401 Unauthorized khi gọi API  (cùng về API nhưng khác vấn đề)\n  [0.645] Không thể xác thực — thiếu API key  (liên quan đến API issues)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eSemantic Search function\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef semantic_search(query, corpus_texts, corpus_embeddings=None, top_k=3):\n    \"\"\"\n    Tìm kiếm semantic trong corpus.\n\n    Args:\n        query: Câu hỏi tìm kiếm\n        corpus_texts: List văn bản cần search\n        corpus_embeddings: Pre-computed embeddings (optional, tránh re-embed)\n        top_k: Số kết quả trả về\n    \"\"\"\n    # Embed query với input_type=\"query\"\n    query_embedding = embed_texts([query], input_type=\"query\")[0]\n\n    # Embed corpus nếu chưa có\n    if corpus_embeddings is None:\n        corpus_embeddings = embed_texts(corpus_texts, input_type=\"document\")\n\n    # Tính similarity với tất cả documents\n    similarities = [\n        cosine_similarity(query_embedding, doc_emb)\n        for doc_emb in corpus_embeddings\n    ]\n\n    # Sắp xếp và lấy top_k\n    ranked = sorted(\n        zip(similarities, corpus_texts),\n        key=lambda x: x[0],\n        reverse=True\n    )\n\n    return ranked[:top_k]\n\n# Test semantic search\nknowledge_base = [\n    \"Claude API yêu cầu API key để xác thực. Lấy key tại console.anthropic.com\",\n    \"Giới hạn rate: 50 requests\/phút cho Tier 1, 1000 requests\/phút cho Tier 4\",\n    \"Model claude-haiku-4-5 có chi phí thấp nhất, phù hợp cho production high-volume\",\n    \"Streaming response cho phép hiển thị text từng token, cải thiện UX\",\n    \"Context window tối đa: 200K tokens cho claude-opus-4-5\",\n    \"SDK Python: pip install anthropic. SDK TypeScript: npm install @anthropic-ai\/sdk\",\n    \"Function calling (tool use) cho phép Claude gọi external APIs\",\n    \"Vision API: gửi base64 images trong messages để Claude phân tích ảnh\"\n]\n\n# Pre-compute embeddings một lần\nkb_embeddings = embed_texts(knowledge_base, input_type=\"document\")\n\n# Search\nquery = \"Làm sao cài đặt thư viện Python?\"\nresults = semantic_search(query, knowledge_base, kb_embeddings)\n\nprint(f\"\nQuery: {query}\")\nprint(\"Top kết quả:\")\nfor score, text in results:\n    print(f\"  [{score:.3f}] {text}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBatch Embedding cho hiệu suất cao\u003c\/h2\u003e\n\n\u003cp\u003eVoyage AI cho phép embed nhiều texts trong một call. Batch processing tăng throughput đáng kể:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef batch_embed(texts, model=\"voyage-3\", input_type=\"document\", batch_size=128):\n    \"\"\"\n    Embed danh sách lớn texts theo batches.\n    Voyage AI giới hạn 128 texts hoặc 1M tokens per request.\n    \"\"\"\n    all_embeddings = []\n\n    for i in range(0, len(texts), batch_size):\n        batch = texts[i:i + batch_size]\n        result = client.embed(\n            texts=batch,\n            model=model,\n            input_type=input_type\n        )\n        all_embeddings.extend(result.embeddings)\n\n        # Report progress\n        processed = min(i + batch_size, len(texts))\n        print(f\"  Processed {processed}\/{len(texts)} texts\")\n\n    return all_embeddings\n\n# Ví dụ: embed 1000 documents\nimport random\nimport string\n\nlarge_corpus = [\n    f\"Document {i}: \" + \"\".join(random.choices(string.ascii_letters, k=100))\n    for i in range(1000)\n]\n\nprint(\"Batch embedding 1000 documents...\")\nembeddings_large = batch_embed(large_corpus, batch_size=128)\nprint(f\"Done! {len(embeddings_large)} embeddings created\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMultilingual Embeddings\u003c\/h2\u003e\n\n\u003cp\u003eVoyage AI hỗ trợ cross-lingual search — query tiếng Việt có thể match documents tiếng Anh:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003emixed_corpus = [\n    \"Claude API requires authentication with an API key\",\n    \"Claude API cần xác thực bằng API key\",\n    \"Rate limits apply to all API endpoints\",\n    \"Giới hạn request áp dụng cho tất cả endpoints\",\n    \"Streaming is supported for real-time responses\",\n]\n\nmixed_embeddings = embed_texts(mixed_corpus, input_type=\"document\")\n\n# Query tiếng Việt\nvi_query = \"Làm sao xác thực với API?\"\nresults = semantic_search(vi_query, mixed_corpus, mixed_embeddings)\n\nprint(f\"Query (VN): {vi_query}\")\nprint(\"Results:\")\nfor score, text in results:\n    print(f\"  [{score:.3f}] {text}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eReranking với Voyage AI\u003c\/h2\u003e\n\n\u003cp\u003eSau khi retrieve top-50 candidates, dùng reranker để chọn top-5 chất lượng nhất:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef rerank(query, candidates, top_k=5, model=\"rerank-2\"):\n    \"\"\"\n    Rerank candidates theo relevance với query.\n    Tốt hơn cosine similarity cho precision.\n    \"\"\"\n    result = client.rerank(\n        query=query,\n        documents=candidates,\n        model=model,\n        top_k=top_k\n    )\n\n    reranked = [\n        {\"text\": r.document, \"score\": r.relevance_score}\n        for r in result.results\n    ]\n    return reranked\n\n# Two-stage retrieval: vector search -\u0026gt; rerank\ninitial_results = [text for _, text in semantic_search(\n    \"Claude authentication\",\n    knowledge_base,\n    kb_embeddings,\n    top_k=5\n)]\n\nreranked = rerank(\"How to authenticate with Claude API?\", initial_results)\nprint(\"Reranked results:\")\nfor r in reranked:\n    print(f\"  [{r['score']:.3f}] {r['text']}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eVoyage AI cung cấp embeddings chất lượng cao, được tối ưu cho tiếng Việt và multilingual, với domain-specific models cho code, finance, và legal. Kết hợp với Claude, đây là foundation lý tưởng cho mọi RAG system.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Áp dụng kiến thức này vào \u003ca href=\"\/collections\/nang-cao\"\u003eRAG với Pinecone + Claude\u003c\/a\u003e để xây dựng production-ready RAG, hoặc đọc về \u003ca href=\"\/collections\/nang-cao\"\u003eLlamaIndex + Claude\u003c\/a\u003e để dùng framework high-level.\u003c\/p\u003e\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/products\/rag-v%E1%BB%9Bi-pinecone-claude-vector-database-cho-ai\"\u003eRAG với Pinecone + Claude — Vector database cho AI\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/contextual-retrieval-nang-c%E1%BA%A5p-rag-v%E1%BB%9Bi-embeddings-ng%E1%BB%AF-c%E1%BA%A3nh\"\u003eContextual Retrieval — Nâng cấp RAG với embeddings ngữ cảnh\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/rag-v%E1%BB%9Bi-mongodb-claude-xay-chatbot-co-ki%E1%BA%BFn-th%E1%BB%A9c\"\u003eRAG với MongoDB + Claude — Xây chatbot có kiến thức\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/context-engineering-ngh%E1%BB%87-thu%E1%BA%ADt-qu%E1%BA%A3n-ly-context-cho-claude\"\u003eContext Engineering — Nghệ thuật quản lý context cho Claude\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-cho-d%E1%BB%AF-li%E1%BB%87u-va-phan-tich-t%E1%BB%95ng-quan-plugin\"\u003eClaude cho Dữ liệu và Phân tích: Tổng quan Plugin\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721905455316,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/t_o-embeddings-v_i-voyage-ai-text-thanh-vector.jpg?v=1774521801","url":"https:\/\/claude.vn\/products\/t%e1%ba%a1o-embeddings-v%e1%bb%9bi-voyage-ai-text-thanh-vector","provider":"CLAUDE.VN","version":"1.0","type":"link"}