- LLM 0.26 เป็นรีลีสใหญ่ที่เปิดให้เชื่อมต่อเครื่องมือซึ่งสร้างเป็นฟังก์ชัน Python เข้ากับ OpenAI, Anthropic, Gemini และโมเดลโลคัลของ Ollama ได้ทั้งจาก CLI และไลบรารี Python
- สามารถติดตั้งเครื่องมือเป็นปลั๊กอินแล้วเรียกด้วย
--tool/-T name_of_tool หรือใช้ --functions เพื่อส่ง ฟังก์ชัน Python แบบชั่วคราว จากบรรทัดคำสั่งโดยตรงได้
- นอกจากเครื่องมือในตัวอย่าง
llm_version, llm_time แล้ว ยังมีปลั๊กอิน simpleeval, QuickJS, SQLite และ Datasette โดยโมเดลสามารถ ลองใหม่ หลังการเรียกที่ล้มเหลวได้ผ่านการดูสคีมาหรือใช้ expression แบบอื่น
model.chain() ใหม่ใน Python API จะตรวจจับคำขอเรียกเครื่องมือ รันให้ แล้วส่งผลลัพธ์กลับเข้าโมเดลอีกครั้ง พร้อมรองรับทั้งฟังก์ชันแบบซิงก์และเครื่องมือ asyncio
- ฟีเจอร์นี้เกิดขึ้นได้เพราะแนวทางการใช้เครื่องมือและการเรียกฟังก์ชันของหลายเวนเดอร์เริ่มบรรจบกันแล้ว โดยงานถัดไปคือการขยายปลั๊กอิน รองรับปลั๊กอินโมเดลเพิ่มขึ้น และรองรับไคลเอนต์ Model Context Protocol
การรองรับการรันเครื่องมือใน LLM 0.26
- LLM 0.26 เพิ่ม การรองรับเครื่องมือ ซึ่งเป็นฟีเจอร์ใหญ่ที่สุดของโปรเจกต์นับตั้งแต่เริ่มต้น
- สามารถให้สิทธิ์เข้าถึงเครื่องมือที่แสดงผลได้เป็น ฟังก์ชัน Python แก่ OpenAI, Anthropic, Gemini และโมเดลโลคัลของ Ollama ได้จากทั้ง LLM CLI และ ไลบรารี Python
- เมื่อติดตั้ง ปลั๊กอินเครื่องมือ ใหม่ ก็จะเพิ่มความสามารถใหม่ให้กับโมเดลที่ใช้งานอยู่ได้
- รูปแบบการใช้งานหลักมี 4 แบบ
- ติดตั้งปลั๊กอินเครื่องมือแล้วโหลดด้วย
--tool/-T name_of_tool
- ส่ง โค้ดฟังก์ชัน Python ตรงผ่านบรรทัดคำสั่งด้วยตัวเลือก
--functions
- ใช้ Python API ส่งเครื่องมือได้ด้วยรูปแบบอย่าง
tools=[locals]
- เครื่องมือทำงานได้ทั้งในบริบทแบบ asynchronous และ synchronous
การรันเครื่องมือจาก CLI
- LLM เวอร์ชันล่าสุดติดตั้งได้ด้วย
uv tool install llm และถ้ามีอยู่แล้วให้อัปเกรดด้วย uv tool upgrade llm
- ตัวอย่างการใช้ OpenAI คือตั้งค่า API key ด้วย
llm keys set openai แล้วรันดังนี้
llm --tool llm_version "What version?" --td
llm_version เป็นเครื่องมือเดโมง่าย ๆ ที่มากับ LLM และ --tool llm_version จะเปิดให้โมเดลเห็นเครื่องมือนี้
- ระบุ
--tool ได้หลายครั้ง และใช้ตัวเลือกแบบสั้น -T ได้เช่นกัน
--td ย่อมาจาก --tools-debug ใช้พิมพ์ ข้อมูลการเรียกและการตอบกลับของเครื่องมือ เพื่อดูการทำงานภายใน
- โมเดลเริ่มต้นมักเป็น
gpt-4o-mini แต่ในตัวอย่างได้เปลี่ยนค่าเริ่มต้นเป็น gpt-4.1-mini ด้วย llm models default gpt-4.1-mini
- ระบุโมเดลอื่นได้ด้วยตัวเลือก
-m และยังมีตัวอย่างใช้ o4-mini ร่วมกับเครื่องมือในตัว llm_time
llm --tool llm_time "What time is it?" --td -m o4-mini
- คำตอบจากเครื่องมือ
llm_time มีฟิลด์อย่าง utc_time, utc_time_iso, local_timezone, local_time, timezone_offset, is_dst
การทำงานกับหลายโมเดลและปลั๊กอิน
- คำสั่งรูปแบบเดียวกันนี้ใช้ได้กับปลั๊กอินโมเดลที่รองรับเครื่องมือเช่นกัน
- ตัวอย่าง Anthropic Claude Sonnet 4 ใช้ลำดับดังนี้
llm install llm-anthropic -U
llm keys set anthropic
llm --tool llm_version "What version?" --td -m claude-4-sonnet
- ตัวอย่าง Google Gemini 2.5 Flash ใช้ลำดับดังนี้
llm install llm-gemini -U
llm keys set gemini
llm --tool llm_version "What version?" --td -m gemini-2.5-flash-preview-05-20
qwen3:4b ที่รันผ่าน Ollama ก็สามารถรันเครื่องมือง่าย ๆ ได้เช่นกัน
qwen3:4b เป็นโมเดลขนาดเล็ก 2.6GB
ollama pull qwen3:4b
llm install 'llm-ollama>=0.11a0'
llm --tool llm_version "What version?" --td -m qwen3:4b
ปลั๊กอินเครื่องมือสำหรับคณิตศาสตร์, JavaScript, SQLite และ Datasette
- งานที่ LLM ไม่ถนัด เช่น การคูณเลขจำนวนมาก สามารถชดเชยได้ด้วยการเรียกเครื่องมือ
- llm-tools-simpleeval เปิดให้ใช้ไลบรารี simpleeval ของ Daniel Fairhead
- simpleeval คือไลบรารี “Simple Safe Sandboxed Extensible Expression Evaluator for Python”
- มี sandbox ที่แข็งแรงเพียงพอสำหรับรัน expression Python แบบง่าย
- ตัวอย่างการคำนวณรันได้ดังนี้
llm install llm-tools-simpleeval
llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
- ในตัวอย่าง โมเดลคำนวณ
1234 * 4346 / 32414 ก่อนและได้ 165.45208860368976 จากนั้นล้มเหลวเพราะ sqrt(...) ไม่ถูกกำหนดไว้ แล้วจึงเปลี่ยนเป็น ** 0.5 และได้ 12.862818066181678
- ปลั๊กอินเครื่องมือที่เผยแพร่แล้วมี 4 ตัว
Datasette toolbox และการลองใหม่หลังข้อผิดพลาด
- ปลั๊กอิน Datasette ทำงานในรูปแบบ toolbox ที่มีหลายเครื่องมืออยู่ภายใน
- toolbox เป็นปลั๊กอินที่สามารถกำหนดค่าได้ผ่าน constructor
- ตัวอย่างการใช้งานมีดังนี้
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
Datasette("https://datasette.io/content") ใช้ส่ง URL ของอินสแตนซ์ Datasette ให้ปลั๊กอิน
- ตัวอย่างนี้ใช้กับ content database ที่ขับเคลื่อนเว็บไซต์ Datasette
- โมเดลเรียกใช้งาน 3 ครั้ง
- ครั้งแรกเดาว่าจะใช้
SELECT name, stars FROM repos ORDER BY stars DESC LIMIT 1 แต่ล้มเหลวเพราะไม่มีคอลัมน์ stars
- หลังได้รับข้อผิดพลาดแล้ว จึงเรียกเครื่องมือ
Datasette_schema() เพื่อดูสคีมาของฐานข้อมูล
- จากนั้นประกอบคำสั่ง query ที่ถูกต้องตามสคีมาแล้วรัน
- ตามคำตอบสุดท้าย รีโพที่มีดาวมากที่สุดคือ
datasette โดยมี 10,020 stars
สร้างเครื่องมือชั่วคราวด้วย --functions
- ตัวเลือก
--functions เปิดทางให้ใช้ เครื่องมือแบบชั่วคราว ที่มีโครงสร้างน้อยกว่าปลั๊กอิน
- หากส่งบล็อกโค้ด Python ตรงผ่านบรรทัดคำสั่ง ฟังก์ชันที่นิยามอยู่ข้างในจะกลายเป็นเครื่องมือที่โมเดลใช้ได้
- ตัวอย่างเครื่องมือค้นหาบล็อกใช้
httpx เรียกหน้าค้นหา แล้วส่ง HTML กลับให้โมเดลตรง ๆ
llm --functions '\nimport httpx\n\ndef search_blog(q):\n "Search Simon Willison blog"\n return httpx.get("https://simonwillison.net/search/", params={"q": q}).content\n' --td 'Three features of sqlite-utils' -s 'use Simon search'
- แม้ implementation จะคืน HTML จากหน้าค้นหาตรง ๆ แต่ก็ใช้งานได้
- คาดว่าโมเดลตระกูล GPT-4.1 รับมือ HTML ที่หยาบแบบนี้ได้ เพราะรองรับได้ถึง 1 ล้านโทเคน
- ต้องเพิ่ม
use Simon search ใน system prompt เพื่อให้โมเดลใช้เครื่องมือค้นหาที่ให้มาแทนการตอบเอง
- ถ้าจะทำเครื่องมือค้นหาที่ดีกว่านี้ ควรมีคำสั่งที่ละเอียดขึ้นและมี snippet ของผลการค้นหาที่เกี่ยวข้อง
- ในผลลัพธ์ตัวอย่าง ฟีเจอร์ของ
sqlite-utils ที่ได้ออกมาคือการผสาน CLI กับไลบรารี Python, การเพิ่มคอลัมน์อัตโนมัติผ่าน alter=True และการรองรับปลั๊กอิน
การรองรับเครื่องมือใน Python API
- LLM เป็นทั้งเครื่องมือ CLI และไลบรารี Python และใน 0.26 ก็เพิ่ม การรองรับเครื่องมือ ให้กับ Python API ด้วย
- ตัวอย่างใช้ฟังก์ชันเครื่องมือแก้โจทย์นับจำนวน
r ในคำว่า “strawberry”
import llm
def count_char_in_text(char: str, text: str) -> int:
"How many times does char appear in text?"
return text.count(char)
model = llm.get_model("gpt-4.1-mini")
chain_response = model.chain(
"Rs in strawberry?",
tools=[count_char_in_text],
after_call=print
)
for chunk in chain_response:
print(chunk, end="", flush=True)
after_call=print เป็นวิธี ตรวจดูการเรียกเครื่องมือ คล้ายกับตัวเลือก --td ด้านบน
- เมธอด
model.chain() ใหม่คล้ายกับ model.prompt() แต่จะตรวจจับคำขอเรียกเครื่องมือที่ถูกส่งกลับมา รันให้ แล้วเรียกโมเดลซ้ำพร้อมผลลัพธ์
model.chain() สามารถรันการตอบกลับหลายรอบได้จนกว่าจะได้คำตอบสุดท้าย
- หากวนลูป
chain_response ก็จะสตรีมโทเคนที่คืนมาข้ามหลายการตอบกลับได้
- ในผลลัพธ์ตัวอย่าง มีการเรียกเครื่องมือ
count_char_in_text ด้วย char='r', text='strawberry' แล้วจึงตอบว่าคำว่า strawberry มี r จำนวน 3 ตัวตามผลลัพธ์ 3
- ไลบรารี Python รองรับ
asyncio ด้วย และเครื่องมือสามารถเป็นฟังก์ชัน async def ได้
- หากโมเดลขอเครื่องมือ async หลายตัวพร้อมกัน ไลบรารีจะรันพร้อมกันด้วย
asyncio.gather()
- ยังรองรับ toolbox ด้วย ดังนั้นการส่ง
tools=[Datasette("https://datasette.io/content")] เข้า chain() จะให้ผลเหมือนกับ --tool 'Datasette(...)' ใน CLI
เบื้องหลังการพัฒนาและรูปแบบการใช้เครื่องมือ
- ผู้เขียนติดตามรูปแบบการใช้เครื่องมือนี้มาตั้งแต่เห็น ReAcT paper ที่เผยแพร่ครั้งแรกในเดือนตุลาคม 2022
- รูปแบบพื้นฐานนั้นเรียบง่าย
- บอกโมเดลว่ามีเครื่องมือที่ใช้ได้
- โมเดลร้องขอการทำงานของเครื่องมือผ่านไวยากรณ์พิเศษ เช่น JSON, XML หรือ
tool_name(arguments) แล้วหยุด
- โค้ดจะ parse เอาต์พุตนั้นแล้วรันเครื่องมือที่ถูกร้องขอ
- จากนั้นส่งพรอมป์ใหม่พร้อมผลลัพธ์การรันกลับเข้าโมเดล
- วิธีนี้ตอนนี้ใช้ได้กับแทบจะ ทุกโมเดล
- หลายโมเดลถูกฝึกมาเฉพาะสำหรับการใช้เครื่องมือ และยังมีลีดเดอร์บอร์ดอย่าง Berkeley Function-Calling Leaderboard
- OpenAI, Anthropic, Google, Mistral และ Meta ต่างมีฟีเจอร์ใช้เครื่องมือหรือเรียกฟังก์ชันอยู่ใน API
- ฝั่งโมเดลโลคัล Ollama ก็เพิ่ม การรองรับเครื่องมือ มาตั้งแต่ปีที่แล้ว และเซิร์ฟเวอร์ llama.cpp ก็มีความสามารถนี้เช่นกัน
- LLM ออกรุ่น schema support มาก่อนในเดือนกุมภาพันธ์ 2025 และใช้สิ่งนั้นเป็นก้าวสู่การรองรับเครื่องมือ
- ความท้าทายคือการออกแบบ abstraction layer ที่ใช้ได้กับหลายโมเดล ซึ่งเพิ่งทำได้ตอนนี้เพราะแนวทางของเวนเดอร์ต่าง ๆ เริ่มบรรจบกันชัดเจนแล้ว
- เวิร์กช็อป Building software on top of Large Language Models ที่ PyCon US เป็นตัวเร่งให้ implementation ระดับอัลฟาเสร็จสมบูรณ์ และยังมี ส่วน tools ในบทเรียนประกอบด้วย
เอเจนต์และแผนถัดไป
- แม้ยังไม่ค่อยชอบคำว่า “agents” แต่ในโลก LLM แนวทางก็กำลังบรรจบไปที่ tools in a loop และ LLM 0.26 ก็ใกล้เคียงกับรูปแบบนั้น
- หากต้องการสร้างเอเจนต์ LLM 0.26 อาจเป็นจุดเริ่มต้นที่ดี
- งานถัดไปถูกรวบรวมไว้ใน LLM tools v2 milestone จำนวน 13 issue
- ส่วนใหญ่เป็นการปรับปรุงการแสดง log ของการรันเครื่องมือและ issue เล็ก ๆ ที่ไม่ถึงกับต้องบล็อกรีลีสนี้
- issue เพิ่มเติมดูได้จาก tools label
- พื้นที่ที่น่าตื่นเต้นที่สุดคือศักยภาพของปลั๊กอิน
- ขณะนี้มีการใช้เทมเพลต cookiecutter llm-plugin-tools ด้วยตัวเอง
- มีแผนจะทำบทเรียนเกี่ยวกับเรื่องนี้ด้วย
- ยังเหลืองานเพิ่มการรองรับเครื่องมือให้กับปลั๊กอินโมเดลอีกหลายตัว
- แผนงานยังรวมถึงการรองรับ Model Context Protocol ด้วย
- MCP กำลังเติบโตอย่างรวดเร็วในฐานะมาตรฐานสำหรับให้โมเดลเข้าถึงเครื่องมือ
- เมื่อ 2 สัปดาห์ก่อนยังไม่มีการรองรับตรงใน API ของเวนเดอร์หลัก แต่ในช่วง 8 วันที่ผ่านมา OpenAI, Anthropic และ Mistral ได้เพิ่มเข้ามาแล้ว
- เป้าหมายคือให้ LLM ทำหน้าที่เป็นไคลเอนต์ MCP เพื่อให้ใช้ MCP server ที่ผู้คนสร้างขึ้นเป็นแหล่งเครื่องมือเพิ่มเติมของ LLM ได้ง่าย
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ตัวเรนเดอร์ Markdown แบบสตรีมมิงที่เขียนขึ้นสำหรับเครื่องมือนี้ก็น่าดูเช่นกัน: https://github.com/day50-dev/Streamdown
ที่มามีอยู่ใน https://github.com/simonw/llm/issues/12 และผมก็ใช้ https://github.com/day50-dev/llmehelp ซึ่งเป็นเครื่องมือ tmux ที่สร้างบน
llmของ Simon อยู่ทุกวันด้วยllm: เป็น ปลั๊กอิน ZSH ที่ใช้zleเพื่อแปลงภาษาอังกฤษให้เป็นคำสั่งเชลล์ได้ด้วยการกดปุ่มครั้งเดียว: https://github.com/day50-dev/Zummonerวันนี้ก็ใช้ในทำนอง
$ git find out if abcdefg is a descendent of hijklmnopและfor i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30ในคอมเมนต์อื่น เดิมทีก็เป็นอินพุตที่ใกล้เคียงภาษาธรรมชาติกว่านี้มากพอกด
ctrl-x xบัฟเฟอร์จะถูกส่งไปยัง OpenRouter และถูกแทนที่ด้วยไวยากรณ์ที่ถูกต้องในไม่ถึง 1 วินาทีเปิด issue ไว้แล้ว: https://github.com/simonw/llm/issues/1112
ใส่ตัวเลือกการออกแบบไว้สองสามแบบ แต่ยังไม่รู้สึกว่าใช่เต็มที่ เลยอยากได้ฟีดแบ็ก
llmร่วมกับ syntax highlighting ของbatอยู่สิ่งนี้เพิ่ม ความเสี่ยงยิงเท้าตัวเอง อย่างมาก
เอกสาร https://llm.datasette.io/en/stable/tools.html เตือนเรื่อง prompt injection แต่สถานการณ์ที่น่าจะเกิดขึ้นมากกว่าคือความเสียหายที่ทำกับตัวเอง
ตัวอย่างเช่น ถ้าให้สิทธิ์เข้าถึงบัญชีหลักทรัพย์แก่เครื่องมือเพื่อทำการเทรดอัตโนมัติ แม้ไม่มี prompt injection ก็ไม่มีอะไรป้องกันไม่ให้บอตทำการเทรดโง่ ๆ
พอเริ่มผูกเครื่องมือเข้ากับ LLM โดยเฉพาะถ้าการเรียกเครื่องมือนั้นผ่านการยืนยันตัวตนแล้วและสามารถลงมือทำแทนได้ มีเส้นทางที่เรื่องจะผิดพลาดได้มากเกินไป
ฝั่ง MCP กำลังเจอเรื่องนี้แบบความเร็วสูงมาก และกรณี GitHub MCP เมื่อวานก็เป็นตัวอย่าง: https://news.ycombinator.com/item?id=44097390
ผมใส่คำเตือนใหญ่ไว้ในเอกสารแล้ว และก็ระวังที่จะปล่อยปลั๊กอินเครื่องมือช่วงแรกเฉพาะสิ่งที่สร้างความเสียหายไม่ได้ ดังนั้นทั้ง QuickJS sandbox และปลั๊กอิน SQLite จึงเป็นแบบอ่านอย่างเดียว
llmเข้ากับบัญชีหลักทรัพย์ คนที่โง่ไม่ใช่บอต แต่คือคนที่เชื่อมมันเข้าไปบน macOS ไม่ได้ยากมากนัก แต่ตอนนี้ยังขาดเครื่องมือดี ๆ ที่ใช้ง่าย Claude Code เริ่มใช้ Seatbelt ทีละนิดเพื่อปรับปรุงประสบการณ์ผู้ใช้
มันอาจทำร้ายตัวเองได้ และคงมีโอกาสเกิดขึ้น แต่การไม่ประเมินศักยภาพก็อันตรายเช่นกัน คนทั่วไปมักประเมินความเป็นไปได้ที่จะยิงเท้าตัวเองต่ำเกินไป ส่วนคนสายเทคนิคก็มักประเมินความเสี่ยงจากการไม่เรียนรู้ความเป็นไปได้ใหม่ ๆ ต่ำเกินไป
เมื่อหนึ่งปีก่อนผมก็ให้ LLM รันคำสั่ง local บนแล็ปท็อปของผมแล้ว และมองว่ามีความเสี่ยงอยู่บ้าง แต่ก็ยังไม่เกิดเรื่องเสียหาย พรอมป์อย่าง
find out where I am and what weather it is going to beอาจมีโอกาสรันrm -rf /ได้ก็จริง แต่ต่ำมากอย่างไรก็ตาม การฝากให้ LLM เทรดหุ้น โดยที่ไม่รู้ว่ามันตัดสินใจอย่างไร สำหรับผมถือว่าเสี่ยงเกินไป
ผมชอบไอเดีย เอเจนต์บนเทอร์มินัล ของ Warp terminal แต่ไม่ค่อยชอบโมเดลแบบ Cursor ที่ว่า “เชื่อเราแล้วจ่ายเงินมา เดี๋ยวเรื่องพรอมป์ดี ๆ กับการเรียก LLM เราจัดการให้เอง”
เลยมองหาเอเจนต์เทอร์มินัลแบบ CLI ง่าย ๆ เพื่อชดเชยทักษะเชลล์ที่ยังไม่พอ และชุดเครื่องมือเทอร์มินัลกับ
llmดูเป็นทางออกที่เบาดีผมรู้ดีถึงความเสี่ยงยิงเท้าตัวเองครั้งใหญ่ เลยสงสัยว่าสามารถทำแบบที่ถามสิทธิ์ทุกครั้งก่อนเรียกเครื่องมือเหมือนเอเจนต์อื่น ๆ ได้ไหม เช่น “
llmกำลังจะเรียกrm -rf ./*กด Y เพื่อยืนยัน” แบบนี้ก็น่าจะช่วยกันไม่ให้ LLM หลุดควบคุมในเทอร์มินัลได้ระดับหนึ่ง--full-autoไม่ใช่หรือถ้าใช้
llmอยู่ Gtk-llm-chat ก็น่าดูเช่นกันมันผสานกับเครื่องมือบรรทัดคำสั่ง
llmและเดสก์ท็อป มีไอคอนในถาดระบบและหน้าต่างแชตที่ดูดีเพิ่งปล่อย 3.0.0 เมื่อไม่นานนี้ และมีแพ็กเกจสำหรับระบบปฏิบัติการเดสก์ท็อปหลักทั้ง 3 ค่าย
ผมมองว่ารีลีสนี้เป็นองค์ประกอบสำคัญที่ปลดล็อก ศักยภาพของ LLM โดยไม่ถูกจำกัดด้วยไคลเอนต์เดิม ๆ
หลังจาก 0.26 alpha ออกมา ผมพยายามทำปลั๊กอินที่โต้ตอบกับเซิร์ฟเวอร์ MCP แต่ค่อนข้างยาก จนถึงตอนนี้เชื่อมต่อและดึงเครื่องมือมาใช้แบบไดนามิกได้แล้ว แต่ยังส่งพารามิเตอร์ไม่ได้
ไลบรารี Python อย่างเป็นทางการ
mcpตั้งสมมติฐานอย่างหนักว่าต้องรันasyncioเชื่อมต่อกับเซิร์ฟเวอร์ แล้วตรวจสอบเครื่องมือที่พร้อมใช้งานผมดูแลปลั๊กอิน zsh/omz สำหรับการเติมแท็บของ
llmCLI แทบจะด้วยการ vibe coding อยู่ แต่ความเร็วในการออกฟีเจอร์ใหม่เร็วมากจนตามไม่ค่อยทันถึงอย่างนั้น แค่รันประมาณ
llm -f README.md -f llm.plugin.zsh -f completions/_llm -f [https://simonwillison.net/2025/May/27/llm-tools/](<https://simonwillison.net/2025/May/27/llm-tools/>) "implement tab completions for the new tool plugins feature"ก็แก้ได้ 90% แล้วรีโพอยู่ที่ https://github.com/eliyastein/llm-zsh-plugin และเพราะพยายามใส่ออปชันกับแฟล็กให้มากที่สุดเท่าที่ทำได้ มันเลยดูรกไปหน่อย จึงอยากได้ฟีดแบ็ก
คนรุ่นหลังคงสงสัยว่าเราทำงานกันได้อย่างไร เหมือนที่เรามองโปรแกรมเมอร์ภาษาแอสเซมบลีแล้วคิดว่า “ทำงานกันได้ยังไงนะ?”
เคยสงสัยว่า Claude Code รู้จักและใช้เครื่องมือต่าง ๆ ได้อย่างไร
เราสามารถบอก LLM ได้ว่ามีเครื่องมืออะไรและใช้อย่างไร และให้ execution wrapper จัดการตรงนั้นได้ แต่ผมคิดว่า Claude Code น่าจะมีความคาดหวังที่เฉพาะเจาะจงมากต่อ API สำหรับเรียกใช้เครื่องมือที่ wrapper ใช้ และคงถูกเสริมให้แข็งแรงด้วย post-training หรือ fine-tuning
เลยสงสัยว่าเฟรมเวิร์กเรียกใช้เครื่องมือของบุคคลที่สามที่ใช้ Claude จะเสียเปรียบเฟรมเวิร์กของ Anthropic เองหรือไม่
อีกเรื่องหนึ่ง ตามที่บทความว่าด้วย “การโจมตี” GitHub MCP กล่าวไว้ LLM อาจถูกหลอกให้ใช้สิทธิ์ทั้งหมดของ credential ได้ เนื่องจาก GitHub มี credential ที่กำหนดสิทธิ์ละเอียดได้ และบริษัทของเราก็เช่นกัน ผมจึงอยากให้ใครสักคนลองทำโปรโตคอลที่ wrapper สร้าง credential แบบละเอียด เพื่อส่งให้ LLM
ผมนึกภาพโครงสร้างที่ให้ credential ที่มีสิทธิ์แรงกว่าแก่แอปพลิเคชัน แล้วฝึก LLM ชั้นล่างให้ “ขอสิทธิ์” สำหรับงานหรือทรัพยากรเฉพาะ หากผู้ใช้อ許าต เฟรมเวิร์กก็จะรับ credential ที่จำกัด scope จากบริการมาใช้ในการเรียกเครื่องมือ
ต้องมีการตั้งค่าเครื่องมือที่ค่อนข้างซับซ้อน โดยเปิดเผยเครื่องมือ “ขอ credential เพิ่ม” และเมื่อถูกเรียกก็ถามผู้ใช้
เครื่องมือควรเก็บ credential ไว้เองและห้ามส่ง token จริงให้ LLM เด็ดขาด แต่ส่งสัญลักษณ์อย่าง
creds1แทน แล้วบอกให้เรียกด้วยcreds1ในคำขอต่อ ๆ ไปได้สงสัยว่าเคยเห็น paper นี้ไหม ถ้าสำคัญอย่างที่ดูเหมือน ผมคิดว่า metric นี้ควรอยู่ใน system card ทุกอันหรือเปล่า
เขาประเมิน LLM ยอดนิยม 12 รุ่นที่อ้างว่ารองรับ context 128K tokens ขึ้นไป พบว่าทำได้ดีใน context สั้น ๆ แต่ประสิทธิภาพลดลงมากเมื่อความยาว context เพิ่มขึ้น ที่ 32K มี 10 โมเดลตกลงไปต่ำกว่า 50% ของ baseline ที่ความยาวสั้น และแม้แต่ GPT-4o ซึ่งเป็นข้อยกเว้นที่ทำผลงานดี ก็ลดจาก 99.3% เหลือ 69.7%
https://arxiv.org/abs/2502.05167
เท่าที่รู้ ใน needle in a haystack test ตอนนี้ Gemini 2.5 Pro และ Gemini 2.5 Flash นำหน้าโมเดลอื่น ๆ อยู่มาก จึงอยากเห็นว่าถ้านำสองโมเดลนั้นมาทดสอบด้วยจะเป็นอย่างไร
สัปดาห์ที่แล้วทำเดโม แชตบอตสำหรับลูกค้าที่อิงข้อมูลกรรมสิทธิ์ ด้วย 0.26a0
องค์ประกอบหลักที่ต้องเขียนเองคือ system prompt, เครื่องมือสำหรับดึงข้อมูลภายนอก และเครื่องมือสำหรับคำนวณ และด้วยไลบรารีนี้ทำให้สร้างฟังก์ชันหลักได้ง่ายมาก
งานส่วนใหญ่ในเดโมหมดไปกับงานเดินท่อ ได้แก่ ทำให้บทสนทนาคงอยู่ รีเฟรชได้อย่างเป็นธรรมชาติแม้เบราว์เซอร์จะรีเฟรชเพราะปัญหาการเชื่อมต่อ และสร้างเว็บ UI ที่ดูดีสำหรับเริ่มเซสชันแชตใหม่
ผมไม่รู้จัก
after_call=printมาก่อน แต่ดีใจที่ได้รู้จากการอ่านบล็อกโพสต์ใช้เครื่องมือของ Simon ทุกวัน
ด้วย pipe และการสลับไปมาระหว่าง Ollama ในเครื่องกับโมเดลระยะไกลได้ง่าย ทำให้ทำงานสะดวกมาก