Cơ bảnHướng dẫnClaude APINguồn: Anthropic

Tìm kiếm Wikipedia với Claude — Research agent đơn giản

Nghe bài viết
00:00

Điểm nổi bật

Nhấn để đến mục tương ứng

  1. 1 Để áp dụng tool use hoạt động như thế nào? hiệu quả, bạn cần nắm rõ: Claude có thể gọi external functions thông qua cơ chế tool use : Bạn định nghĩa tools tên, mô tả — đây là bước quan trọng giúp tối ưu quy trình làm việc với AI trong thực tế.
  2. 2 Về xây dựng wikipedia tools, thực tế cho thấy Ta cần hai tools: search tìm trang và get_content lấy nội dung: # Tool definitions cho Claude API tools "name": "search_wikipedia", "description": "Tìm kiếm bài viết Wikipedia theo từ khóa — đây là con dao hai lưỡi nếu không hiểu rõ giới hạn và điều kiện áp dụng của nó.
  3. 3 Về mặt kỹ thuật, tool execution router yêu cầu: tool_input: """Thực thi tool theo tên và trả về kết quả.""" if tool_name "search_wikipedia": result search_wikipedia querytool_input"query", languagetool_input.get"language", "vi" elif tool_name "get_wikipedia_article": result get_wikipedia_article titletool_input"title", languagetool_input.get"language", "vi", max_charstool_input — cấu trúc code này đã được tối ưu và kiểm chứng qua nhiều dự án production.
  4. 4 Bước thực hành then chốt trong research agent — vòng lặp chính: max_turns5: """ Agent tự động research Wikipedia và trả lời câu hỏi. Args: question: Câu hỏi cần research max_turns: Số vòng lặp tối đa mỗi vòng 1 tool call """ printf" Researching: question" print"" * 50 messages "role": "user" — nắm vững điều này giúp bạn triển khai nhanh hơn và giảm thiểu lỗi thường gặp.
  5. 5 Góc nhìn thực tế về ví dụ output: Researching: Claude AI do công ty nào phát triển? Turn 1 Tool: search_wikipedia Input: "query": "Claude AI Anthropic" Result: "found": true, "exact_match": "Claude AI" — hiệu quả phụ thuộc nhiều vào cách triển khai và ngữ cảnh sử dụng cụ thể.
brown and black bee on brown tree branch during daytime

Một trong những hạn chế của LLM là knowledge cutoff — 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 tìm kiếm Wikipedia thời gian thực. 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.

Tool Use hoạt động như thế nào?

Claude có thể gọi external functions thông qua cơ chế tool use:

  1. Bạn định nghĩa tools (tên, mô tả, parameters)
  2. Claude đọc câu hỏi và quyết định cần dùng tool nào
  3. Claude trả về tool_use block với tool name và arguments
  4. Bạn thực thi function và trả kết quả cho Claude
  5. Claude tổng hợp kết quả thành câu trả lời cuối

Cài đặt

pip install anthropic wikipedia-api
import os
import anthropic
import wikipediaapi

claude = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))

# Wikipedia API với User-Agent (bắt buộc)
wiki = wikipediaapi.Wikipedia(
    language="vi",  # Tiếng Việt
    extract_format=wikipediaapi.ExtractFormat.WIKI,
    user_agent="ResearchAgent/1.0 (your@email.com)"
)

Xây dựng Wikipedia Tools

Ta cần hai tools: search (tìm trang) và get_content (lấy nội dung):

# Tool definitions cho Claude API
tools = [
    {
        "name": "search_wikipedia",
        "description": "Tìm kiếm bài viết Wikipedia theo từ khóa. "
                       "Trả về danh sách tiêu đề bài viết liên quan. "
                       "Dùng khi cần tìm thông tin về một chủ đề.",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "Từ khóa hoặc tên chủ đề cần tìm kiếm"
                },
                "language": {
                    "type": "string",
                    "description": "Ngôn ngữ Wikipedia: 'vi' (tiếng Việt), 'en' (tiếng Anh)",
                    "default": "vi"
                }
            },
            "required": ["query"]
        }
    },
    {
        "name": "get_wikipedia_article",
        "description": "Lấy nội dung đầy đủ của một bài viết Wikipedia theo tiêu đề. "
                       "Trả về text của bài viết, tóm tắt, và các sections. "
                       "Dùng sau khi đã biết tiêu đề bài viết cần đọc.",
        "input_schema": {
            "type": "object",
            "properties": {
                "title": {
                    "type": "string",
                    "description": "Tiêu đề chính xác của bài viết Wikipedia"
                },
                "language": {
                    "type": "string",
                    "description": "Ngôn ngữ: 'vi' hoặc 'en'",
                    "default": "vi"
                },
                "max_chars": {
                    "type": "integer",
                    "description": "Số ký tự tối đa trả về (default: 3000)",
                    "default": 3000
                }
            },
            "required": ["title"]
        }
    }
]

Implement Wikipedia Functions

import wikipediaapi

def search_wikipedia(query, language="vi"):
    """Tìm kiếm Wikipedia và trả về danh sách kết quả."""
    try:
        wiki_lang = wikipediaapi.Wikipedia(
            language=language,
            user_agent="ResearchAgent/1.0"
        )

        # Tìm trang trực tiếp
        page = wiki_lang.page(query)

        if page.exists():
            return {
                "found": True,
                "exact_match": page.title,
                "summary": page.summary[:500],
                "suggestion": f"Dùng get_wikipedia_article('{page.title}') để đọc đầy đủ"
            }
        else:
            # Tìm các trang liên quan
            search_wiki = wikipediaapi.Wikipedia(
                language=language,
                user_agent="ResearchAgent/1.0"
            )
            # Thử tìm với từ khóa khác nhau
            variations = [
                query,
                query.title(),
                query.lower()
            ]

            for var in variations:
                p = search_wiki.page(var)
                if p.exists():
                    return {
                        "found": True,
                        "exact_match": p.title,
                        "summary": p.summary[:300],
                        "suggestion": f"Dùng get_wikipedia_article('{p.title}') để đọc thêm"
                    }

            return {
                "found": False,
                "message": f"Không tìm thấy bài viết về '{query}'. "
                          f"Thử ngôn ngữ khác hoặc từ khóa khác."
            }
    except Exception as e:
        return {"error": str(e)}

def get_wikipedia_article(title, language="vi", max_chars=3000):
    """Lấy nội dung bài viết Wikipedia."""
    try:
        wiki_lang = wikipediaapi.Wikipedia(
            language=language,
            user_agent="ResearchAgent/1.0"
        )

        page = wiki_lang.page(title)

        if not page.exists():
            return {
                "error": f"Không tìm thấy bài '{title}' trên Wikipedia {language}"
            }

        # Lấy các sections chính
        sections = []
        for section in page.sections[:5]:  # 5 sections đầu
            sections.append({
                "title": section.title,
                "content": section.text[:500]
            })

        return {
            "title": page.title,
            "summary": page.summary[:1000],
            "full_text": page.text[:max_chars],
            "url": page.fullurl,
            "sections": sections
        }
    except Exception as e:
        return {"error": str(e)}

Tool Execution Router

import json

def execute_tool(tool_name, tool_input):
    """Thực thi tool theo tên và trả về kết quả."""
    if tool_name == "search_wikipedia":
        result = search_wikipedia(
            query=tool_input["query"],
            language=tool_input.get("language", "vi")
        )
    elif tool_name == "get_wikipedia_article":
        result = get_wikipedia_article(
            title=tool_input["title"],
            language=tool_input.get("language", "vi"),
            max_chars=tool_input.get("max_chars", 3000)
        )
    else:
        result = {"error": f"Unknown tool: {tool_name}"}

    return json.dumps(result, ensure_ascii=False)

Research Agent — Vòng lặp chính

def research_agent(question, max_turns=5):
    """
    Agent tự động research Wikipedia và trả lời câu hỏi.

    Args:
        question: Câu hỏi cần research
        max_turns: Số vòng lặp tối đa (mỗi vòng = 1 tool call)
    """
    print(f"
Researching: {question}")
    print("=" * 50)

    messages = [{"role": "user", "content": question}]

    system_prompt = """Bạn là research assistant thông minh.
    Khi cần thông tin, hãy sử dụng Wikipedia tools để tìm kiếm.
    Luôn verify thông tin trước khi trả lời.
    Trả lời bằng tiếng Việt, rõ ràng và có nguồn trích dẫn."""

    for turn in range(max_turns):
        response = claude.messages.create(
            model="claude-haiku-4-5",
            max_tokens=2048,
            system=system_prompt,
            tools=tools,
            messages=messages
        )

        # Thêm response của Claude vào messages
        messages.append({"role": "assistant", "content": response.content})

        # Kiểm tra stop reason
        if response.stop_reason == "end_turn":
            # Claude đã có câu trả lời cuối
            final_text = ""
            for block in response.content:
                if hasattr(block, "text"):
                    final_text = block.text
            print(f"
Ket qua: {final_text}")
            return final_text

        elif response.stop_reason == "tool_use":
            # Claude muốn dùng tool
            tool_results = []

            for block in response.content:
                if block.type == "tool_use":
                    print(f"
[Turn {turn+1}] Tool: {block.name}")
                    print(f"Input: {json.dumps(block.input, ensure_ascii=False)[:200]}")

                    # Thực thi tool
                    result = execute_tool(block.name, block.input)
                    print(f"Result: {result[:300]}...")

                    tool_results.append({
                        "type": "tool_result",
                        "tool_use_id": block.id,
                        "content": result
                    })

            # Trả kết quả tool về cho Claude
            messages.append({"role": "user", "content": tool_results})

    return "Đã đạt giới hạn số vòng lặp."

Chạy Research Agent

# Test với các câu hỏi khác nhau
questions = [
    "Claude (AI) do công ty nào phát triển?",
    "Thành phố Hà Nội có lịch sử như thế nào?",
    "Artificial intelligence được phát minh khi nào?"
]

for q in questions:
    answer = research_agent(q, max_turns=4)
    print(f"
{'='*60}
")

Ví dụ output

Researching: Claude (AI) do công ty nào phát triển?
==================================================

[Turn 1] Tool: search_wikipedia
Input: {"query": "Claude AI Anthropic"}
Result: {"found": true, "exact_match": "Claude (AI)", ...}

[Turn 2] Tool: get_wikipedia_article
Input: {"title": "Claude (AI)", "language": "vi"}
Result: {"title": "Claude", "summary": "Claude là AI assistant..."}

Ket qua: Claude là AI assistant được phát triển bởi Anthropic,
một công ty AI có trụ sở tại San Francisco, California.
Anthropic được thành lập năm 2021 bởi Dario Amodei, Daniela Amodei,
và các cựu nhân viên OpenAI. Claude được thiết kế với trọng tâm
là an toàn (AI safety) và tính hữu ích.

Mở rộng: Thêm nhiều search tools

Pattern này dễ mở rộng với các tools khác:

  • DuckDuckGo Search — Web search tổng quát
  • arXiv API — Tìm papers khoa học
  • News API — Tin tức mới nhất
  • WolframAlpha — Tính toán và dữ liệu khoa học

Kết luận

Bạ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.

Bước tiếp theo: Khám phá Wolfram Alpha + Claude để thêm khả năng tính toán chính xác, hoặc đọc về ReAct Agent với LlamaIndex cho framework agent phức tạp hơn.


Bài viết liên quan

Tính năng liên quan:Tool UseWikipediaResearchWeb Search

Bai viet co huu ich khong?

Bản quyền thuộc về tác giả. Vui lòng dẫn nguồn khi chia sẻ.

Bình luận (0)
Ảnh đại diện
Đăng nhập để bình luận...
Đăng nhập để bình luận
  • Đang tải bình luận...

Đăng ký nhận bản tin

Nhận bài viết hay nhất về sản phẩm và vận hành, gửi thẳng vào hộp thư của bạn.

Bảo mật thông tin. Hủy đăng ký bất cứ lúc nào. Chính sách bảo mật.