{"product_id":"llamaindex-claude-rag-pipeline-cơ-bản","title":"LlamaIndex + Claude — RAG pipeline cơ bản","description":"\n\u003cp\u003e\u003cstrong\u003eLlamaIndex\u003c\/strong\u003e là framework mã nguồn mở chuyên về data ingestion và RAG (Retrieval-Augmented Generation). Kết hợp với \u003cstrong\u003eClaude\u003c\/strong\u003e, bạn có thể xây dựng pipeline RAG hoàn chỉnh chỉ với vài chục dòng code — từ load documents đến semantic search và generation.\u003c\/p\u003e\n\n\u003cp\u003eBài viết này dành cho người mới bắt đầu với RAG. Bạn sẽ học được cách LlamaIndex hoạt động, cách kết nối với Claude, và cách tạo query engine đầu tiên của mình.\u003c\/p\u003e\n\n\u003ch2\u003eLlamaIndex là gì?\u003c\/h2\u003e\n\n\u003cp\u003eLlamaIndex giải quyết ba vấn đề cốt lõi của RAG:\u003c\/p\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eData Ingestion\u003c\/strong\u003e — Load và parse hàng trăm loại file (PDF, Word, CSV, web pages...)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eIndexing\u003c\/strong\u003e — Chuyển documents thành vector index có thể search\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eQuerying\u003c\/strong\u003e — Tìm kiếm semantic và generate câu trả lời với LLM\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003cp\u003eThay vì tự viết từng bước, LlamaIndex cung cấp abstractions đơn giản để bạn tập trung vào business logic.\u003c\/p\u003e\n\n\u003ch2\u003eCài đặt\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install llama-index llama-index-llms-anthropic llama-index-embeddings-voyageai\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eThiết lập API keys:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nos.environ[\"ANTHROPIC_API_KEY\"] = \"your_api_key\"\nos.environ[\"VOYAGE_API_KEY\"] = \"your_voyage_key\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eCấu hình LlamaIndex với Claude\u003c\/h2\u003e\n\n\u003cp\u003eBước đầu tiên là cấu hình LlamaIndex sử dụng Claude làm LLM và Voyage AI làm embedding model:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import Settings\nfrom llama_index.llms.anthropic import Anthropic\nfrom llama_index.embeddings.voyageai import VoyageEmbedding\n\n# Cấu hình LLM\nSettings.llm = Anthropic(\n    model=\"claude-opus-4-5\",\n    max_tokens=1024\n)\n\n# Cấu hình Embedding model\nSettings.embed_model = VoyageEmbedding(\n    model_name=\"voyage-3\",\n    voyage_api_key=os.environ.get(\"VOYAGE_API_KEY\")\n)\n\n# Cấu hình chunk size\nSettings.chunk_size = 512\nSettings.chunk_overlap = 50\n\nprint(\"LlamaIndex configured with Claude + Voyage AI\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eLoad Documents\u003c\/h2\u003e\n\n\u003cp\u003eLlamaIndex có sẵn nhiều loại loader. Ví dụ đơn giản nhất là load từ thư mục:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import SimpleDirectoryReader\n\n# Load tất cả files trong thư mục\nloader = SimpleDirectoryReader(\".\/data\")\ndocuments = loader.load_data()\n\nprint(f\"Loaded {len(documents)} documents\")\nfor doc in documents[:3]:\n    print(f\"  - {doc.metadata.get('file_name', 'unknown')}: {len(doc.text)} chars\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eHoặc tạo documents thủ công từ text:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import Document\n\ndocuments = [\n    Document(\n        text=\"\"\"Claude là AI assistant của Anthropic, được thiết kế để an toàn và hữu ích.\n        Claude có thể viết code, phân tích dữ liệu, tóm tắt tài liệu, và nhiều tác vụ khác.\n        API của Claude cho phép tích hợp vào ứng dụng của bạn.\"\"\",\n        metadata={\"source\": \"claude_intro\", \"language\": \"vi\"}\n    ),\n    Document(\n        text=\"\"\"Anthropic là công ty AI tập trung vào AI Safety. Được thành lập năm 2021,\n        Anthropic phát triển Claude với mục tiêu tạo ra AI trustworthy và aligned with human values.\n        Văn phòng tại San Francisco, với team hơn 500 người.\"\"\",\n        metadata={\"source\": \"anthropic_about\", \"language\": \"vi\"}\n    )\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo Vector Index\u003c\/h2\u003e\n\n\u003cp\u003eSau khi có documents, tạo VectorStoreIndex — LlamaIndex sẽ tự động chunk, embed, và lưu:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import VectorStoreIndex\n\n# Tạo index từ documents\n# LlamaIndex tự động: chunk -\u0026gt; embed -\u0026gt; store\nindex = VectorStoreIndex.from_documents(\n    documents,\n    show_progress=True\n)\n\nprint(\"Index created successfully!\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eLưu và load index\u003c\/h3\u003e\n\n\u003cp\u003eĐể không phải re-embed mỗi lần chạy, lưu index xuống disk:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import StorageContext, load_index_from_storage\n\n# Lưu index\nindex.storage_context.persist(persist_dir=\".\/index_storage\")\nprint(\"Index saved to disk\")\n\n# Load lại index (lần sau không cần re-embed)\nstorage_context = StorageContext.from_defaults(persist_dir=\".\/index_storage\")\nindex = load_index_from_storage(storage_context)\nprint(\"Index loaded from disk\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eQuery Engine cơ bản\u003c\/h2\u003e\n\n\u003cp\u003eQuery engine là interface để hỏi đáp với documents. LlamaIndex tạo query engine từ index:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import QueryBundle\n\n# Tạo query engine\nquery_engine = index.as_query_engine(\n    similarity_top_k=3,   # Retrieve top 3 chunks\n    response_mode=\"compact\"  # Compact mode gộp context\n)\n\n# Hỏi câu hỏi\nresponse = query_engine.query(\"Claude được tạo ra bởi công ty nào?\")\n\nprint(f\"Câu trả lời: {response.response}\")\nprint(f\"\nNguồn tham khảo:\")\nfor node in response.source_nodes:\n    print(f\"  Score: {node.score:.3f} | {node.metadata.get('source', 'unknown')}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eResponse Modes\u003c\/h2\u003e\n\n\u003cp\u003eLlamaIndex có nhiều response mode khác nhau:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003ecompact\u003c\/strong\u003e — Gộp tất cả context vào một prompt (mặc định, nhanh nhất)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003etree_summarize\u003c\/strong\u003e — Tóm tắt từng chunk rồi tổng hợp (tốt cho tài liệu dài)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003erefine\u003c\/strong\u003e — Tinh chỉnh câu trả lời qua từng chunk (chậm hơn nhưng chính xác)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003esimple_summarize\u003c\/strong\u003e — Gộp toàn bộ context, tóm tắt đơn giản\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cpre\u003e\u003ccode\u003e# So sánh response modes\nfor mode in [\"compact\", \"tree_summarize\", \"refine\"]:\n    engine = index.as_query_engine(\n        similarity_top_k=3,\n        response_mode=mode\n    )\n    response = engine.query(\"Anthropic là gì?\")\n    print(f\"\n[{mode}] {response.response[:200]}...\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eChat Engine — Chatbot với Memory\u003c\/h2\u003e\n\n\u003cp\u003eNgoài query engine, LlamaIndex còn có chat engine để tạo chatbot với conversation history:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.chat_engine import CondensePlusContextChatEngine\n\n# Tạo chat engine\nchat_engine = index.as_chat_engine(\n    chat_mode=\"condense_plus_context\",\n    verbose=True\n)\n\n# Chat với memory\nresponse1 = chat_engine.chat(\"Anthropic là gì?\")\nprint(f\"Bot: {response1.response}\")\n\nresponse2 = chat_engine.chat(\"Họ có bao nhiêu nhân viên?\")\nprint(f\"Bot: {response2.response}\")  # Hiểu \"họ\" là Anthropic\n\n# Reset conversation\nchat_engine.reset()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eStreaming Response\u003c\/h2\u003e\n\n\u003cp\u003eCho UX tốt hơn, bật streaming để hiển thị response từng token:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003estreaming_engine = index.as_query_engine(\n    similarity_top_k=3,\n    streaming=True\n)\n\n# Stream response\nstreaming_response = streaming_engine.query(\"Claude có thể làm gì?\")\nfor text in streaming_response.response_gen:\n    print(text, end=\"\", flush=True)\nprint()  # Newline cuối\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eCustom Prompts\u003c\/h2\u003e\n\n\u003cp\u003eTùy chỉnh system prompt để phù hợp với use case của bạn:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core import PromptTemplate\n\n# Custom QA prompt bằng tiếng Việt\nqa_template = PromptTemplate(\n    \"\"\"Bạn là trợ lý AI hữu ích. Dựa trên thông tin bên dưới,\nhãy trả lời câu hỏi một cách chính xác và ngắn gọn bằng tiếng Việt.\nNếu không tìm thấy câu trả lời trong context, hãy nói \"Tôi không có thông tin về vấn đề này.\"\n\nContext:\n{context_str}\n\nCâu hỏi: {query_str}\nTrả lời:\"\"\"\n)\n\nquery_engine = index.as_query_engine(\n    similarity_top_k=3,\n    text_qa_template=qa_template\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eVới chưa đến 50 dòng code, bạn đã có một RAG pipeline hoàn chỉnh với LlamaIndex + Claude. Framework này xử lý tất cả complexity của RAG (chunking, embedding, retrieval) để bạn tập trung vào điều quan trọng nhất: chất lượng câu trả lời.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Học về \u003ca href=\"\/collections\/nang-cao\"\u003eReAct Agent với LlamaIndex\u003c\/a\u003e để xây dựng AI agent có khả năng lý luận phức tạp, hoặc khám phá \u003ca href=\"\/collections\/nang-cao\"\u003eMulti-Document Agent\u003c\/a\u003e để truy vấn nhiều nguồn dữ liệu cùng lúc.\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\/multi-modal-rag-v%E1%BB%9Bi-llamaindex-claude-vision\"\u003eMulti-Modal RAG với LlamaIndex + Claude Vision\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\/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\/claude-code-toan-t%E1%BA%ADp-l%E1%BA%ADp-trinh-v%E1%BB%9Bi-ai-agent-trong-terminal\"\u003eClaude Code toàn tập — Lập trình với AI agent trong terminal\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-cho-engineering-code-review-t%E1%BB%B1-d%E1%BB%99ng\"\u003eClaude cho Engineering: Code Review tự động\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721902932180,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/llamaindex-claude-rag-pipeline-c_-b_n_9826d392-d747-4d14-952b-3b68e6047801.jpg?v=1774521792","url":"https:\/\/claude.vn\/products\/llamaindex-claude-rag-pipeline-c%c6%a1-b%e1%ba%a3n","provider":"CLAUDE.VN","version":"1.0","type":"link"}