บทเรียน 25: การเรียกใช้โค้ด
บทเรียน 25: การเรียกใช้โค้ด — คู่มือเข้าใจง่ายอ้างอิงจากเอกสารอย่างเป็นทางการ
นี่เป็นส่วนหนึ่งของชุดบทช่วยสอนอย่างเป็นทางการของ Hermes Agent ดูบทช่วยสอนทั้งหมด
ลองนึกภาพว่าคุณกำลังอบเค้ก และแทนที่จะต้องไปหยิบส่วนผสมทีละอย่าง คุณแค่เขียนสูตรทั้งหมดลงในกระดาษ ส่งให้ผู้ช่วย แล้วเขาก็เอาเค้กที่อบเสร็จแล้วกลับมาให้คุณเท่านั้น นั่นคือสิ่งที่ Code Execution ทำกับ Hermes Agent — มันทำให้เอเจนต์รันสคริปต์ Python เต็มรูปแบบที่เรียกใช้เครื่องมือหลายตัวภายใน แล้วส่งคืนเฉพาะผลลัพธ์สุดท้ายกลับเข้าสู่บทสนทนา
Code Execution คืออะไร?
โดยปกติแล้ว เมื่อ Hermes ต้องการค้นหาเว็บ อ่านไฟล์ หรือรันคำสั่ง มันจะทำทีละขั้นตอน — และผลลัพธ์ระหว่างทางทุกขั้นตอนจะถูกโหลดเข้าไปใน “หน่วยความจำ” (context window) ซึ่งช้าและสิ้นเปลือง tokens
ด้วยเครื่องมือ execute_code เฮอร์เมสจะเขียนสคริปต์ Python ที่สามารถเรียกใช้เครื่องมือต่าง ๆ ในเชิงโปรแกรม — เช่น web_search, read_file หรือ patch — ได้ทั้งหมดในครั้งเดียว สคริปต์จะรันใน child process ที่แยกออกไป และมีเพียงผลลัพธ์จาก print() เท่านั้นที่จะกลับมาถึงเอเจนต์ ข้อมูลระหว่างทางที่ยุ่งเหยิงทั้งหมดจะถูกซ่อนไว้
วิธีการทำงาน: ทีละขั้นตอน
ขั้นตอนที่ 1: เอเจนต์เขียนสคริปต์ Python
มันเริ่มต้นด้วยการนำเข้าเครื่องมือจากโมดูลพิเศษ:
from hermes_tools import web_search, web_extract
ขั้นตอนที่ 2: Hermes สร้างโมดูลตัวช่วย
มันจะสร้างไฟล์ hermes_tools.py จำลองขึ้นมาโดยอัตโนมัติ เพื่อเชื่อมต่อสคริปต์ของคุณกับเอเจนต์หลัก
ขั้นตอนที่ 3: เปิดช่องทางการสื่อสาร
Hermes เปิด Unix domain socket (เหมือน “สายโทรศัพท์” ความเร็วสูงระหว่างโปรเซส) และเริ่ม thread สำหรับรับฟัง
ขั้นตอนที่ 4: สคริปต์รันใน child process
ทุกครั้งที่สคริปต์เรียกใช้เครื่องมือ มันจะส่งผ่าน socket นั้นกลับไปยัง Hermes ซึ่งจะทำการเรียกใช้และส่งผลลัพธ์กลับมา
ขั้นตอนที่ 5: มีเพียงผลลัพธ์จาก print เท่านั้นที่กลับมา
คำสั่ง print() ในสคริปต์คือ สิ่งเดียว ที่ LLM จะได้เห็น ผลลัพธ์ระหว่างทางทั้งหมดไม่เคยเข้าสู่ context window — ช่วยประหยัด tokens ได้มหาศาล
Hermes ใช้สิ่งนี้เมื่อไหร่?
เอเจนต์จะเลือกใช้ execute_code โดยอัตโนมัติเมื่อมันสังเกตเห็น:
- การเรียกใช้เครื่องมือ 3 ครั้งขึ้นไป ที่มีตรรกะแทรกอยู่ระหว่างกลาง (เช่น การกรองหรือการเปรียบเทียบ)
- การประมวลผลข้อมูลจำนวนมาก — เช่น การค้นหาไฟล์หลายไฟล์แล้วดึงข้อความบางส่วนออกมา
- การวนลูป — การทำซ้ำการกระทำกับหลายรายการ
ข้อได้เปรียบใหญ่คืออะไร? ประสิทธิภาพของ tokens แทนที่จะป้อนผลการค้นหาทุกอันกลับเข้าสู่บทสนทนา มีเพียงบทสรุปสุดท้ายเท่านั้นที่จะผ่านเข้ามา
ตัวอย่างที่ใช้งานได้จริง ลองทำตามได้เลย
1. ขั้นตอนการประมวลผลข้อมูล
from hermes_tools import search_files, read_file
import json
# ค้นหาไฟล์คอนฟิกทั้งหมดและดึงการตั้งค่าฐานข้อมูล
matches = search_files("database", path=".", file_glob="*.yaml", limit=20)
configs = []
for match in matches.get("matches", []):
content = read_file(match["path"])
configs.append({"file": match["path"], "preview": content["content"][:200]})
print(json.dumps(configs, indent=2))
2. การค้นคว้าเว็บแบบหลายขั้นตอน
from hermes_tools import web_search, web_extract
import json
results = web_search("Rust async runtime comparison 2025", limit=5)
summaries = []
for r in results["data"]["web"]:
page = web_extract([r["url"]])
for p in page.get("results", []):
if p.get("content"):
summaries.append({
"title": r["title"],
"url": r["url"],
"excerpt": p["content"][:500]
})
print(json.dumps(summaries, indent=2))
3. การปรับปรุงไฟล์จำนวนมาก
from hermes_tools import search_files, read_file, patch
matches = search_files("old_api_call", path="src/", file_glob="*.py")
fixed = 0
for match in matches.get("matches", []):
result = patch(
path=match["path"],
old_string="old_api_call(",
new_string="new_api_call(",
replace_all=True
)
if "error" not in str(result):
fixed += 1
print(f"Fixed {fixed} files out of {len(matches.get('matches', []))} matches")
4. ขั้นตอนการ build และทดสอบ
from hermes_tools import terminal
import json
result = terminal("cd /project && python -m pytest --tb=short -q 2>&1", timeout=120)
output = result.get("output", "")
passed = output.count(" passed")
failed = output.count(" failed")
print(json.dumps({"passed": passed, "failed": failed}, indent=2))
ประเด็นสำคัญที่ควรจำ
- เครื่องมือที่ใช้ได้ภายในสคริปต์:
web_search,web_extract,read_file,write_file,search_files,patchและterminal(เฉพาะ foreground เท่านั้น) - มีเพียงผลลัพธ์จาก
print()เท่านั้นที่กลับมา — อย่างอื่นถูกซ่อนไว้ทั้งหมด - เหมาะอย่างยิ่งสำหรับการวนลูป การกรอง และขั้นตอนการทำงานหลายขั้นตอน — เหมือนกับการให้สภาพแวดล้อมการเขียนโปรแกรมขนาดเล็กแก่ Hermes
สรุป
Code Execution เปลี่ยน Hermes จากผู้ช่วยที่ทำงานทีละขั้นตอน ให้กลายเป็นตัวประมวลผลแบบแบตช์ มันเขียนสคริปต์ รันมัน แล้วส่งคืนเฉพาะคำตอบสุดท้ายให้คุณ — ประหยัดทั้งเวลา tokens และภาระทางความคิด หากคุณเห็น Hermes เรียกใช้เครื่องมือซ้ำ ๆ หลายครั้ง นั่นอาจเป็นเพราะมันใช้ฟีเจอร์นี้อยู่เบื้องหลังก็เป็นได้
ต่อไป: บทช่วยสอน 26 — Batch Processing: การรันพรอมต์หลายร้อยรายการแบบขนาน
📖 เอกสารทางการ
この記事は Hermes Agent のเอกสารทางการに基づいています:เอกสารทางการ › user-guide/features/code-execution