Courses
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 Code và API.
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.mdtố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
pandasthà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.

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.

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.mdchứ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."

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.

Đ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:
-
Anthropiccho Claude Messages API -
pandasvàopenpyxlđể đọ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.

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_periodtừ hàngDateđầ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 view và str_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_textrõ 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_numbervàtext_editor_numbervới vòng lặp thông điệp nhận biết công cụ: gửi yêu cầu, kiểm trastop_reason, và khi yêu cầutool_use, sẽ chuyển tới các hàm trợ giúp cục bộ và trả về các khốitool_resultđể tiếp tục trao đổi. -
Cuối cùng dừng ở
end_turnhoặ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ớpinvoice*.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
maincung 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.
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.
