{"product_id":"rag-agent-với-langchain-pinecone-claude","title":"RAG Agent với LangChain + Pinecone + Claude","description":"\n\u003cp\u003e\u003cstrong\u003eLangChain\u003c\/strong\u003e là framework phổ biến nhất cho LLM applications, cung cấp abstractions mạnh mẽ để xây dựng RAG pipelines, agents, và chains. Kết hợp với \u003cstrong\u003ePinecone\u003c\/strong\u003e và \u003cstrong\u003eClaude\u003c\/strong\u003e, bạn có thể xây dựng RAG agent production-ready với \u003cstrong\u003eLangChain Expression Language (LCEL)\u003c\/strong\u003e — cú pháp pipe hiện đại và composable.\u003c\/p\u003e\n\n\u003ch2\u003eLangChain Expression Language (LCEL)\u003c\/h2\u003e\n\n\u003cp\u003eLCEL cho phép chain các components bằng toán tử \u003ccode\u003e|\u003c\/code\u003e (pipe), tương tự Unix pipes:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003echain = retriever | prompt_template | llm | output_parser\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eMỗi bước nhận output của bước trước làm input. Điều này tạo ra code dễ đọc, composable, và có built-in support cho streaming và async.\u003c\/p\u003e\n\n\u003ch2\u003eCài đặt\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install langchain langchain-anthropic langchain-pinecone langchain-voyageai pinecone-client\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_voyageai import VoyageAIEmbeddings\nfrom langchain_pinecone import PineconeVectorStore\nfrom pinecone import Pinecone, ServerlessSpec\n\n# Khởi tạo LLM\nllm = ChatAnthropic(\n    model=\"claude-opus-4-5\",\n    anthropic_api_key=os.environ.get(\"ANTHROPIC_API_KEY\"),\n    max_tokens=2048\n)\n\n# Khởi tạo embeddings\nembeddings = VoyageAIEmbeddings(\n    voyage_api_key=os.environ.get(\"VOYAGE_API_KEY\"),\n    model=\"voyage-3\"\n)\n\n# Khởi tạo Pinecone\npc = Pinecone(api_key=os.environ.get(\"PINECONE_API_KEY\"))\n\nprint(\"LangChain + Pinecone + Claude ready\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo Pinecone Vector Store\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom langchain_core.documents import Document as LCDocument\n\n# Tạo Pinecone index\nindex_name = \"langchain-rag-demo\"\nif index_name not in pc.list_indexes().names():\n    pc.create_index(\n        name=index_name,\n        dimension=1024,\n        metric=\"cosine\",\n        spec=ServerlessSpec(cloud=\"aws\", region=\"us-east-1\")\n    )\n\n# Tạo Vector Store từ documents\ndef create_vector_store(documents):\n    \"\"\"\n    documents: list of LangChain Document objects\n\n    LangChain Document có:\n    - page_content: nội dung text\n    - metadata: dict với thông tin bổ sung\n    \"\"\"\n    vector_store = PineconeVectorStore.from_documents(\n        documents=documents,\n        embedding=embeddings,\n        index_name=index_name,\n        namespace=\"default\"\n    )\n    return vector_store\n\n# Ví dụ documents\nsample_docs = [\n    LCDocument(\n        page_content=\"Claude API hỗ trợ streaming responses để cải thiện UX. \"\n                    \"Dùng client.messages.stream() để nhận text từng token.\",\n        metadata={\"source\": \"api-docs\", \"category\": \"technical\", \"version\": \"2024\"}\n    ),\n    LCDocument(\n        page_content=\"Rate limits của Claude API: Tier 1 = 50 RPM, Tier 4 = 4000 RPM. \"\n                    \"Upgrade tier bằng cách nạp credit hoặc đạt usage milestones.\",\n        metadata={\"source\": \"api-docs\", \"category\": \"limits\", \"version\": \"2024\"}\n    ),\n    LCDocument(\n        page_content=\"Claude có context window 200K tokens. Đây là một trong những \"\n                    \"context window lớn nhất trong các LLM thương mại hiện tại.\",\n        metadata={\"source\": \"model-docs\", \"category\": \"capabilities\", \"version\": \"2024\"}\n    ),\n    LCDocument(\n        page_content=\"Function calling (tool use) cho phép Claude gọi external APIs. \"\n                    \"Định nghĩa tools trong parameter 'tools', Claude tự quyết định khi nào dùng.\",\n        metadata={\"source\": \"api-docs\", \"category\": \"features\", \"version\": \"2024\"}\n    )\n]\n\nvector_store = create_vector_store(sample_docs)\nprint(\"Vector store created with sample documents\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXây dựng RAG Chain với LCEL\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.runnables import RunnablePassthrough\n\n# Retriever từ vector store\nretriever = vector_store.as_retriever(\n    search_type=\"similarity\",\n    search_kwargs={\"k\": 4}\n)\n\n# Prompt template\nrag_prompt = ChatPromptTemplate.from_template(\"\"\"Bạn là AI assistant hữu ích.\nTrả lời câu hỏi dựa trên context được cung cấp.\nNếu context không đủ, hãy thành thật nói rõ.\n\nContext:\n{context}\n\nCâu hỏi: {question}\n\nTrả lời:\"\"\")\n\ndef format_docs(docs):\n    \"\"\"Format retrieved documents thành string.\"\"\"\n    return \"\n\n---\n\n\".join([\n        f\"[{doc.metadata.get('source', 'unknown')}]\n{doc.page_content}\"\n        for doc in docs\n    ])\n\n# Xây dựng RAG chain với LCEL\nrag_chain = (\n    {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n    | rag_prompt\n    | llm\n    | StrOutputParser()\n)\n\n# Chạy chain\nresponse = rag_chain.invoke(\"Claude có context window bao nhiêu tokens?\")\nprint(f\"Answer: {response}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eStreaming với LCEL\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Stream response từng token\nprint(\"Streaming response:\")\nfor chunk in rag_chain.stream(\"Claude API hỗ trợ streaming không?\"):\n    print(chunk, end=\"\", flush=True)\nprint()  # Newline\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eRAG Agent với Tools\u003c\/h2\u003e\n\n\u003cp\u003eNâng cấp từ RAG chain lên RAG Agent — có thể quyết định khi nào cần retrieve:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom langchain.agents import AgentExecutor, create_tool_calling_agent\nfrom langchain_core.tools import tool\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\n# Tạo RAG tool từ retriever\n@tool\ndef search_knowledge_base(query: str) -\u0026gt; str:\n    \"\"\"\n    Tìm kiếm thông tin trong knowledge base về Claude API và tài liệu kỹ thuật.\n    Dùng khi cần tra cứu tính năng, giới hạn, hoặc cách sử dụng Claude.\n    \"\"\"\n    docs = retriever.invoke(query)\n    return format_docs(docs)\n\n@tool\ndef calculate(expression: str) -\u0026gt; str:\n    \"\"\"\n    Tính toán biểu thức toán học đơn giản.\n    Ví dụ: '2 + 2', '100 * 0.15', '50000 \/ 12'\n    \"\"\"\n    try:\n        result = eval(expression, {\"__builtins__\": {}})\n        return f\"Kết quả: {result}\"\n    except Exception as e:\n        return f\"Lỗi: {str(e)}\"\n\n# Agent tools\nagent_tools = [search_knowledge_base, calculate]\n\n# Agent prompt\nagent_prompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"\"\"Bạn là AI assistant thông minh.\n    Dùng tools để trả lời câu hỏi chính xác nhất có thể.\n    Luôn trả lời bằng tiếng Việt.\"\"\"),\n    MessagesPlaceholder(variable_name=\"chat_history\"),\n    (\"human\", \"{input}\"),\n    MessagesPlaceholder(variable_name=\"agent_scratchpad\"),\n])\n\n# Tạo agent\nagent = create_tool_calling_agent(llm, agent_tools, agent_prompt)\nagent_executor = AgentExecutor(\n    agent=agent,\n    tools=agent_tools,\n    verbose=True,\n    max_iterations=5\n)\n\n# Chạy agent\nresult = agent_executor.invoke({\n    \"input\": \"Rate limit của Claude Tier 1 là bao nhiêu? \"\n             \"Nếu muốn gọi 10,000 requests\/ngày thì cần tier mấy?\",\n    \"chat_history\": []\n})\nprint(f\"\nFinal answer: {result['output']}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eConversation History với Memory\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom langchain_core.messages import HumanMessage, AIMessage\n\nclass ConversationalRAGAgent:\n    \"\"\"RAG Agent với conversation memory.\"\"\"\n\n    def __init__(self, agent_executor):\n        self.agent_executor = agent_executor\n        self.chat_history = []\n\n    def chat(self, user_input):\n        \"\"\"Chat với memory.\"\"\"\n        result = self.agent_executor.invoke({\n            \"input\": user_input,\n            \"chat_history\": self.chat_history\n        })\n\n        # Cập nhật history\n        self.chat_history.extend([\n            HumanMessage(content=user_input),\n            AIMessage(content=result[\"output\"])\n        ])\n\n        return result[\"output\"]\n\n    def reset(self):\n        \"\"\"Reset conversation.\"\"\"\n        self.chat_history = []\n\n# Tạo conversational agent\nconv_agent = ConversationalRAGAgent(agent_executor)\n\n# Multi-turn conversation\nresponses = [\n    conv_agent.chat(\"Claude API rate limit là bao nhiêu?\"),\n    conv_agent.chat(\"Tier 4 thì bao nhiêu?\"),  # Nhớ context \"rate limit\"\n    conv_agent.chat(\"Nếu gọi 50 requests\/phút thì đủ dùng tier 1 không?\")\n]\n\nfor r in responses:\n    print(f\"\n{r}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eProduction Setup: Async và Caching\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom langchain_core.caches import InMemoryCache\nfrom langchain.globals import set_llm_cache\nimport asyncio\n\n# Bật cache để tránh gọi API lặp lại cho cùng query\nset_llm_cache(InMemoryCache())\n\n# Async invocation cho throughput cao\nasync def batch_queries(questions):\n    \"\"\"Query nhiều câu hỏi song song.\"\"\"\n    tasks = [rag_chain.ainvoke(q) for q in questions]\n    results = await asyncio.gather(*tasks)\n    return results\n\nquestions = [\n    \"Claude context window là bao nhiêu?\",\n    \"Streaming response hoạt động như thế nào?\",\n    \"Tool use trong Claude là gì?\"\n]\n\nanswers = asyncio.run(batch_queries(questions))\nfor q, a in zip(questions, answers):\n    print(f\"Q: {q}\")\n    print(f\"A: {a[:200]}...\")\n    print()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eLangChain + Pinecone + Claude là stack production-proven cho RAG applications. LCEL giúp code clean và composable, Pinecone đảm bảo scale, và Claude cung cấp AI quality cao nhất. Pipeline này phù hợp cho chatbots, Q\u0026amp;A systems, và knowledge management tools.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Khám phá \u003ca href=\"\/en\/collections\/nang-cao\"\u003eMulti-Modal RAG với LlamaIndex + Claude Vision\u003c\/a\u003e để xử lý cả hình ảnh trong RAG, hoặc đọc về \u003ca href=\"\/en\/collections\/nang-cao\"\u003eRouter Query Engine\u003c\/a\u003e cho intelligent query routing.\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\/context-compaction-t%E1%BB%B1-d%E1%BB%99ng-nen-context-cho-conversations-dai\"\u003eContext Compaction — Tự động nén context cho conversations dài\u003c\/a\u003e\u003c\/li\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\/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=\"\/en\/products\/autonomous-coding-agent-ai-t%E1%BB%B1-vi%E1%BA%BFt-code-t%E1%BB%AB-spec\"\u003eAutonomous Coding Agent — AI tự viết code từ spec\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/building-effective-agents-v%E1%BB%9Bi-claude-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-ki%E1%BA%BFn-truc\"\u003eBuilding Effective Agents với Claude — Hướng dẫn kiến trúc\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721907781844,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/rag-agent-v_i-langchain-pinecone-claude_b631f2c6-9b10-417b-aab3-543b27c8b4cc.jpg?v=1774521816","url":"https:\/\/claude.vn\/en\/products\/rag-agent-v%e1%bb%9bi-langchain-pinecone-claude","provider":"CLAUDE.VN","version":"1.0","type":"link"}