{"product_id":"upload-pdf-len-claude-api-dọc-va-tom-tắt-tai-liệu","title":"Upload PDF lên Claude API — Đọc và tóm tắt tài liệu","description":"\n\u003cp\u003eClaude có thể đọc và hiểu PDF — không phải chỉ extract text thô, mà thực sự \u003cem\u003ehiểu nội dung\u003c\/em\u003e, tables, headings, và cấu trúc tài liệu. Đây là tính năng cực kỳ hữu ích cho các ứng dụng xử lý hợp đồng, báo cáo, nghiên cứu, và tài liệu kỹ thuật.\u003c\/p\u003e\n\n\u003ch2\u003eGiới hạn và yêu cầu\u003c\/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003eKích thước PDF tối đa: \u003cstrong\u003e32 MB\u003c\/strong\u003e\n\u003c\/li\u003e\n  \u003cli\u003eSố trang tối đa: \u003cstrong\u003e100 trang\u003c\/strong\u003e\n\u003c\/li\u003e\n  \u003cli\u003eFormat gửi: Base64-encoded string\u003c\/li\u003e\n  \u003cli\u003eClaude đọc được cả text-based PDF và scanned PDF (với OCR)\u003c\/li\u003e\n  \u003cli\u003eHỗ trợ từ claude-3-5-sonnet-20241022 trở lên\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eBước 1: Đọc PDF và encode Base64\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nimport base64\nfrom pathlib import Path\n\nclient = anthropic.Anthropic()\n\ndef load_pdf_as_base64(pdf_path: str) -\u0026gt; str:\n    \"\"\"Đọc file PDF và chuyển sang Base64.\"\"\"\n    with open(pdf_path, \"rb\") as f:\n        pdf_data = f.read()\n    return base64.standard_b64encode(pdf_data).decode(\"utf-8\")\n\n# Đọc PDF\npdf_base64 = load_pdf_as_base64(\"bao_cao_tai_chinh.pdf\")\nprint(f\"PDF size: {len(pdf_base64)} bytes (base64)\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBước 2: Gửi PDF lên API\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef analyze_pdf(pdf_path: str, question: str) -\u0026gt; str:\n    \"\"\"Gửi PDF lên Claude và đặt câu hỏi về nó.\"\"\"\n    pdf_base64 = load_pdf_as_base64(pdf_path)\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                },\n                {\n                    \"type\": \"text\",\n                    \"text\": question\n                }\n            ],\n        }],\n    )\n\n    return response.content[0].text\n\n# Ví dụ sử dụng\nanswer = analyze_pdf(\n    \"hop_dong_thue_nha.pdf\",\n    \"Tóm tắt các điều khoản quan trọng nhất trong hợp đồng này bằng tiếng Việt.\"\n)\nprint(answer)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTóm tắt tài liệu dài\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef summarize_pdf(pdf_path: str, summary_type: str = \"general\") -\u0026gt; dict:\n    \"\"\"\n    Tóm tắt PDF với nhiều loại khác nhau.\n\n    summary_type:\n    - \"general\": Tóm tắt tổng quan\n    - \"executive\": Executive summary cho lãnh đạo\n    - \"technical\": Tập trung vào chi tiết kỹ thuật\n    - \"action_items\": Trích xuất action items và deadlines\n    \"\"\"\n    pdf_base64 = load_pdf_as_base64(pdf_path)\n\n    prompts = {\n        \"general\": \"\"\"Tóm tắt tài liệu này bằng tiếng Việt. Bao gồm:\n1. Mục đích chính của tài liệu\n2. Các điểm quan trọng (tối đa 5 điểm)\n3. Kết luận hoặc khuyến nghị\"\"\",\n\n        \"executive\": \"\"\"Viết executive summary bằng tiếng Việt cho tài liệu này.\nGiả sử người đọc là CEO với thời gian hạn chế. Tối đa 150 từ.\nBao gồm: vấn đề, giải pháp đề xuất, và tác động kinh doanh.\"\"\",\n\n        \"technical\": \"\"\"Trích xuất tất cả thông tin kỹ thuật quan trọng từ tài liệu.\nBao gồm: specifications, requirements, constraints, và technical decisions.\"\"\",\n\n        \"action_items\": \"\"\"Liệt kê tất cả action items, tasks, và deadlines từ tài liệu.\nFormat: danh sách có cấu trúc với người phụ trách (nếu có) và deadline.\"\"\",\n    }\n\n    prompt = prompts.get(summary_type, prompts[\"general\"])\n\n    response = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=1500,\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                },\n                {\"type\": \"text\", \"text\": prompt}\n            ],\n        }],\n    )\n\n    return {\n        \"file\": pdf_path,\n        \"type\": summary_type,\n        \"summary\": response.content[0].text,\n        \"tokens_used\": response.usage.input_tokens + response.usage.output_tokens,\n    }\n\n# Test\nresult = summarize_pdf(\"annual_report_2024.pdf\", \"executive\")\nprint(f\"Summary ({result['tokens_used']} tokens):\")\nprint(result[\"summary\"])\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTrích xuất thông tin có cấu trúc\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport json\n\ndef extract_structured_data(pdf_path: str, schema: dict) -\u0026gt; dict:\n    \"\"\"\n    Trích xuất thông tin cụ thể từ PDF theo schema định nghĩa sẵn.\n    \"\"\"\n    pdf_base64 = load_pdf_as_base64(pdf_path)\n\n    schema_str = json.dumps(schema, ensure_ascii=False, indent=2)\n\n    prompt = f\"\"\"Đọc tài liệu PDF và trích xuất thông tin theo schema JSON sau:\n\n{schema_str}\n\nTrả về JSON hợp lệ theo đúng schema. Nếu thông tin không có trong tài liệu, dùng null.\nChỉ trả về JSON, không có text khác.\"\"\"\n\n    response = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=2000,\n        messages=[\n            {\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                    },\n                    {\"type\": \"text\", \"text\": prompt}\n                ],\n            },\n            # Prefill để đảm bảo JSON output\n            {\"role\": \"assistant\", \"content\": \"{\"}\n        ],\n        temperature=0.0,\n    )\n\n    json_str = \"{\" + response.content[0].text\n    return json.loads(json_str)\n\n# Ví dụ: Extract thông tin hợp đồng\ncontract_schema = {\n    \"contract_type\": \"string\",\n    \"parties\": {\n        \"party_a\": {\"name\": \"string\", \"address\": \"string\"},\n        \"party_b\": {\"name\": \"string\", \"address\": \"string\"}\n    },\n    \"effective_date\": \"string (YYYY-MM-DD)\",\n    \"end_date\": \"string (YYYY-MM-DD)\",\n    \"total_value\": \"number\",\n    \"currency\": \"string\",\n    \"key_terms\": [\"string\"],\n    \"penalty_clauses\": \"string or null\"\n}\n\ndata = extract_structured_data(\"hop_dong.pdf\", contract_schema)\nprint(f\"Contract type: {data['contract_type']}\")\nprint(f\"Value: {data['total_value']} {data['currency']}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXử lý nhiều PDF cùng lúc\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom concurrent.futures import ThreadPoolExecutor\nfrom pathlib import Path\n\ndef batch_summarize_pdfs(pdf_folder: str, max_workers: int = 3) -\u0026gt; list:\n    \"\"\"Tóm tắt nhiều PDFs song song.\"\"\"\n    pdf_files = list(Path(pdf_folder).glob(\"*.pdf\"))\n    print(f\"Tìm thấy {len(pdf_files)} files PDF\")\n\n    def process_one(pdf_path):\n        try:\n            result = summarize_pdf(str(pdf_path), \"general\")\n            return {\"file\": pdf_path.name, \"status\": \"success\", \"summary\": result[\"summary\"]}\n        except Exception as e:\n            return {\"file\": pdf_path.name, \"status\": \"error\", \"error\": str(e)}\n\n    with ThreadPoolExecutor(max_workers=max_workers) as executor:\n        results = list(executor.map(process_one, pdf_files))\n\n    success = sum(1 for r in results if r[\"status\"] == \"success\")\n    print(f\"Hoàn thành: {success}\/{len(pdf_files)} files\")\n    return results\n\n# Tóm tắt tất cả PDFs trong folder\nresults = batch_summarize_pdfs(\".\/reports\/\", max_workers=3)\nfor r in results:\n    print(f\"\n{r['file']}: {r['status']}\")\n    if r[\"status\"] == \"success\":\n        print(r[\"summary\"][:200] + \"...\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eQ\u0026amp;A với tài liệu\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eclass PDFChatbot:\n    \"\"\"Chatbot có thể trả lời câu hỏi về một PDF.\"\"\"\n\n    def __init__(self, pdf_path: str):\n        self.pdf_base64 = load_pdf_as_base64(pdf_path)\n        self.pdf_name = Path(pdf_path).name\n        self.conversation_history = []\n        print(f\"Đã load PDF: {self.pdf_name}\")\n\n    def ask(self, question: str) -\u0026gt; str:\n        # Thêm câu hỏi vào lịch sử\n        self.conversation_history.append({\n            \"role\": \"user\",\n            \"content\": question\n        })\n\n        # Tạo messages với PDF ở đầu conversation\n        messages = [\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"document\",\n                        \"source\": {\n                            \"type\": \"base64\",\n                            \"media_type\": \"application\/pdf\",\n                            \"data\": self.pdf_base64,\n                        },\n                        \"title\": self.pdf_name,\n                    },\n                    {\"type\": \"text\", \"text\": \"Đây là tài liệu bạn sẽ dùng để trả lời câu hỏi của tôi.\"}\n                ],\n            },\n            {\"role\": \"assistant\", \"content\": \"Tôi đã đọc tài liệu. Bạn muốn hỏi gì?\"},\n            # Thêm lịch sử conversation\n            *self.conversation_history,\n        ]\n\n        response = client.messages.create(\n            model=\"claude-opus-4-5\",\n            max_tokens=1000,\n            system=\"Trả lời câu hỏi dựa trên tài liệu. Nếu thông tin không có trong tài liệu, nói rõ điều đó.\",\n            messages=messages,\n        )\n\n        answer = response.content[0].text\n        self.conversation_history.append({\"role\": \"assistant\", \"content\": answer})\n        return answer\n\n# Sử dụng\nchatbot = PDFChatbot(\"bao_cao_thuong_nien_2024.pdf\")\n\nprint(chatbot.ask(\"Doanh thu năm 2024 là bao nhiêu?\"))\nprint(chatbot.ask(\"So với năm 2023 tăng hay giảm?\"))\nprint(chatbot.ask(\"Những rủi ro nào được đề cập trong báo cáo?\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTips và best practices\u003c\/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eDùng model mạnh:\u003c\/strong\u003e claude-opus-4-5 hiểu tài liệu phức tạp tốt hơn haiku đáng kể\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCompress PDF trước:\u003c\/strong\u003e Nếu PDF lớn, compress xuống dưới 32MB trước khi gửi\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eChia nhỏ tài liệu dài:\u003c\/strong\u003e PDF trên 100 trang cần chia thành nhiều phần\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCung cấp context:\u003c\/strong\u003e Nói rõ tài liệu là gì (hợp đồng, báo cáo, v.v.) để Claude hiểu đúng format\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCache PDF:\u003c\/strong\u003e Nếu hỏi nhiều câu về cùng một PDF, dùng Prompt Caching để tránh gửi lại base64 mỗi lần\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eXử lý PDF là một trong những use cases phổ biến nhất của Claude trong doanh nghiệp. Kết hợp với \u003ca href=\"\/en\/collections\/nang-cao\"\u003ePrompt Caching\u003c\/a\u003e để tối ưu chi phí khi làm việc với tài liệu dài.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721831497940,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/upload-pdf-len-claude-api-d_c-va-tom-t_t-tai-li_u.jpg?v=1774507570","url":"https:\/\/claude.vn\/en\/products\/upload-pdf-len-claude-api-d%e1%bb%8dc-va-tom-t%e1%ba%aft-tai-li%e1%bb%87u","provider":"CLAUDE.VN","version":"1.0","type":"link"}