{"product_id":"rag-với-mongodb-claude-xay-chatbot-co-kiến-thức","title":"RAG với MongoDB + Claude — Xây chatbot có kiến thức","description":"\n\u003cp\u003eMongoDB Atlas Vector Search cho phép bạn lưu trữ embeddings trực tiếp trong MongoDB collection — không cần quản lý hạ tầng vector database riêng biệt. Kết hợp với \u003cstrong\u003eClaude\u003c\/strong\u003e, bạn có thể xây dựng chatbot biết kiến thức từ data sẵn có trong MongoDB của mình.\u003c\/p\u003e\n\n\u003cp\u003eGiải pháp này đặc biệt phù hợp khi bạn đã dùng MongoDB và muốn thêm khả năng AI mà không phải migrate data sang hệ thống khác.\u003c\/p\u003e\n\n\u003ch2\u003eƯu điểm của MongoDB Vector Search\u003c\/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eUnified storage\u003c\/strong\u003e — Metadata và vectors trong cùng một collection\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFlexible schema\u003c\/strong\u003e — Lưu bất kỳ metadata nào cùng với vector\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eAggregation pipeline\u003c\/strong\u003e — Kết hợp vector search với MongoDB queries phức tạp\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eAtlas managed\u003c\/strong\u003e — Không cần self-manage infrastructure\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eCài đặt môi trường\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install anthropic pymongo voyageai python-dotenv\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eTạo MongoDB Atlas cluster và bật Vector Search. Trong Atlas dashboard, vào \u003cstrong\u003eSearch\u003c\/strong\u003e tab và tạo Search Index với cấu hình sau:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e{\n  \"fields\": [\n    {\n      \"type\": \"vector\",\n      \"path\": \"embedding\",\n      \"numDimensions\": 1024,\n      \"similarity\": \"cosine\"\n    }\n  ]\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết nối MongoDB và thiết lập collection\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nfrom pymongo import MongoClient\nimport voyageai\nimport anthropic\n\n# Kết nối MongoDB Atlas\nmongo_client = MongoClient(os.environ.get(\"MONGODB_URI\"))\ndb = mongo_client[\"knowledge_base\"]\ncollection = db[\"documents\"]\n\n# Khởi tạo clients\nvoyage_client = voyageai.Client(api_key=os.environ.get(\"VOYAGE_API_KEY\"))\nclaude_client = anthropic.Anthropic(api_key=os.environ.get(\"ANTHROPIC_API_KEY\"))\n\nprint(\"Connected to MongoDB Atlas\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eIndexing: Lưu documents với embeddings\u003c\/h2\u003e\n\n\u003cp\u003eTrong MongoDB RAG, mỗi document có thêm field \u003ccode\u003eembedding\u003c\/code\u003e chứa vector:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef embed_and_store(documents):\n    \"\"\"\n    documents: list of dicts với \"text\", \"title\", \"source\", etc.\n    \"\"\"\n    texts = [doc[\"text\"] for doc in documents]\n\n    # Tạo embeddings\n    result = voyage_client.embed(\n        texts,\n        model=\"voyage-3\",\n        input_type=\"document\"\n    )\n\n    # Thêm embedding vào mỗi document\n    docs_to_insert = []\n    for doc, embedding in zip(documents, result.embeddings):\n        doc_with_embedding = {\n            **doc,\n            \"embedding\": embedding\n        }\n        docs_to_insert.append(doc_with_embedding)\n\n    # Upsert vào MongoDB\n    for doc in docs_to_insert:\n        collection.update_one(\n            {\"source_id\": doc.get(\"source_id\", doc.get(\"title\"))},\n            {\"$set\": doc},\n            upsert=True\n        )\n\n    print(f\"Stored {len(docs_to_insert)} documents with embeddings\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVector Search với MongoDB Aggregation Pipeline\u003c\/h2\u003e\n\n\u003cp\u003eMongoDB Vector Search sử dụng \u003ccode\u003e$vectorSearch\u003c\/code\u003e operator trong aggregation pipeline:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef vector_search(query, top_k=5, filter_query=None):\n    \"\"\"\n    Tìm kiếm semantic trong MongoDB collection.\n    filter_query: MongoDB query để pre-filter documents\n    \"\"\"\n    # Embed câu hỏi\n    query_embedding = voyage_client.embed(\n        [query],\n        model=\"voyage-3\",\n        input_type=\"query\"\n    ).embeddings[0]\n\n    # Xây dựng aggregation pipeline\n    vector_search_stage = {\n        \"$vectorSearch\": {\n            \"index\": \"vector_index\",\n            \"path\": \"embedding\",\n            \"queryVector\": query_embedding,\n            \"numCandidates\": top_k * 10,  # Candidate pool lớn hơn cho accuracy\n            \"limit\": top_k\n        }\n    }\n\n    # Thêm pre-filter nếu có\n    if filter_query:\n        vector_search_stage[\"$vectorSearch\"][\"filter\"] = filter_query\n\n    pipeline = [\n        vector_search_stage,\n        {\n            \"$project\": {\n                \"_id\": 0,\n                \"title\": 1,\n                \"text\": 1,\n                \"source\": 1,\n                \"category\": 1,\n                \"score\": {\"$meta\": \"vectorSearchScore\"}\n            }\n        }\n    ]\n\n    results = list(collection.aggregate(pipeline))\n    return results\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXây dựng Chatbot với Memory\u003c\/h2\u003e\n\n\u003cp\u003eĐiểm mạnh của MongoDB là lưu trữ conversation history cùng với documents. Ta xây dựng chatbot có \"memory\" về cuộc trò chuyện:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003econversations = db[\"conversations\"]\n\ndef chatbot_with_memory(session_id, user_message):\n    \"\"\"Chatbot RAG với conversation history.\"\"\"\n\n    # Lấy conversation history\n    history = list(conversations.find(\n        {\"session_id\": session_id},\n        {\"_id\": 0, \"role\": 1, \"content\": 1}\n    ).sort(\"timestamp\", 1).limit(10))\n\n    # Retrieve relevant context\n    relevant_docs = vector_search(user_message, top_k=3)\n\n    context = \"\n\n---\n\n\".join([\n        f\"[{doc.get('title', 'Unknown')}]\n{doc['text']}\"\n        for doc in relevant_docs\n    ])\n\n    # Xây dựng system prompt\n    system_prompt = f\"\"\"Bạn là trợ lý AI thông minh của công ty.\nTrả lời dựa trên kiến thức được cung cấp. Nếu không biết, hãy thành thật.\n\n=== KIẾN THỨC LIÊN QUAN ===\n{context}\"\"\"\n\n    # Format messages với history\n    messages = []\n    for msg in history:\n        messages.append({\"role\": msg[\"role\"], \"content\": msg[\"content\"]})\n    messages.append({\"role\": \"user\", \"content\": user_message})\n\n    # Gọi Claude\n    response = claude_client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=1024,\n        system=system_prompt,\n        messages=messages\n    )\n\n    assistant_reply = response.content[0].text\n\n    # Lưu vào conversation history\n    import datetime\n    conversations.insert_many([\n        {\n            \"session_id\": session_id,\n            \"role\": \"user\",\n            \"content\": user_message,\n            \"timestamp\": datetime.datetime.utcnow()\n        },\n        {\n            \"session_id\": session_id,\n            \"role\": \"assistant\",\n            \"content\": assistant_reply,\n            \"timestamp\": datetime.datetime.utcnow()\n        }\n    ])\n\n    return assistant_reply\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết hợp Vector Search với MongoDB Queries\u003c\/h2\u003e\n\n\u003cp\u003eĐây là điểm mạnh độc đáo của MongoDB — bạn có thể kết hợp semantic search với traditional queries:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef smart_search(query, category=None, date_from=None):\n    \"\"\"\n    Hybrid: Vector search + MongoDB filter.\n    \"\"\"\n    filter_conditions = {}\n\n    if category:\n        filter_conditions[\"category\"] = {\"$eq\": category}\n\n    if date_from:\n        filter_conditions[\"created_at\"] = {\"$gte\": date_from}\n\n    results = vector_search(\n        query=query,\n        top_k=5,\n        filter_query=filter_conditions if filter_conditions else None\n    )\n\n    return results\n\n# Ví dụ: Tìm tài liệu kỹ thuật từ tháng 1\/2024 trở đi\nimport datetime\ntech_docs = smart_search(\n    query=\"Cách cài đặt API?\",\n    category=\"technical\",\n    date_from=datetime.datetime(2024, 1, 1)\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ thực tế: Customer Support Chatbot\u003c\/h2\u003e\n\n\u003cp\u003eHãy xây dựng complete chatbot hỗ trợ khách hàng:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Step 1: Index product knowledge base\nproduct_kb = [\n    {\n        \"source_id\": \"product-001\",\n        \"title\": \"Hướng dẫn cài đặt\",\n        \"text\": \"Để cài đặt sản phẩm, tải file installer từ trang chủ...\",\n        \"category\": \"installation\",\n        \"version\": \"2.0\"\n    },\n    {\n        \"source_id\": \"product-002\",\n        \"title\": \"Xử lý lỗi phổ biến\",\n        \"text\": \"Lỗi 404: Kiểm tra lại đường dẫn API...\",\n        \"category\": \"troubleshooting\",\n        \"version\": \"2.0\"\n    }\n]\n\nembed_and_store(product_kb)\n\n# Step 2: Test chatbot\nsession = \"user_12345\"\nreply1 = chatbot_with_memory(session, \"Làm thế nào để cài đặt sản phẩm?\")\nprint(f\"Bot: {reply1}\")\n\nreply2 = chatbot_with_memory(session, \"Nếu gặp lỗi thì sao?\")\nprint(f\"Bot: {reply2}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePerformance và Scaling\u003c\/h2\u003e\n\n\u003ch3\u003eIndex configuration\u003c\/h3\u003e\n\u003cp\u003eTăng \u003ccode\u003enumCandidates\u003c\/code\u003e để cải thiện recall, nhưng sẽ tăng latency. Khuyến nghị: \u003ccode\u003enumCandidates = top_k * 10\u003c\/code\u003e.\u003c\/p\u003e\n\n\u003ch3\u003eCompound index\u003c\/h3\u003e\n\u003cp\u003eTạo compound index trên các fields thường dùng để filter, kết hợp với vector search sẽ nhanh hơn đáng kể.\u003c\/p\u003e\n\n\u003ch3\u003eBatch embedding\u003c\/h3\u003e\n\u003cp\u003eLuôn embed theo batch thay vì từng document một để giảm API calls và tăng throughput.\u003c\/p\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eMongoDB Atlas Vector Search + Claude là combo mạnh mẽ cho những team đã dùng MongoDB. Không cần học thêm infrastructure mới, chỉ cần thêm embedding pipeline và bạn có ngay hệ thống RAG production-ready.\u003c\/p\u003e\n\n\u003cp\u003eTiếp theo, khám phá \u003ca href=\"\/en\/collections\/nang-cao\"\u003eLlamaIndex + Claude\u003c\/a\u003e để xây dựng RAG pipeline với nhiều tính năng nâng cao hơn, hoặc đọc về \u003ca href=\"\/en\/collections\/nang-cao\"\u003eRAG với Pinecone\u003c\/a\u003e nếu bạn cần managed vector database chuyên dụng.\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=\"\/en\/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=\"\/en\/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=\"\/en\/products\/llamaindex-claude-rag-pipeline-c%C6%A1-b%E1%BA%A3n\"\u003eLlamaIndex + Claude — RAG pipeline cơ bản\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/fine-tuning-alternatives-khi-nao-c%E1%BA%A7n-tuy-ch%E1%BB%89nh-claude\"\u003eFine-tuning Alternatives — Khi nào cần tùy chỉnh Claude\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-engineering-thi%E1%BA%BFt-k%E1%BA%BF-ki%E1%BA%BFn-truc-h%E1%BB%87-th%E1%BB%91ng\"\u003eClaude cho Engineering: Thiết kế kiến trúc hệ thống\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721902604500,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/rag-v_i-mongodb-claude-xay-chatbot-co-ki_n-th_c_685bde6d-4ae7-4e75-80c4-94ec27bf4ffa.jpg?v=1774521789","url":"https:\/\/claude.vn\/en\/products\/rag-v%e1%bb%9bi-mongodb-claude-xay-chatbot-co-ki%e1%ba%bfn-th%e1%bb%a9c","provider":"CLAUDE.VN","version":"1.0","type":"link"}