🤖HermesBlog
บทเรียนอย่างเป็นทางการของ Hermes · Parte 258/9/2026

บทเรียน 25: การเรียกใช้โค้ด

บทเรียน 25: การเรียกใช้โค้ด — คู่มือเข้าใจง่ายอ้างอิงจากเอกสารอย่างเป็นทางการ

นี่เป็นส่วนหนึ่งของชุดบทช่วยสอนอย่างเป็นทางการของ Hermes Agent ดูบทช่วยสอนทั้งหมด

ลองนึกภาพว่าคุณกำลังอบเค้ก และแทนที่จะต้องไปหยิบส่วนผสมทีละอย่าง คุณแค่เขียนสูตรทั้งหมดลงในกระดาษ ส่งให้ผู้ช่วย แล้วเขาก็เอาเค้กที่อบเสร็จแล้วกลับมาให้คุณเท่านั้น นั่นคือสิ่งที่ Code Execution ทำกับ Hermes Agent — มันทำให้เอเจนต์รันสคริปต์ Python เต็มรูปแบบที่เรียกใช้เครื่องมือหลายตัวภายใน แล้วส่งคืนเฉพาะผลลัพธ์สุดท้ายกลับเข้าสู่บทสนทนา


Hermes tutorial

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