{"product_id":"tim-kiếm-wikipedia-với-claude-research-agent-dơn-giản","title":"Tìm kiếm Wikipedia với Claude — Research agent đơn giản","description":"\n\u003cp\u003eMột trong những hạn chế của LLM là \u003cstrong\u003eknowledge cutoff\u003c\/strong\u003e — model không biết về sự kiện xảy ra sau ngày training. Giải pháp: trang bị cho Claude khả năng \u003cstrong\u003etìm kiếm Wikipedia thời gian thực\u003c\/strong\u003e. Bài viết này hướng dẫn cách xây dựng research agent đơn giản, phù hợp cho người mới bắt đầu với tool use.\u003c\/p\u003e\n\n\u003ch2\u003eTool Use hoạt động như thế nào?\u003c\/h2\u003e\n\n\u003cp\u003eClaude có thể gọi external functions thông qua cơ chế \u003cstrong\u003etool use\u003c\/strong\u003e:\u003c\/p\u003e\n\n\u003col\u003e\n  \u003cli\u003eBạn định nghĩa tools (tên, mô tả, parameters)\u003c\/li\u003e\n  \u003cli\u003eClaude đọc câu hỏi và quyết định cần dùng tool nào\u003c\/li\u003e\n  \u003cli\u003eClaude trả về \u003ccode\u003etool_use\u003c\/code\u003e block với tool name và arguments\u003c\/li\u003e\n  \u003cli\u003eBạn thực thi function và trả kết quả cho Claude\u003c\/li\u003e\n  \u003cli\u003eClaude tổng hợp kết quả thành câu trả lời cuối\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003ch2\u003eCài đặt\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install anthropic wikipedia-api\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nimport anthropic\nimport wikipediaapi\n\nclaude = anthropic.Anthropic(api_key=os.environ.get(\"ANTHROPIC_API_KEY\"))\n\n# Wikipedia API với User-Agent (bắt buộc)\nwiki = wikipediaapi.Wikipedia(\n    language=\"vi\",  # Tiếng Việt\n    extract_format=wikipediaapi.ExtractFormat.WIKI,\n    user_agent=\"ResearchAgent\/1.0 (your@email.com)\"\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXây dựng Wikipedia Tools\u003c\/h2\u003e\n\n\u003cp\u003eTa cần hai tools: search (tìm trang) và get_content (lấy nội dung):\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Tool definitions cho Claude API\ntools = [\n    {\n        \"name\": \"search_wikipedia\",\n        \"description\": \"Tìm kiếm bài viết Wikipedia theo từ khóa. \"\n                       \"Trả về danh sách tiêu đề bài viết liên quan. \"\n                       \"Dùng khi cần tìm thông tin về một chủ đề.\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"query\": {\n                    \"type\": \"string\",\n                    \"description\": \"Từ khóa hoặc tên chủ đề cần tìm kiếm\"\n                },\n                \"language\": {\n                    \"type\": \"string\",\n                    \"description\": \"Ngôn ngữ Wikipedia: 'vi' (tiếng Việt), 'en' (tiếng Anh)\",\n                    \"default\": \"vi\"\n                }\n            },\n            \"required\": [\"query\"]\n        }\n    },\n    {\n        \"name\": \"get_wikipedia_article\",\n        \"description\": \"Lấy nội dung đầy đủ của một bài viết Wikipedia theo tiêu đề. \"\n                       \"Trả về text của bài viết, tóm tắt, và các sections. \"\n                       \"Dùng sau khi đã biết tiêu đề bài viết cần đọc.\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"type\": \"string\",\n                    \"description\": \"Tiêu đề chính xác của bài viết Wikipedia\"\n                },\n                \"language\": {\n                    \"type\": \"string\",\n                    \"description\": \"Ngôn ngữ: 'vi' hoặc 'en'\",\n                    \"default\": \"vi\"\n                },\n                \"max_chars\": {\n                    \"type\": \"integer\",\n                    \"description\": \"Số ký tự tối đa trả về (default: 3000)\",\n                    \"default\": 3000\n                }\n            },\n            \"required\": [\"title\"]\n        }\n    }\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eImplement Wikipedia Functions\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport wikipediaapi\n\ndef search_wikipedia(query, language=\"vi\"):\n    \"\"\"Tìm kiếm Wikipedia và trả về danh sách kết quả.\"\"\"\n    try:\n        wiki_lang = wikipediaapi.Wikipedia(\n            language=language,\n            user_agent=\"ResearchAgent\/1.0\"\n        )\n\n        # Tìm trang trực tiếp\n        page = wiki_lang.page(query)\n\n        if page.exists():\n            return {\n                \"found\": True,\n                \"exact_match\": page.title,\n                \"summary\": page.summary[:500],\n                \"suggestion\": f\"Dùng get_wikipedia_article('{page.title}') để đọc đầy đủ\"\n            }\n        else:\n            # Tìm các trang liên quan\n            search_wiki = wikipediaapi.Wikipedia(\n                language=language,\n                user_agent=\"ResearchAgent\/1.0\"\n            )\n            # Thử tìm với từ khóa khác nhau\n            variations = [\n                query,\n                query.title(),\n                query.lower()\n            ]\n\n            for var in variations:\n                p = search_wiki.page(var)\n                if p.exists():\n                    return {\n                        \"found\": True,\n                        \"exact_match\": p.title,\n                        \"summary\": p.summary[:300],\n                        \"suggestion\": f\"Dùng get_wikipedia_article('{p.title}') để đọc thêm\"\n                    }\n\n            return {\n                \"found\": False,\n                \"message\": f\"Không tìm thấy bài viết về '{query}'. \"\n                          f\"Thử ngôn ngữ khác hoặc từ khóa khác.\"\n            }\n    except Exception as e:\n        return {\"error\": str(e)}\n\ndef get_wikipedia_article(title, language=\"vi\", max_chars=3000):\n    \"\"\"Lấy nội dung bài viết Wikipedia.\"\"\"\n    try:\n        wiki_lang = wikipediaapi.Wikipedia(\n            language=language,\n            user_agent=\"ResearchAgent\/1.0\"\n        )\n\n        page = wiki_lang.page(title)\n\n        if not page.exists():\n            return {\n                \"error\": f\"Không tìm thấy bài '{title}' trên Wikipedia {language}\"\n            }\n\n        # Lấy các sections chính\n        sections = []\n        for section in page.sections[:5]:  # 5 sections đầu\n            sections.append({\n                \"title\": section.title,\n                \"content\": section.text[:500]\n            })\n\n        return {\n            \"title\": page.title,\n            \"summary\": page.summary[:1000],\n            \"full_text\": page.text[:max_chars],\n            \"url\": page.fullurl,\n            \"sections\": sections\n        }\n    except Exception as e:\n        return {\"error\": str(e)}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTool Execution Router\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport json\n\ndef execute_tool(tool_name, tool_input):\n    \"\"\"Thực thi tool theo tên và trả về kết quả.\"\"\"\n    if tool_name == \"search_wikipedia\":\n        result = search_wikipedia(\n            query=tool_input[\"query\"],\n            language=tool_input.get(\"language\", \"vi\")\n        )\n    elif tool_name == \"get_wikipedia_article\":\n        result = get_wikipedia_article(\n            title=tool_input[\"title\"],\n            language=tool_input.get(\"language\", \"vi\"),\n            max_chars=tool_input.get(\"max_chars\", 3000)\n        )\n    else:\n        result = {\"error\": f\"Unknown tool: {tool_name}\"}\n\n    return json.dumps(result, ensure_ascii=False)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eResearch Agent — Vòng lặp chính\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef research_agent(question, max_turns=5):\n    \"\"\"\n    Agent tự động research Wikipedia và trả lời câu hỏi.\n\n    Args:\n        question: Câu hỏi cần research\n        max_turns: Số vòng lặp tối đa (mỗi vòng = 1 tool call)\n    \"\"\"\n    print(f\"\nResearching: {question}\")\n    print(\"=\" * 50)\n\n    messages = [{\"role\": \"user\", \"content\": question}]\n\n    system_prompt = \"\"\"Bạn là research assistant thông minh.\n    Khi cần thông tin, hãy sử dụng Wikipedia tools để tìm kiếm.\n    Luôn verify thông tin trước khi trả lời.\n    Trả lời bằng tiếng Việt, rõ ràng và có nguồn trích dẫn.\"\"\"\n\n    for turn in range(max_turns):\n        response = claude.messages.create(\n            model=\"claude-haiku-4-5\",\n            max_tokens=2048,\n            system=system_prompt,\n            tools=tools,\n            messages=messages\n        )\n\n        # Thêm response của Claude vào messages\n        messages.append({\"role\": \"assistant\", \"content\": response.content})\n\n        # Kiểm tra stop reason\n        if response.stop_reason == \"end_turn\":\n            # Claude đã có câu trả lời cuối\n            final_text = \"\"\n            for block in response.content:\n                if hasattr(block, \"text\"):\n                    final_text = block.text\n            print(f\"\nKet qua: {final_text}\")\n            return final_text\n\n        elif response.stop_reason == \"tool_use\":\n            # Claude muốn dùng tool\n            tool_results = []\n\n            for block in response.content:\n                if block.type == \"tool_use\":\n                    print(f\"\n[Turn {turn+1}] Tool: {block.name}\")\n                    print(f\"Input: {json.dumps(block.input, ensure_ascii=False)[:200]}\")\n\n                    # Thực thi tool\n                    result = execute_tool(block.name, block.input)\n                    print(f\"Result: {result[:300]}...\")\n\n                    tool_results.append({\n                        \"type\": \"tool_result\",\n                        \"tool_use_id\": block.id,\n                        \"content\": result\n                    })\n\n            # Trả kết quả tool về cho Claude\n            messages.append({\"role\": \"user\", \"content\": tool_results})\n\n    return \"Đã đạt giới hạn số vòng lặp.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eChạy Research Agent\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Test với các câu hỏi khác nhau\nquestions = [\n    \"Claude (AI) do công ty nào phát triển?\",\n    \"Thành phố Hà Nội có lịch sử như thế nào?\",\n    \"Artificial intelligence được phát minh khi nào?\"\n]\n\nfor q in questions:\n    answer = research_agent(q, max_turns=4)\n    print(f\"\n{'='*60}\n\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ output\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eResearching: Claude (AI) do công ty nào phát triển?\n==================================================\n\n[Turn 1] Tool: search_wikipedia\nInput: {\"query\": \"Claude AI Anthropic\"}\nResult: {\"found\": true, \"exact_match\": \"Claude (AI)\", ...}\n\n[Turn 2] Tool: get_wikipedia_article\nInput: {\"title\": \"Claude (AI)\", \"language\": \"vi\"}\nResult: {\"title\": \"Claude\", \"summary\": \"Claude là AI assistant...\"}\n\nKet qua: Claude là AI assistant được phát triển bởi Anthropic,\nmột công ty AI có trụ sở tại San Francisco, California.\nAnthropic được thành lập năm 2021 bởi Dario Amodei, Daniela Amodei,\nvà các cựu nhân viên OpenAI. Claude được thiết kế với trọng tâm\nlà an toàn (AI safety) và tính hữu ích.\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMở rộng: Thêm nhiều search tools\u003c\/h2\u003e\n\n\u003cp\u003ePattern này dễ mở rộng với các tools khác:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eDuckDuckGo Search\u003c\/strong\u003e — Web search tổng quát\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003earXiv API\u003c\/strong\u003e — Tìm papers khoa học\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNews API\u003c\/strong\u003e — Tin tức mới nhất\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eWolframAlpha\u003c\/strong\u003e — Tính toán và dữ liệu khoa học\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eBạn đã xây dựng research agent hoàn chỉnh chỉ với ~100 dòng code. Claude tự quyết định khi nào cần search, search gì, và tổng hợp thông tin thành câu trả lời có căn cứ. Đây là pattern cơ bản cho mọi AI agent tương tác với external data.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Khám phá \u003ca href=\"\/en\/collections\/ung-dung\"\u003eWolfram Alpha + Claude\u003c\/a\u003e để thêm khả năng tính toán chính xác, hoặc đọc về \u003ca href=\"\/en\/collections\/nang-cao\"\u003eReAct Agent với LlamaIndex\u003c\/a\u003e cho framework agent phức tạp hơn.\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\/extended-thinking-tool-use-suy-lu%E1%BA%ADn-sau-k%E1%BA%BFt-h%E1%BB%A3p-cong-c%E1%BB%A5\"\u003eExtended Thinking + Tool Use — Suy luận sâu kết hợp công cụ\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/react-agent-v%E1%BB%9Bi-llamaindex-claude-ly-lu%E1%BA%ADn-hanh-d%E1%BB%99ng\"\u003eReAct Agent với LlamaIndex + Claude — Lý luận + Hành động\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/xay-d%E1%BB%B1ng-llm-agent-t%E1%BB%AB-d%E1%BA%A7u-reference-implementation\"\u003eXây dựng LLM Agent từ đầu — Reference Implementation\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-code-vs-github-copilot-vs-cursor-dau-la-ide-ai-t%E1%BB%91t-nh%E1%BA%A5t\"\u003eClaude Code vs GitHub Copilot vs Cursor — Đâu là IDE AI tốt nhất?\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-data-trich-xu%E1%BA%A5t-context-t%E1%BB%AB-datasets\"\u003eClaude cho Data: Trích xuất context từ datasets\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721905881300,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/tim-ki_m-wikipedia-v_i-claude-research-agent-d_n-gi_n.jpg?v=1774521804","url":"https:\/\/claude.vn\/en\/products\/tim-ki%e1%ba%bfm-wikipedia-v%e1%bb%9bi-claude-research-agent-d%c6%a1n-gi%e1%ba%a3n","provider":"CLAUDE.VN","version":"1.0","type":"link"}