{"product_id":"citations-trich-dẫn-nguồn-chinh-xac-với-claude-api","title":"Citations — Trích dẫn nguồn chính xác với Claude API","description":"\n\u003cp\u003eMột vấn đề cốt lõi của LLM là \u003cem\u003ehallucination\u003c\/em\u003e — tạo ra thông tin không có trong nguồn. Với ứng dụng RAG (Retrieval-Augmented Generation) và document Q\u0026amp;A, người dùng cần biết thông tin đến từ đâu. \u003cstrong\u003eCitations API\u003c\/strong\u003e của Claude giải quyết vấn đề này bằng cách buộc model trích dẫn chính xác từ tài liệu được cung cấp.\u003c\/p\u003e\n\n\u003ch2\u003eCitations API là gì?\u003c\/h2\u003e\n\n\u003cp\u003eKhi bật citations, Claude không chỉ trả lời câu hỏi mà còn \u003cstrong\u003echỉ ra chính xác đoạn văn nào\u003c\/strong\u003e trong tài liệu được dùng để support mỗi claim. Đây là tính năng built-in, không cần prompt engineering phức tạp.\u003c\/p\u003e\n\n\u003cp\u003eƯu điểm:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eNgười dùng có thể verify thông tin trực tiếp từ nguồn\u003c\/li\u003e\n  \u003cli\u003eGiảm hallucination vì Claude biết mình sẽ bị fact-check\u003c\/li\u003e\n  \u003cli\u003eTự động highlight passages liên quan trong tài liệu\u003c\/li\u003e\n  \u003cli\u003eHữu ích cho legal, medical, research applications\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eCấu trúc Document với Citations\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\n# Tài liệu cần analyze\ndocument_text = \"\"\"\nChính sách hoàn trả hàng hóa\n\nĐiều 1: Thời hạn hoàn trả\nKhách hàng có quyền hoàn trả sản phẩm trong vòng 30 ngày kể từ ngày nhận hàng.\nSản phẩm phải còn nguyên vẹn, chưa sử dụng, và còn đầy đủ bao bì gốc.\n\nĐiều 2: Sản phẩm không được hoàn trả\nCác sản phẩm sau không được hoàn trả: đồ ăn uống, sản phẩm vệ sinh cá nhân đã mở,\nphần mềm đã kích hoạt, và các mặt hàng clearance được đánh dấu \"Không hoàn trả\".\n\nĐiều 3: Quy trình hoàn trả\nĐể hoàn trả, khách hàng liên hệ bộ phận CSKH qua hotline 1800-xxxx.\nChúng tôi sẽ gửi label vận chuyển miễn phí trong vòng 24 giờ.\nTiền hoàn trả được xử lý trong 5-7 ngày làm việc.\n\"\"\"\n\n# Gửi document với citations enabled\nresponse = client.messages.create(\n    model=\"claude-opus-4-5\",\n    max_tokens=1024,\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"document\",\n                    \"source\": {\n                        \"type\": \"text\",\n                        \"media_type\": \"text\/plain\",\n                        \"data\": document_text,\n                    },\n                    \"title\": \"Chính sách hoàn trả\",\n                    # Bật citations cho document này\n                    \"citations\": {\"enabled\": True},\n                },\n                {\n                    \"type\": \"text\",\n                    \"text\": \"Tôi mua điện thoại 15 ngày trước và muốn hoàn trả. Tôi có được không? Quy trình như thế nào?\"\n                }\n            ],\n        }\n    ],\n)\n\nprint(response.content)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eParse và hiển thị Citations\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef parse_cited_response(response) -\u0026gt; dict:\n    \"\"\"\n    Parse response có citations thành cấu trúc dễ dùng.\n    \"\"\"\n    result = {\n        \"text_blocks\": [],\n        \"citations\": [],\n        \"full_answer\": \"\",\n    }\n\n    for block in response.content:\n        if block.type == \"text\":\n            result[\"text_blocks\"].append(block.text)\n            result[\"full_answer\"] += block.text\n\n        elif block.type == \"citations\":\n            for citation in block.citations:\n                citation_data = {\n                    \"claim\": citation.cited_text if hasattr(citation, \"cited_text\") else \"\",\n                    \"source_document\": citation.document_title if hasattr(citation, \"document_title\") else \"Unknown\",\n                    \"quote\": citation.quote if hasattr(citation, \"quote\") else \"\",\n                    \"start_char\": getattr(citation, \"start_char_index\", None),\n                    \"end_char\": getattr(citation, \"end_char_index\", None),\n                }\n                result[\"citations\"].append(citation_data)\n\n    return result\n\n# Parse kết quả\nparsed = parse_cited_response(response)\n\nprint(\"=== TRẢ LỜI ===\")\nprint(parsed[\"full_answer\"])\n\nprint(\"\n=== TRÍCH DẪN NGUỒN ===\")\nfor i, citation in enumerate(parsed[\"citations\"], 1):\n    print(f\"\n[{i}] Nguồn: {citation['source_document']}\")\n    print(f\"    Đoạn trích: \"{citation['quote'][:100]}...\"\" if len(citation['quote']) \u0026gt; 100 else f\"    Đoạn trích: \"{citation['quote']}\"\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eRAG với Citations — Nhiều tài liệu\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef rag_with_citations(question: str, documents: list) -\u0026gt; dict:\n    \"\"\"\n    RAG pipeline với citations.\n    documents: list of {\"title\": str, \"content\": str}\n    \"\"\"\n    # Build content list với nhiều documents\n    content = []\n\n    for doc in documents:\n        content.append({\n            \"type\": \"document\",\n            \"source\": {\n                \"type\": \"text\",\n                \"media_type\": \"text\/plain\",\n                \"data\": doc[\"content\"],\n            },\n            \"title\": doc[\"title\"],\n            \"citations\": {\"enabled\": True},\n        })\n\n    content.append({\n        \"type\": \"text\",\n        \"text\": question\n    })\n\n    response = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=2000,\n        system=\"\"\"Trả lời câu hỏi dựa HOÀN TOÀN trên các tài liệu được cung cấp.\nNếu thông tin không có trong tài liệu, nói rõ \"Tôi không tìm thấy thông tin này trong tài liệu.\"\nLuôn trích dẫn nguồn cho mỗi khẳng định.\"\"\",\n        messages=[{\"role\": \"user\", \"content\": content}],\n    )\n\n    return parse_cited_response(response)\n\n# Ví dụ: Knowledge base về sản phẩm\nknowledge_base = [\n    {\n        \"title\": \"Hướng dẫn sử dụng iPhone 16\",\n        \"content\": \"\"\"\niPhone 16 có pin 3.561 mAh, hỗ trợ sạc nhanh 20W và sạc không dây MagSafe 15W.\nCamera chính 48MP với khẩu độ f\/1.6. Chip A18 Bionic với 6 nhân CPU và 5 nhân GPU.\nBộ nhớ RAM 8GB, hỗ trợ nhiều tùy chọn storage từ 128GB đến 512GB.\n\"\"\"\n    },\n    {\n        \"title\": \"Chính sách bảo hành Apple\",\n        \"content\": \"\"\"\nApple Limited Warranty bảo hành 1 năm cho lỗi phần cứng từ nhà sản xuất.\nAppleCare+ gia hạn thêm 2 năm và bao gồm tối đa 2 lần sửa chữa tai nạn mỗi năm.\nPin được bảo hành giữ trên 80% dung lượng trong 1 năm hoặc 500 chu kỳ sạc.\n\"\"\"\n    },\n    {\n        \"title\": \"FAQ Mua hàng\",\n        \"content\": \"\"\"\nChúng tôi có 30 ngày đổi trả không điều kiện cho hàng mới.\nGiao hàng miễn phí cho đơn hàng trên 500.000 VND.\nThanh toán hỗ trợ: tiền mặt, chuyển khoản, thẻ tín dụng, trả góp 0%.\n\"\"\"\n    },\n]\n\nresult = rag_with_citations(\n    \"Pin iPhone 16 có tốt không? Nếu pin hỏng trong 6 tháng thì được bảo hành không?\",\n    knowledge_base\n)\n\nprint(result[\"full_answer\"])\nprint(f\"\nSố citations: {len(result['citations'])}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTích hợp với UI — Highlight nguồn\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef format_answer_with_inline_citations(parsed_response: dict) -\u0026gt; str:\n    \"\"\"\n    Format câu trả lời với inline citation numbers,\n    dùng cho hiển thị trên web.\n    \"\"\"\n    answer = parsed_response[\"full_answer\"]\n    citations = parsed_response[\"citations\"]\n\n    # Thêm footer với danh sách nguồn\n    if citations:\n        answer += \"\n\n---\n**Nguồn tham khảo:**\n\"\n        for i, citation in enumerate(citations, 1):\n            answer += f\"\n[{i}] **{citation['source_document']}**\n\"\n            quote = citation['quote']\n            if len(quote) \u0026gt; 150:\n                quote = quote[:150] + \"...\"\n            answer += f\"    \u0026gt; {quote}\n\"\n\n    return answer\n\ndef generate_html_with_citations(parsed_response: dict) -\u0026gt; str:\n    \"\"\"Tạo HTML với highlighted citations.\"\"\"\n    answer = parsed_response[\"full_answer\"]\n    citations = parsed_response[\"citations\"]\n\n    html = f\"\u003cdiv class=\"answer\"\u003e\u003cp\u003e{answer}\u003c\/p\u003e\u003c\/div\u003e\n\"\n\n    if citations:\n        html += \"\u003cdiv class=\"citations\"\u003e\n\u003ch3\u003eNguồn trích dẫn:\u003c\/h3\u003e\n\u003cul\u003e\n\"\n        for i, citation in enumerate(citations, 1):\n            html += f\"\"\"\u003cli\u003e\n    \u003cstrong\u003e[{i}] {citation['source_document']}\u003c\/strong\u003e\n    \u003cblockquote\u003e{citation['quote'][:200]}\u003c\/blockquote\u003e\n\u003c\/li\u003e\n\"\"\"\n        html += \"\u003c\/ul\u003e\n\u003c\/div\u003e\"\n\n    return html\n\n# Output HTML\nhtml_output = generate_html_with_citations(result)\nprint(html_output[:500])\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePDF với Citations\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport base64\n\ndef pdf_qa_with_citations(pdf_path: str, question: str) -\u0026gt; dict:\n    \"\"\"Q\u0026amp;A trên PDF với citations.\"\"\"\n    with open(pdf_path, \"rb\") as f:\n        pdf_base64 = base64.standard_b64encode(f.read()).decode()\n\n    response = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=2000,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"document\",\n                    \"source\": {\n                        \"type\": \"base64\",\n                        \"media_type\": \"application\/pdf\",\n                        \"data\": pdf_base64,\n                    },\n                    \"title\": pdf_path.split(\"\/\")[-1],\n                    \"citations\": {\"enabled\": True},\n                },\n                {\"type\": \"text\", \"text\": question}\n            ],\n        }],\n    )\n\n    return parse_cited_response(response)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBest Practices\u003c\/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eChunk tài liệu hợp lý:\u003c\/strong\u003e Tài liệu quá dài khó cite chính xác — chia thành sections có tiêu đề rõ ràng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eĐặt tiêu đề document rõ ràng:\u003c\/strong\u003e Field \u003ccode\u003etitle\u003c\/code\u003e xuất hiện trong citations — đặt tên mô tả (\"Điều lệ công ty 2024\" thay vì \"doc1.pdf\")\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSystem prompt nghiêm ngặt:\u003c\/strong\u003e Yêu cầu Claude chỉ dùng thông tin từ tài liệu, không suy đoán thêm\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eVerify citations programmatically:\u003c\/strong\u003e So sánh quote trong citation với text gốc để phát hiện hallucination\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eCitations API biến Claude thành công cụ research và fact-checking đáng tin cậy. Đặc biệt hữu ích cho legal tech, medical information systems, và enterprise knowledge bases. Kết hợp với \u003ca href=\"\/collections\/nang-cao\"\u003eBatch Processing\u003c\/a\u003e để xử lý nhiều documents 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\/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-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\/multi-document-agent-truy-v%E1%BA%A5n-nhi%E1%BB%81u-tai-li%E1%BB%87u-v%E1%BB%9Bi-llamaindex\"\u003eMulti-Document Agent — Truy vấn nhiều tài liệu với LlamaIndex\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/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\u003cli\u003e\u003ca href=\"\/products\/claude-plugins-t%E1%BA%A1o-cowork-plugin-tuy-ch%E1%BB%89nh\"\u003eClaude Plugins: Tạo Cowork Plugin tùy chỉnh\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":66959027961901,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0763\/9531\/5245\/files\/citations-trich-d_n-ngu_n-chinh-xac-v_i-claude-api_9c9f6725-a5ef-4590-8997-e5894533f3b5.jpg?v=1782891838","url":"https:\/\/claudeae.com\/products\/citations-trich-d%e1%ba%abn-ngu%e1%bb%93n-chinh-xac-v%e1%bb%9bi-claude-api","provider":"Claude.vn","version":"1.0","type":"link"}