ข้าม​ไป​ยัง​เนื้อหา

Evaluator-optimizer: generate → evaluate → refine — และ​เมื่อไร​ไม่​ควร reflect

สาม​บท​ที่​ผ่าน​มา​เรา​ไล่ workflow pattern ตาม​แนว BEA ที​ละ​ตัว — prompt chaining กับ routing (บท3), parallelization (บท4), orchestrator-workers (บท5) ทั้งหมด​คือ predefined code path ที่ code คุม​ทาง ไม่ใช่ loop ที่ model ขับ​เอง บท​นี้​คือ pattern สุดท้าย​ของ​ชุด​นั้น​ก่อน​เรา​ขึ้น​เรื่อง​ความ​ทนทาน (บท7) และ​มัน​มี​ลักษณะ​พิเศษ: มัน​คือ​รูป workflow ของ​สิ่ง​ที่​คน​ชอบ​เรียก​กันลอยๆ ว่า “ให้ agent ตรวจ​งาน​ตัวเอง” — generate → evaluate → refine และ​เพราะ​มัน​ฟัง​ดู​น่า​เชื่อ บท​นี้​จึง​ต้อง​ถ่วง​มัน​ด้วย​ความ​จริง​ตั้งแต่​ต้น: การ​ให้ model สะท้อน​งาน​ตัวเอง​ไม่ใช่​ชนะ​เสมอ​ไป

📦 code ตัวอย่าง

บท​นี้​ต่อยอด agent Order ตัว​เดิม (repo kaen-food-ordering — กำลัง​จัด​ทำ) เคส​ที่​เรา​จะ​ใช้​ทั้ง​บท: ร่าง​ข้อความ​อธิบาย​การ​คืน​เงิน​ให้​ลูกค้า แล้ว​เอา​มา​ตรวจ​กับ rubric ด้าน​นโยบาย/โทน​ก่อน​ส่ง — งาน​ที่​มี​เกณฑ์​ชัด​และ​การ​ขัดเกลา​ซ้ำ​มี​คุณค่า​ที่​วัด​ได้ code ใน​บท​นี้​ใช้ hand-rolled loop (แบบ​ที่ 1 จาก​บท1) ไม่ใช่ middleware — เพราะ​จุด​แทรก reflection เป็น​สิ่ง​ที่ knob ของ FunctionInvokingChatClient แสดงออก​ไม่​ได้ ทุก​กติกา API ฝั่ง​แชต​จาก​บท1 ยัง​ยึด​เดิม​ทุก​ข้อ กับ ทั้ง​สอง การ​เรียก (ทั้ง generator และ evaluator)

Evaluator-optimizerEvaluator-Optimizerworkflow ตาม BEA: 'one LLM call generates a response while another provides evaluation and feedback in a loop' — คือ​รูปแบบ workflow ของ reflection: draft → ประเมิน​กับ rubric → revise โดย cap จำนวน​รอบ​และ​หยุด​ทันที​เมื่อ evaluator ตอบ pass เหมาะ​เมื่อ​มี​เกณฑ์​ประเมิน​ชัด​และ​การ​ขัดเกลา​ซ้ำ​มี​คุณค่า​ที่​วัด​ได้ evaluator call คือ eval-at-runtime (เชื่อม​ไป #13 ไม่​สอน​ซ้ำ)Process คือ workflow ที่ BEA นิยามไว้ตรงๆ — “In the evaluator-optimizer workflow, one LLM call generates a response while another provides evaluation and feedback in a loop.” — หนึ่ง​การ​เรียก​ทำ​หน้าที่ generate อีก​หนึ่ง​ทำ​หน้าที่ evaluate + feedback แล้ว​วน​ขัดเกลา​กัน​ไป จุด​ที่​ต้อง​เน้น: evaluator ไม่ใช่ agent ตัว​ที่​สอง มัน​คือ​การ​เรียก model อีก​ครั้ง​ที่ codeคุม​วงอยู่ — เป็น predefined code path เต็ม​ตัว ไม่ใช่ loop อิสระ​ที่ model ขับ​เอง (นี่​คือ​เหตุผล​ที่​มัน​ยัง​นับ​เป็น workflow ไม่ใช่ autonomous agent)

BEA ยัง​ให้ litmus test ว่า​เมื่อไร pattern นี้​คุ้ม — “This workflow is particularly effective when we have clear evaluation criteria, and when iterative refinement provides measurable value.” — และ​ให้​สอง​สัญญาณ​ของ​ความ fit ไว้​ชัด: “LLM responses can be demonstrably improved when a human articulates their feedback; and second, that the LLM can provide such feedback.” อ่าน​สอง​ประโยค​นี้​เป็น​ด่าน​คัด​กรอง: ถ้า คน เขียน feedback แล้ว​คำ​ตอบดี​ขึ้น​ได้​จริง และ model เอง​ก็​ผลิต feedback แบบ​นั้น​ได้ — pattern นี้​ถึง​จะ​จ่าย​คืน ถ้า​ข้อ​ใด​ข้อ​หนึ่ง​ไม่​จริง คุณ​กำลัง​จะ​เผา token ฟรี

map ลงบน agent Order: generate คือ​ให้ generator ร่าง​ข้อความ​คืน​เงิน evaluate คือ​ให้ evaluator ตรวจ draft กับ rubric (“อ้าง​นโยบาย​ถูก​ไหม · โทน​สุภาพ​ไหม · ระบุ​จำนวน/กรอบ​เวลา​ชัด​ไหม”) แล้ว​คืน verdict + feedback refine คือ​ให้ generator แก้​ตาม feedback — วน​จนกว่า evaluator จะ​ตอบ pass หรือ ครบ​จำนวน​รอบ​ที่​ตั้ง​เพดาน​ไว้ ตัว​เพดาน​นั้น​สำคัญ และ​เรา​จะ​กลับ​มา​ที่​มัน​หลาย​รอบ​ใน​บท​นี้

reflection ไม่ใช่​ชนะ​เสมอ​ไป — มัน​ช่วย​เป็น​สัดส่วน​กับ​ความ grounded ของ​สัญญาณ

หัวข้อ​ที่​มีชื่อ​ว่า “reflection ไม่ใช่​ชนะ​เสมอ​ไป — มัน​ช่วย​เป็น​สัดส่วน​กับ​ความ grounded ของ​สัญญาณ”

ราก​ทาง​ความคิด​ของ evaluator-optimizer คือ reflectionReflectionการ​ที่ model สะท้อน​บน feedback แล้ว​วางแผน​ใหม่ (Reflexion, Self-Refine) — ⚠️ ไม่ใช่​ชนะ​เสมอ​ไป: ช่วย​เป็น​สัดส่วน​กับ​ความ grounded ของ​สัญญาณ reflection บน​สัญญาณ​จริง​จาก tool/oracle (เช่น unit test) เชื่อถือ​ได้ แต่ intrinsic self-correction ล้วน ๆ บน reasoning มัก​ไม่​ดี​ขึ้น​และ​บาง​ครั้ง​แย่​ลง (Huang et al., 'LLMs cannot self-correct reasoning yet') รู้​ว่า 'เมื่อไร​ไม่​ควร reflect' สำคัญ​พอ ๆ กับ​รู้​วิธี reflect และ​ทุกรอบ​คือ ≥1 model call เต็ม ๆ จึง​ต้อง cap เสมอProcess — การ​ที่ model สะท้อน​บน feedback แล้ว​วางแผน​ใหม่ งาน​วิจัย​สอง​ชิ้น​ที่​มัก​ถูก​อ้าง​คือ Reflexion กับ Self-Refine และนี่​คือ​แกน​ของ​บท​นี้: ทั้ง​คู่​ได้​ผล​จริง แต่​ได้​ผล​ด้วย​เหตุผล​ที่​ต่าง​กัน และ​เหตุผล​นั้น​คือ​สิ่ง​ที่​ตัดสิน​ว่า​เทคนิค​นี้​จะ​ช่วย agent ของ​คุณ​หรือ​ไม่

Reflexion ให้ agent สะท้อน​บน​สัญญาณ feedback ของ​งาน แล้ว​เก็บ​ข้อความ​สะท้อน​นั้น​ไว้​ใน​หน่วย​ความ​จำ — “Reflexion agents verbally reflect on task feedback signals, then maintain their own reflective text in an episodic memory buffer to induce better decision-making in subsequent trials.” — Shinn et al. รายงาน​ว่า “Reflexion achieves a 91% pass@1 accuracy on the HumanEval coding benchmark, surpassing the previous state-of-the-art GPT-4 that achieves 80%.” ⚠️ ตัวเลข 91% นี้​เป็น​ผล​ลง​วัน​ที่ เฉพาะ benchmark (HumanEval, งาน​เขียน code) — ที่​สำคัญ​กว่า​ตัวเลข​คือ มัน​ได้​ผล​เพราะ Reflexion ขี่​อยู่​บน​สัญญาณ​จริง: unit test บอก​ได้​ว่า code ผ่าน​หรือ​ไม่​ผ่าน การ​สะท้อน​จึง​มี ground truth ให้​เกาะ

Self-Refine คือ​รูป​ที่​ถูก​ที่สุด — modelตัว​เดียวเล่น​สาม​บทบาท — “Self-Refine does not require any supervised training data, additional training, or reinforcement learning, and instead uses a single LLM as the generator, refiner, and feedback provider.” — และ​รายงาน​ว่า “improving by ~20% absolute on average in task performance.” ⚠️ ~20% นี้​เป็น​ค่า​เฉลี่ย​ที่​ซ่อน​ความ​แปรปรวน​สูง​มาก​ระหว่าง​ชนิด​งาน บาง​งาน​ขึ้น​เยอะ บาง​งาน​แทบ​ไม่​ขยับ อย่า​อ่าน​มัน​เป็น​กฎ

แล้ว​ด้าน​มืด​ล่ะ? Huang et al. (Google DeepMind) ใน​งาน​ชื่อ​ตรง​ประเด็น​ว่า “Large Language Models Cannot Self-Correct Reasoning Yet” ชี้​ผล​ที่​ต้อง​จำ — “In the context of reasoning, our research indicates that LLMs struggle to self-correct their responses without external feedback, and at times, their performance even degrades after self-correction.” — คำ​ที่​ต้อง​ขีด​เส้น​ใต้​คือ degrades: บาง​ครั้ง​การ​ให้ model ตรวจ​งาน​เหตุผล​ของ​ตัวเอง ทำให้​คำ​ตอบ​แย่​ลง เขา​แยก​เคส​ที่​อันตราย​ไว้​ชัด — “Central to our investigation is the notion of intrinsic self-correction, whereby an LLM attempts to correct its initial responses based solely on its inherent capabilities, without the crutch of external feedback.”

เอา​สาม​ชิ้น​นี้​มา​ต่อ​กัน​จะ​ได้​กฎ​เดียว​ที่​ทั้ง​บท​หมุน​รอบ:

reflection ช่วย​เป็น​สัดส่วน​กับ​ความ grounded ของ​สัญญาณ​ที่​มัน​สะท้อน

Reflexion ได้​ผล​เพราะ unit test คือ external signal ที่​จริง Self-Refine ได้​ผล​ตรง​งาน​ที่ evaluator มี​เกณฑ์​เกาะ แต่ intrinsic self-correction ล้วนๆ บน reasoning — model ตรวจ​เหตุผล​ตัวเอง​โดย​ไม่มี​สัญญาณ​จาก​ภายนอก — คือ​เคส​ที่ Huang บอกว่า​อาจ​แย่​ลง เส้น​แบ่ง​นี้​คือ​ทุก​อย่าง: reflection บน​สัญญาณ​จาก tool/oracle เชื่อถือ​ได้ · reflection ที่ model เดา​เอา​เอง​ว่า​ตัวเอง​ผิด​ตรง​ไหน เชื่อ​ไม่​ได้

รู้​ว่า​เมื่อไร​ไม่​ควร reflect สำคัญพอๆ กับ​รู้​วิธี reflect นี่​คือ​รายการ​ตรวจ​ก่อน​คุณ​จะ​เสียบ evaluator เข้าไป:

  • ไม่มี​เกณฑ์​ตรวจ​ที่​ชัด → อย่า reflect ถ้า​คุณ​เขียน rubric ที่ checkable ไม่​ออก evaluator ก็​ไม่มี​อะไร​ให้​ยึด คุณ​จะ​ได้​แค่​ความ​เห็นสุ่มๆ ที่​แพง​ขึ้น​ทุกรอบ
  • reflection แก้ คุณภาพ/รูปแบบ/การ​อิง​นโยบาย ไม่​ได้​แก้ ข้อเท็จจริง​ที่​ขาด ถ้า​ข้อความ​คืน​เงิน​ผิด​เพราะ agent ไม่​เคย​เรียก getOrder เลย — ข้อมูล​จริง​มัน​หาย​ไป​ตั้งแต่​ต้น การ​ให้ model สะท้อน​ถ้อยคำ​ของ​ตัวเอง​ซ้ำ​สิบ​รอบ​ก็​ไม่​ทำให้​ข้อเท็จจริง​ที่​ไม่มี​อยู่​โผล่​มา สิ่ง​ที่​ต้อง​ทำ​คือ เรียก tool (กลับ​ไป​ที่ loop ปกติ​ของ​บท1) ไม่ใช่ reflection pass การ​สับสน​สอง​อย่าง​นี้​คือ​กับดัก​ที่​แพง​ที่สุด
  • ทุกรอบ reflection คือ ≥1 การ​เรียก model เต็มๆ และ​มัน​ส่ง transcript ทั้ง​ก้อน​กลับ​เข้าไป​ใหม่ — ต้นทุน​โต​ทุกรอบ จึง​ต้อง cap จำนวน​รอบ​เสมอ ไม่มี evaluator-optimizer ที่​วน​แบบ open-ended เพดาน​นี้​ผูก​ตรง​กับ cost meter ที่​เรา​จะ​ประกอบ​ใน 🔁 บท8 — autonomous capstone
  • ระวัง diminishing returns และ​การ​แกว่ง บาง​ครั้ง draft รอบ 3 ไม่​ได้​ดี​กว่า​รอบ 2 มัน​แค่ต่าง — evaluator เปลี่ยนใจ​ไป​มา หยุด​ทันที​ที่​ผ่าน​เกณฑ์ อย่า reflect เพื่อ reflect
  • ถ้า​เลือก​ได้ ให้ ground evaluator ดี​กว่า​ให้​มัน introspect evaluator ที่​ตรวจ​กับ​ผล​ของ tool จริง (เช่น “จำนวน​เงิน​ใน draft ตรง​กับ getOrder ไหม”) เชื่อ​ได้​กว่า evaluator ที่​แค่ “รู้สึก​ว่า​โทน​โอเค”

ใน​รูปทรง loop จาก​บท1 evaluator-optimizer แทรก​เป็น​ขั้น ทาง​เลือก ระหว่าง “ได้​ผลลัพธ์” กับ “จบ”: generate ผลออก​มา → evaluate → ถ้า​ไม่​ผ่าน​และ​ยัง​ไม่​ครบ​เพดาน ก็ refine แล้ว​วน evaluate ใหม่ นี่​คือ​เหตุผล​ที่​ต้อง​ใช้ hand-rolled loop: middleware .UseFunctionInvocation() วน call→execute→append→repeat ให้​อัตโนมัติ​ก็​จริง แต่​มันไม่มี knobให้​แทรก​ขั้น “เอา​ผล​ไป​ตรวจ​กับ rubric แล้ว​ตัดสิน​ใจ refine” คุณ​ต้อง​เป็น​เจ้าของ while เอง​ถึง​จะ​แทรก​งาน​ที่​ไม่ใช่ tool เข้า​กลางวง​ได้ (ตรง​กับ​ตาราง​เลือก loop ในบท1: hand-roll เมื่อ​ต้อง​แทรก​งาน​ที่​ไม่ใช่ tool ระหว่าง​เทิร์น)

และ​มี​จุด​ต่อสวยๆ กลับ​ไป​คอร์ส​ก่อน: ข้อความ​สะท้อน​ที่ evaluator ผลิต ไม่​จำเป็น​ต้อง​ตาย​ไป​กับ request นี้ — Reflexion เก็บ​มัน​ไว้​ใน episodic memory buffer ซึ่ง​คือ 🔁 memory layer ที่​คุณ​สร้าง​ใน คอร์ส #16 — context engineering reflection ที่​ดี​ใน​รอบ​นี้​กลาย​เป็น context ที่​ดี​ใน​รอบ​หน้า​ได้

flowchart TD
  T["งาน: ร่างข้อความคืนเงิน"] --> G["generate<br/>generator ร่าง draft"]
  G --> E{"evaluate<br/>evaluator ตรวจกับ rubric"}
  E -->|"pass — ผ่านเกณฑ์"| DONE["หยุดสำเร็จ<br/>ส่ง draft ให้ลูกค้า"]
  E -->|"ไม่ผ่าน · ยังไม่ครบเพดาน"| R["refine<br/>generator แก้ตาม feedback"]
  R --> E
  E -->|"ครบเพดานรอบ"| STOP["หยุดแบบมีขอบ<br/>ส่งดีที่สุด หรือ escalate"]
  classDef eval fill:#7c3aed,stroke:#4c1d95,color:#f8fafc;
  class E eval;

คำ​บรรยาย​ภาพ: วง generate → evaluate → refine มี​ทางออก​สองทาง ไม่ใช่​ทาง​เดียว — ช่อง​ม่วง​คือ evaluator ที่​ตัดสิน​ทุกรอบ: pass พา​ออก​ทาง​ซ้าย (หยุด​สำเร็จ) ส่วน​การ​ครบ​เพดาน​รอบ​พา​ออก​ทาง​ขวา (หยุด​แบบ​มี​ขอบ แล้ว escalate) — ไม่มี​ทาง​ที่​วน​ไม่รู้​จบ เพดาน​รอบ​คือ stop clause ที่​ทำให้ reflection ไม่​กลาย​เป็น​หลุม​เผา token

generator คือ IChatClient ตัว1 evaluator คือ อีก​ตัว​หนึ่ง​ที่ system prompt ของ​มัน​คือ rubric — เรา​อ่าน verdict แบบ​มี​โครงสร้าง​ด้วย overload GetResponseAsync<T> แล้ว​ป้อน feedback กลับ โดย cap รอบ​ไว้​แน่น​ตั้งแต่​ต้น:

// generator กับ evaluator เป็น IChatClient คนละตัว (คนละ system prompt) แต่กติกา API เดียวกันทุกข้อ:
// bare id "claude-opus-4-8" (ตัวอย่าง ณ 2026-07) · ไม่ส่ง temperature · อ่านผ่าน Contents[] ไม่ใช่ top-level .text
string draft = (await generator.GetResponseAsync(task, cancellationToken: ct)).Text; // .Text = convenience concat
for (int i = 0; i < 3; i++) { // เพดานรอบตายตัว — ห้าม open-ended
var eval = await evaluator.GetResponseAsync<Critique>( // T-overload = structured output; system prompt ของ evaluator คือ rubric
$"ตรวจ draft นี้กับ rubric\nงาน: {task}\nDraft: {draft}", cancellationToken: ct);
if (eval.Result.Passes) break; // ผ่าน → หยุดทันที อย่า reflect เพื่อ reflect
draft = (await generator.GetResponseAsync( // refine: ป้อน feedback ที่ ground แล้วกลับให้ generator
$"แก้ให้ผ่านประเด็นนี้: {eval.Result.Feedback}\nDraft เดิม: {draft}", cancellationToken: ct)).Text;
}
// ออกจาก loop ด้วย: ผ่านเกณฑ์ (break) หรือ ครบ 3 รอบ — ทั้งสองทางมี draft ล่าสุดในมือเสมอ
record Critique(bool Passes, string Feedback); // verdict ของ evaluator แบบมีโครงสร้าง

จุด​ที่​ต้อง​ยึด:

  • กติกา API เดิม​ของ​บท1 ใช้​กับ ทั้ง​สอง การ​เรียก — generator และ evaluator ต่าง​เป็น Claude หลัง NuGet Anthropic ตัว​ทางการ (beta) ผ่าน AsIChatClient id เปล่า claude-opus-4-8 · ไม่​ส่ง temperature/top_p/top_k · คำ​ตอบ​ดิบ​คือ Contents[] ไม่ใช่ .text ระดับ​บน (.Text ที่​เห็น​ใน code คือ convenience concatenation สำหรับ​หยิบ​ข้อความ​ล้วนๆ ของ draft)
  • เพดาน i < 3 ไม่ใช่​ของ​ประดับ มัน​คือ stop clause แท้ๆ — ทุกรอบ​คือ​การ​เรียก model อย่าง​น้อย​สอง​ครั้ง (evaluate + refine) เพดาน​นี้​ต่อ​ตรง​เข้า​กับ cost meter ของ​บท8
  • if (eval.Result.Passes) break; คือ​การ​หยุด​เชิง​บวก​ที่​ประหยัด​ที่สุด — ถ้า​รอบ​แรก​ผ่าน ก็​ไม่ refine เลย นี่​คือ​วินัย “อย่า reflect เพื่อ reflect” ที่​เขียน​เป็น code
❌ version ดิบ​ที่​ต้อง​เลี่ยง

while (true) { draft = refine(draft); } — reflection ที่​วน​ไม่มี​เพดาน ไม่มี evaluator ที่ ground และ​ไม่มี​ทางออก​เชิง​บวก คือ​หลุม​เผา token ที่ Huang et al. เตือน: ยิ่ง​วน คำ​ตอบ​ไม่​ได้​ยิ่ง​ดี บางที​แย่​ลง — และ​บิล​ค่า API ขึ้น​ทุกรอบ​แน่นอน reflection ต้อง​มี เกณฑ์ checkable + เพดาน​รอบ + ทางออก pass ครบ​ทั้ง​สาม​เสมอ

สังเกต​ว่า evaluator ที่​คุณ​เพิ่ง​เขียน ก็​คือ eval — มัน​ให้​คะแนน​ผล​ของ model กับ rubric เพียง​แต่​ทำ ตอน runtime ต่อ request แทนที่​จะ​ทำ offline เป็น​ชุด นี่​คือ​วินัย​เดียว​กับ​ที่ 🔁 คอร์ส #13 — evals for AI agents สอน​เต็มๆ: การ​เขียน rubric ที่​ดี การ​เลือก​เกณฑ์​ที่ checkable การ​ระวัง evaluator ที่​ลำเอียง

บท​นี้​จึงไม่​สอน​ซ้ำวิธี​เขียน rubric — ไป​เอา​จาก #13 สิ่ง​ที่ #17 ทำ​คือ นำ rubric ตัว​นั้น​มา​ใช้​เป็น​สัญญาณ​หยุด​ของ loop evaluator ที่ #13 สอน​ให้​คุณ​สร้าง คือ Critique ที่​ป้อน Passes/Feedback เข้า loop พูด​อีก​อย่าง: #13 สอน​ให้​คุณ สร้าง​ไม้บรรทัด — #17 เอา​ไม้บรรทัด​นั้น​มา​วาง​เป็น stop clause ใน​เครื่องยนต์

evaluator-optimizer คือ workflow ปิด​ชุด​ของ​เรา — generate → evaluate → refine ที่ code คุม​วง เป็น​รูป workflow ของ reflection แต่​บท​นี้​ยืน​อยู่​บน​ความ​จริง​ที่​ต้อง​ถือ​ติดตัว: reflection ช่วย​เป็น​สัดส่วน​กับ​ความ grounded ของ​สัญญาณ Reflexion (91% บน HumanEval) และ Self-Refine (~20% เฉลี่ย) เป็น​ผลลง​วัน​ที่ เฉพาะ​งาน ไม่ใช่​กฎ ส่วน intrinsic self-correction บน reasoning ล้วนๆ Huang เตือน​ว่า​อาจ แย่​ลง — รู้​ว่า​เมื่อไร​ไม่​ควร reflect (ไม่มี​เกณฑ์ checkable · ข้อเท็จจริง​ขาด · ไม่มี​เพดาน) สำคัญพอๆ กับ​รู้​วิธี reflect

ทั้ง workflow pattern ห้า​ตัว (บท3–6) มี​จุด​ร่วม​หนึ่ง​อย่าง​ที่​ยัง​ไม่​ได้​แตะ: มัน​สมมติ​ว่า tool ทำงาน​สำเร็จ แต่​ใน​โลก​จริง network ล่ม rate limit ชน issueRefund อาจ​ถูก​ยิง​ซ้ำ​จน​คืน​เงิน​สอง​รอบ บท​หน้า​เรา​เติม clause “error ที่​กู้​ไม่​ได้” ให้ stop policy และ​สอน​ให้ loop รักษา ตัวเอง​ไว้​เมื่อ​ของ​พัง — 🔁 บท7 — ความ​ทนทาน: tool-error recovery, retries, timeouts, idempotency


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​อิง​ต้นทาง​ที่​ลง​วัน​ที่​กำกับ อ่าน​ต่อ​ได้​โดยตรง:

เช็กความเข้าใจ — บทที่ 6

ข้อ 1 / 3

ในกรอบ BEA 'evaluator-optimizer' คืออะไร และทำไมมันยังนับเป็น workflow ไม่ใช่ autonomous agent?