Chuyển đến nội dung chính

Bên trong Claude Skills: Mô-đun tùy chỉnh mở rộng Claude

Tìm hiểu cách Claude Skills cho phép người dùng và nhà phát triển tùy chỉnh các mô-đun di động, có thể kết hợp và có thể thực thi mã để nâng cao năng suất trên ứng dụng Claude và tích hợp API.
Đã cập nhật 5 thg 6, 2026  · 8 phút đọc

Gần đây Anthropic đã giới thiệu Claude Skills, một mô-đun có thể tái sử dụng theo từng tác vụ cho phép Claude chỉ tải đúng chuyên môn mà công việc yêu cầu. Thay vì các prompt dài, lặp lại, Skills gói gọn hướng dẫn, script và tài nguyên để Claude có thể tạo đầu ra nhất quán, phù hợp thương hiệu trên ứng dụng Claude, Claude CodeAPI.

Trong hướng dẫn này, chúng ta sẽ xây dựng một “Trình tạo hóa đơn tự động” chuyển bảng chấm công Excel thành hóa đơn sẵn sàng gửi cho khách hàng (DOCX/PDF). Trong quá trình đó, bạn sẽ học cách:

  • Tạo một SKILL.md tối thiểu và tải lên một Skill kèm tài nguyên hỗ trợ.
  • Tiền xử lý dữ liệu như bảng chấm công bằng pandas thành một payload JSON có thể dự đoán.
  • Gọi Skill qua API với vòng lặp sử dụng công cụ an toàn (thẻ bash/text-editor).
  • Thu thập tạo phẩm do Claude tạo (PDF/DOCX)

Cuối cùng, bạn sẽ có một Skill di động có thể tái sử dụng ở bất cứ đâu trong hệ sinh thái Claude.

Claude Skills là gì?

Claude Skills là các mô-đun tác vụ độc lập bao gồm tệp SKILL.md (hướng dẫn), các script tùy chọn và tài nguyên hỗ trợ. Khi tác vụ khớp với mục đích của một Skill, Claude sẽ tải những phần tối thiểu của Skill đó để thực hiện tác vụ hiệu quả. Bạn có thể xem một Skill như một gói chuyên môn có thể gắn phiên bản, chia sẻ và quản trị trên toàn tổ chức.

Các tính năng chính của Claude Skills

Những tính năng cốt lõi của Claude Skills giải thích vì sao chúng nhanh, tái sử dụng được và đáng tin cậy trên toàn hệ sinh thái Claude. Một số điểm chính gồm:

  • Có thể kết hợp: Bạn có thể kết hợp nhiều Skill để chạy quy trình nhiều bước, như làm sạch dữ liệu, phân tích và tạo báo cáo.
  • Di động: Skills tuân theo một định dạng chung, vì vậy cùng một Skill hoạt động nhất quán trên toàn hệ sinh thái Claude.
  • Hiệu quả: Claude chỉ tải các thành phần tối thiểu cần thiết cho tác vụ, giúp tăng tốc độ và độ chính xác.
  • Có thể thực thi mã: Skills có thể thực thi mã trong sandbox an toàn, cho phép các thao tác xác định như tạo tệp, phân tích cú pháp và phân tích.

Khi bạn yêu cầu Claude “tạo một bảng ngân sách Excel với tổng hợp theo tháng”, Claude sẽ đánh giá yêu cầu, quét các Skill sẵn có và chỉ kích hoạt những phần liên quan. Việc kích hoạt hiển thị trong chế độ xem lập luận bên trong ứng dụng Claude. Vì Skills là các thành phần có phiên bản, đội ngũ có thể triển khai cập nhật mà không cần thay đổi prompt ở mọi nơi.

Sử dụng Claude Skills trong toàn hệ sinh thái Claude

Dù bạn đang trò chuyện trong ứng dụng Claude, lập trình trong Claude Code hay tự động hóa quy trình qua Developer API, cùng một Skill có thể được gắn phiên bản một lần, quản lý tập trung và tự động gọi khi tác vụ khớp với mục đích của nó. Điều này mang lại chất lượng nhất quán và thời gian hoàn thành nhanh hơn. Tức là một Skill để tái sử dụng ở mọi nơi.

Trong hướng dẫn này, chúng ta sẽ áp dụng Skill “Trình tạo hóa đơn tự động” trên ứng dụng Claude và API để phân tích tệp Excel và xuất ra hóa đơn sẵn sàng gửi.

Ứng dụng Claude

Claude Skills nằm trong Ứng dụng Claude của bạn và tự động kích hoạt khi yêu cầu khớp với mục đích của chúng. Bạn bật một lần trong Cài đặt, sau đó chỉ cần mô tả kết quả bạn muốn. Claude sẽ tải đúng Skill và hiển thị trong chế độ xem lập luận.

Skill.md với các tài nguyên khác

Nguồn: Claude Blog

Bắt đầu như sau:

  • Đăng nhập hoặc Đăng ký bằng tài khoản Google của bạn và vào phần Cài đặt.
  • Trong mục Capabilities, tìm tab Skills và tải lên một tệp Skill (thường là SKILL.md) có thể dùng trong bất kỳ đoạn chat nào.

Bật Skills

Nguồn: Claude Blog

Lưu ý: Tính năng này chỉ khả dụng cho người dùng Pro, Max, Team và Enterprise.

Bạn cũng có thể tìm danh sách các Skill như algorithmic-art, artifacts-builder, brand-guidelines, canvas-design, internal-comms, mcp-builder, slack-gif-creator, v.v. để thêm vào cuộc trò chuyện với Claude.

Nhấp vào upload skill và tải lên tệp zip chứa tệp SKILL.md. Các yêu cầu tệp như sau.

  • Tệp ZIP bao gồm đúng một tệp SKILL.md ở thư mục gốc

  • SKILL.md chứa tên skill và mô tả được định dạng bằng YAML

Tệp SKILL.md dùng trong hướng dẫn này trông như sau:

name: "auto-invoice-generator-monthly-articles"
description: "Generate monthly invoices for written content from simple line items. Produces a branded PDF or editable DOCX/RTF invoice and, optionally, a one-page timesheet if article titles/links are provided."

Tải lên skills

Khi bạn tải lên Skill, Claude sẽ tự động nhận diện và mở một đoạn chat mới sẵn sàng để dùng.

Đoạn chat mới với skill đã bật

Điều này ảnh hưởng thế nào tới cách dùng trong chat?

  • Bạn không cần “bật” một Skill trong từng cuộc trò chuyện. Khi phù hợp, Claude tự động gọi các Skill đã bật và hiển thị chúng trong chế độ xem lập luận để minh bạch.
  • Tắt một Skill sẽ ngăn nó được xét tới trong bất kỳ đoạn chat nào cho đến khi bạn bật lại.
  • Nếu tổ chức của bạn ghim một bộ Skill chuẩn như mẫu thương hiệu, báo cáo, v.v., giữ chúng ở trạng thái bật sẽ đảm bảo đầu ra nhất quán mỗi lần.

Tiếp theo, tôi đã đưa bảng chấm công của mình và yêu cầu Claude tạo một hóa đơn có thể chỉnh sửa.

Claude tự phát hiện Skill, đọc tệp Excel và trả về một hóa đơn Word có thể chỉnh sửa, có thể xuất ra PDF hoặc Word. Bố cục hóa đơn gọn gàng, số tạm tính và tổng đều chính xác. Nó tuân thủ prompt, và cả tệp DOCX có thể chỉnh sửa lẫn PDF định dạng đều khớp với cài đặt thương hiệu của Skill.

Giờ hãy chạy cùng ví dụ đó bằng API.

Nền tảng nhà phát triển Claude (API)

Bạn cũng có thể truy cập Claude skills qua Claude API. Ở phần này, chúng ta sẽ khám phá cách mô phỏng giao diện ứng dụng Claude thông qua Claude API.

Bước 1: Điều kiện tiên quyết

Bắt đầu bằng cách cài đặt tất cả các phụ thuộc thời gian chạy:

  • Anthropic cho Claude Messages API

  • pandasopenpyxl để đọc bảng chấm công từ Excel

  • reportlab để tạo hóa đơn PDF dự phòng tại máy 

!pip -q install anthropic pandas openpyxl reportlab

Giờ chúng ta đã cài đặt xong các phụ thuộc. Tiếp theo, cấu hình khóa API của bạn.

Bước 2: Cấu hình khóa API

Trước khi gọi Messages API, chúng ta cần xác thực. Bước này tạo một anthropic.Client dùng lại được với khóa API. 

import os, json, sys, re
import anthropic
from datetime import datetime, timedelta
API_KEY = "YOUR_ANTHROPIC_API_KEY"
client = anthropic.Client(api_key=API_KEY)

Đăng nhập vào Anthropic Console và tìm tab API keys trong phần Settings. Nhấp Create Key và sao chép khóa API Anthropic của bạn.

Tạo khóa API Anthropic

Nguồn: Anthropic API

Lưu ý: Nếu bạn dùng notebook riêng cho mục đích cá nhân, hãy thêm khóa API của bạn. Nếu không, hãy dùng biến môi trường an toàn để khóa không lộ trong notebook hoặc log.

Đoạn mã trên khởi tạo client SDK Anthropic và thiết lập môi trường. Đối tượng client sẽ được tái sử dụng cho mọi lần gọi Messages API tiếp theo.

Bước 3: Tiền xử lý dữ liệu

Ở bước này, chúng ta sẽ chuyển trang timesheet.xlsx thành một đối tượng JSON gọn gàng, có thể dự đoán mà Skill có thể tiêu thụ. Cách này giữ cho logic phía sau đơn giản và tránh việc phân tích prompt mong manh.

def load_invoice_from_timesheet(excel_path):
    import pandas as pd
    df = pd.read_excel(excel_path)
    df.columns = df.columns.str.strip()  
    invoice_period = "2025-10"
    if 'Date' in df.columns:
        first_date = str(df['Date'].iloc[0])
        date_match = re.search(r'(\d{2})\s+(\w+)\s+(\d{4})', first_date)
        if date_match:
            month_name = date_match.group(2)
            year = date_match.group(3)
            month_num = datetime.strptime(month_name[:3], '%b').month
            invoice_period = f"{year}-{month_num:02d}"   
    article_col = next((col for col in df.columns if 'article' in col.lower() and 'name' in col.lower()), None)
    amount_col = next((col for col in df.columns if 'amount' in col.lower()), None)
    topic_col = next((col for col in df.columns if 'topic' in col.lower()), None)
    line_items = []
    timesheet_articles = []
    
    for idx, row in df.iterrows():
        if pd.isna(row.get(article_col)) or row.get(article_col) == '':
            continue    
        article_name = str(row[article_col]).strip()
        amount = row.get(amount_col, 0) 
        if isinstance(amount, str):
            amount = float(amount.replace('$', '').replace(',', '').strip())
        line_items.append({
            "title": article_name,
            "rate_type": "flat",
            "qty": 1,
            "rate": float(amount)
        })  
        timesheet_articles.append({
            "title": article_name,
            "topic": str(row.get(topic_col, 'N/A')) if topic_col else 'N/A'
        })
    return {
        "client_name": "Client",
        "billing_contact": "billing@example.com",
        "invoice_period": invoice_period,
        "currency": "USD",
        "payment_terms": "Net-30",
        "line_items": line_items,
        "discount_pct": 0.0,
        "tax_pct": 0.0,
        "timesheet": timesheet_articles
    }

Hàm load_invoice_from_timesheet chuyển đổi tệp Excel được tải lên thành một payload JSON hóa đơn đã chuẩn hóa.

  • Đọc Excel bằng pandas và chuẩn hóa tiêu đề cột.

  • Sau đó suy luận invoice_period từ hàng Date đầu tiên (nếu có) bằng regex và phân tích tháng.

  • Cuối cùng phát hiện tên cột cho tiêu đề bài viết, số tiền và chủ đề theo cách không phân biệt hoa thường.

  • Hàm xuất ra hai cấu trúc:

    • line_items: Dùng cho tính toán thanh toán (ở đây là giá cố định mỗi bài).

    • timesheet: Danh sách phẳng các mục {title, topic} cho phần phụ lục tùy chọn.

  • Regex (\d{2})\s+(\w+)\s+(\d{4}) kỳ vọng các định dạng như 01 Oct 2025; hãy điều chỉnh nếu trang của bạn dùng định dạng khác.

  • Các cột/giá trị thiếu được xử lý bằng cách bỏ qua hàng trống, hoặc bạn có thể mở rộng mã để báo lỗi sớm nếu cần.

Đầu vào của chúng ta đã sẵn sàng. Tiếp theo, chúng ta sẽ gọi Claude Skill qua API để biến bảng chấm công đã xử lý thành hóa đơn có thể chỉnh sửa.

Bước 4: Hàm trợ giúp

Ở phần này, chúng ta định nghĩa hai hàm trợ giúp mô phỏng việc thực thi công cụ mà Claude yêu cầu trong quá trình chạy Skill. 

def execute_bash_tool(command):
    try:
        dangerous = ['rm -rf /', 'sudo', 'chmod', 'mkfs', '> /dev/']
        if any(d in command for d in dangerous):
            return f"Error: Command blocked for safety: {command}"
        result = subprocess.run(
            command, 
            shell=True, 
            capture_output=True, 
            text=True, 
            timeout=30,
            cwd=tempfile.gettempdir()
        )    
        output = result.stdout if result.stdout else result.stderr
        return output if output else "Command executed successfully"
    except subprocess.TimeoutExpired:
        return "Error: Command timed out"
    except Exception as e:
        return f"Error executing command: {str(e)}"
def execute_text_editor_tool(params):
    try:
        command = params.get('command')
        path = params.get('path')   
        if command == 'create':
            file_text = params.get('file_text', '')
            os.makedirs(os.path.dirname(path) if os.path.dirname(path) else '.', exist_ok=True)
            with open(path, 'w') as f:
                f.write(file_text)
            return f"File created: {path}"
        elif command == 'view':
            if os.path.exists(path):
                with open(path, 'r') as f:
                    content = f.read()
                return content[:1000] 
            return f"Error: File not found: {path}"   
        elif command == 'str_replace':
            if os.path.exists(path):
                with open(path, 'r') as f:
                    content = f.read()
                old_str = params.get('old_str', '')
                new_str = params.get('new_str', '')
                content = content.replace(old_str, new_str)
                with open(path, 'w') as f:
                    f.write(content)
                return f"File updated: {path}"
            return f"Error: File not found: {path}"    
        return f"Unknown command: {command}"
    except Exception as e:
        return f"Error: {str(e)}"

Hàm execute_bash_tool mô phỏng một công cụ bash an toàn cho các hành động do Skill điều khiển. Nó chặn trước các mẫu nguy hiểm như rm -rf /, sudo, chmod, mkfs, v.v. như một cổng an toàn và chạy lệnh bằng subprocess.run() trong thư mục tạm của hệ điều hành với thời gian chờ 30 giây.

Hàm execute_text_editor_tool cung cấp giao diện chỉnh sửa văn bản tối thiểu dùng bởi Skills. Nó hỗ trợ ba lệnh là create (để ghi tệp mới với file_text), view (trả về tối đa 1.000 ký tự của tệp) và str_replace (thay thế tại chỗ bằng new_str). Nó cũng tự động tạo thư mục cha cho create, kiểm tra sự tồn tại tệp cho viewstr_replace, và ghi cập nhật trở lại đĩa.

Các hàm trợ giúp này cho phép bạn hoàn tất vòng lặp sử dụng công cụ tại chỗ với hàng rào an toàn. Từ đó, Skill có thể yêu cầu sửa tệp hoặc thao tác shell trong lúc tạo hóa đơn mà không gây rủi ro cho hệ thống của bạn.

Bước 5: Gọi Skill qua API 

Bước này điều khiển quá trình tạo hóa đơn đầu-cuối thông qua Claude Messages API. Nó gửi yêu cầu có cấu trúc, bật sử dụng công cụ, lặp qua mọi lệnh gọi công cụ mà Claude yêu cầu và cuối cùng thu thập các tệp PDF được tạo từ thư mục làm việc và thư mục tạm.

def generate_invoice_with_claude(invoice): 
    user_text = f"""Generate a professional PDF invoice with the following data:
Client: {invoice['client_name']}
Period: {invoice['invoice_period']}
Currency: {invoice['currency']}
Payment Terms: {invoice['payment_terms']}
Line Items:
{json.dumps(invoice['line_items'], indent=2)}
Timesheet Articles:
{json.dumps(invoice['timesheet'], indent=2)}
Please create a professional PDF invoice with:
1. Invoice header with invoice number (INV-{invoice['invoice_period'].replace('-', '')}-001)
2. Client billing information
3. Line items table with amounts
4. Subtotal and total calculations
5. Timesheet section showing all articles and topics
Save the PDF as: invoice_{invoice['client_name'].lower()}_{invoice['invoice_period']}.pdf
""" 
    tools = [
        {"type": "bash_20250124", "name": "bash"},
        {"type": "text_editor_20250728", "name": "str_replace_based_edit_tool"}
    ]
    messages = [{"role": "user", "content": user_text}]
    iteration = 0
    max_iterations = 15   
    while iteration < max_iterations:
        iteration += 1
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=8192,
            tools=tools,
            messages=messages
        )   
        messages.append({"role": "assistant", "content": response.content}) 
        if response.stop_reason == "end_turn":
            break     
        if response.stop_reason == "tool_use":
            tool_results = []    
            for block in response.content:
                if block.type == "tool_use":
                    tool_name = block.name
                    tool_input = block.input
                    if tool_name == "bash":
                        result = execute_bash_tool(tool_input.get('command', ''))
                    elif tool_name == "str_replace_based_edit_tool":
                        result = execute_text_editor_tool(tool_input)
                    else:
                        result = f"Unknown tool: {tool_name}" 
                    tool_results.append({
                        "type": "tool_result",
                        "tool_use_id": block.id,
                        "content": result
                    })
            messages.append({"role": "user", "content": tool_results})
        else:
            break
    pdf_files = []
    for file in os.listdir('.'):
        if file.endswith('.pdf') and 'invoice' in file.lower():
            pdf_files.append(file)
    for file in os.listdir(tempfile.gettempdir()):
        if file.endswith('.pdf') and 'invoice' in file.lower():
            temp_path = os.path.join(tempfile.gettempdir(), file)
            import shutil
            dest_path = os.path.join('.', file)
            shutil.copy2(temp_path, dest_path)
            pdf_files.append(file)   
    return pdf_files
def main():
    if len(sys.argv) < 2:
        print("Usage: python app.py <timesheet.xlsx>")
        sys.exit(1)    
    excel_file = sys.argv[1]  
    if not os.path.exists(excel_file):
        print(f"Error: File not found: {excel_file}")
        sys.exit(1)    
    try:
        invoice = load_invoice_from_timesheet(excel_file)
        pdf_files = generate_invoice_with_claude(invoice)    
        if pdf_files:
            for pdf in pdf_files:
                print(f"Invoice generated: {os.path.abspath(pdf)}")
        else:
            print("Error: No PDF file was generated.")     
    except Exception as e:
        print(f"Error: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)
if __name__ == "__main__":
    main()

Hàm generate_invoice_with_claude gửi hóa đơn đã chuẩn hóa tới Claude API và điều khiển thực thi Skill đầu-cuối. Cụ thể mã làm những việc sau:

  • Xây dựng user_text rõ ràng, nhúng thông tin khách hàng, kỳ, tiền tệ, điều khoản, các dòng mục và danh sách bảng chấm công, kèm yêu cầu đầu ra tường minh như tiêu đề, bảng, tổng cộng và tên tệp.

  • Sau đó bật thực thi công cụ bằng cách khai báo bash_numbertext_editor_number với vòng lặp thông điệp nhận biết công cụ: gửi yêu cầu, kiểm tra stop_reason, và khi yêu cầu tool_use, sẽ chuyển tới các hàm trợ giúp cục bộ và trả về các khối tool_result để tiếp tục trao đổi.

  • Cuối cùng dừng ở end_turn hoặc khi đạt giới hạn vòng lặp, sau đó quét thư mục làm việc và thư mục tạm của hệ điều hành để tìm các tệp khớp invoice*.pdf. Bất kỳ tạo phẩm tạm nào sẽ được sao chép về thư mục dự án và trả về danh sách PDF tìm thấy.

  • Hàm main cung cấp lệnh CLI đơn giản: python app.py <timesheet.xlsx>, xác thực đường dẫn đầu vào, rồi chạy pipeline: load_invoice_from_timesheet(...) để dựng payload, và generate_invoice_with_claude(...)  để gọi Skill và thu thập PDF.

Với thiết lập này, cuộc gọi API sẽ tạo ra một PDF sẵn sàng cho khách hàng. Nếu không thấy tệp, hãy kiểm tra log tool_result và cấu hình Skill, sau đó thử lại với một bảng nhỏ.

Kết luận

Giờ bạn đã có một Trình tạo hóa đơn tự động hoạt động nhờ Claude Skills, và API có khả năng biến bảng tính thô thành hóa đơn sẵn sàng cho khách hàng. Bản demo này cho thấy thế mạnh của Skills: thiết lập di động, tự động kích hoạt, thực thi mã mang tính xác định và kết quả nhất quán trên ứng dụng và API mà không phải tạo lại prompt trong mọi chủ đề. Claude Skills trả về đầu ra nhất quán trên các ngữ cảnh, tức là tri thức miền có thể tái sử dụng và được hậu thuẫn bằng mã. Dù Skills có thể thực thi mã, bạn vẫn phải thực thi bảo mật bằng cách chỉ bật các Skill tin cậy, dùng kiểm soát ở cấp tổ chức và rà soát cập nhật trước khi triển khai.

Để tìm hiểu thêm, hãy khám phá tài liệu Skills của Anthropic và Console để quản lý phiên bản và nâng cấp, rồi bắt đầu kết hợp nhiều Skill để xây dựng các quy trình đầu-cuối.


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.

Chủ đề

Học với DataCamp

Courses

Các khái niệm về Large Language Models (LLMs)

2 giờ
99.1K
Khám phá toàn bộ tiềm năng của LLM với khóa học khái niệm của chúng tôi, bao gồm các ứng dụng LLM, phương pháp đào tạo, cân nhắc đạo đức và nghiên cứu mới nhất.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow