เมื่อเอเจนต์ CrewAI ทำงานเดียวกันซ้ำสองครั้ง สาเหตุส่วนใหญ่มักไม่ได้เกิดจากการตั้งค่า "งานซ้ำ" เพียงอย่างเดียว การทำซ้ำอาจเกิดจากคำอธิบายงานที่ซ้ำซ้อน การมอบหมายงานแบบลำดับชั้น พฤติกรรมการลองใหม่ ตัวกระตุ้น Flow หลายตัว การเริ่มงานของทีมซ้ำๆ หรือเครื่องมือที่มีผลข้างเคียงซึ่งไม่ได้รับการป้องกันด้วยคีย์การทำงานซ้ำซ้อน
เอกสารอ้างอิงเชิงปฏิบัติฉบับนี้ได้รับการตรวจสอบกับเอกสารอย่างเป็นทางการของ CrewAI เมื่อวันที่ 13 กันยายน 2026 เอกสารปัจจุบันอ้างอิงถึง CrewAI เวอร์ชัน 1.15.14 ข้อแตกต่างที่สำคัญที่สุดคือการป้องกันการใช้เหตุผลซ้ำซ้อนภายในรอบการทำงานเดียวแตกต่างจากการป้องกันไม่ให้การกระทำทางธุรกิจเดียวกันเกิดขึ้นซ้ำสองครั้งในรอบการทำงานต่างๆ CrewAI มีบริบทของงาน งานแบบมีเงื่อนไข ฟังก์ชันเรียกกลับ สถานะของ Flow การคงอยู่ของข้อมูล และการแคชเครื่องมือ แต่คุณยังคงต้องออกแบบเงื่อนไขการข้ามอย่างชัดเจนสำหรับงานที่ต้องทำเพียงครั้งเดียวเท่านั้น
วิเคราะห์อย่างรวดเร็ว: ทำไมจึงมีการทำงานแบบเดียวกันซ้ำสองครั้ง?
อาการ สาเหตุที่เป็นไปได้ วิธีแก้ไขแรกที่ควรลอง
เจ้าหน้าที่สองคนทำการวิจัยในหัวข้อเดียวกัน บทบาทหรือคำอธิบายงานที่ซ้ำซ้อนกัน มอบหมายผู้รับผิดชอบเพียงคนเดียวให้กับแต่ละงาน และส่งผลลัพธ์ก่อนหน้าผ่านไปcontext
ผู้จัดการขอให้ทำงานที่ตัวแทนคนอื่นทำเสร็จแล้ว การมอบหมายอำนาจตามลำดับชั้น บวกกับความรับผิดชอบที่ไม่ชัดเจน ชี้แจงคำแนะนำของผู้จัดการ บทบาทของตัวแทน และความเป็นเจ้าของเครื่องมือ
งานเดียวกันนี้จะถูกเรียกใช้งานซ้ำหลายครั้งหลังจากที่การตรวจสอบความถูกต้องล้มเหลว การลองใหม่ของราวกั้น ตรวจสอบข้อผิดพลาดของราวกั้นและลดข้อผิดพลาดลงguardrail_max_retriesในระหว่างการดีบัก
ตัวแทนเรียกใช้เครื่องมือเดิมซ้ำๆ งบประมาณการวนซ้ำสูง เงื่อนไขการหยุดที่ไม่ชัดเจน หรือการลองเรียกใช้เครื่องมือซ้ำ ลดระดับmax_iterและปรับผลลัพธ์ที่คาดหวังให้กระชับขึ้น และตรวจสอบบันทึกขั้นตอนต่างๆ
เมธอด Flow จะทำงานมากกว่าหนึ่งครั้ง วิธีการ หลาย@start()วิธีหรือเหตุการณ์ต้นทางหลายเหตุการณ์ ใช้จุดเข้าใช้งานจุดเดียว เราเตอร์ แฟล็กสถานะ หรือand_วิธีการอื่นที่เหมาะสม
การเปลี่ยนแปลงอีเมล/การชำระเงิน/API เกิดขึ้นสองครั้งหลังจากรีสตาร์ท ไม่มีการ์ดป้องกันการทำงานซ้ำซ้อน ใช้คีย์การดำเนินการแบบกำหนดค่าได้ในที่เก็บข้อมูลถาวรหรือที่เก็บข้อมูลธุรกรรมภายนอก
คุณเปิดใช้งานหน่วยความจำแล้ว แต่กระบวนการยังคงทำงานซ้ำ หน่วยความจำทำหน้าที่ให้บริบท ไม่ใช่ตัวลบข้อมูลซ้ำซ้อนในระดับตัวจัดตารางเวลา บันทึกงานที่เสร็จสมบูรณ์อย่างชัดเจน แทนที่จะอาศัยความจำ
คุณเปิดใช้งานแคชแล้ว แต่กระบวนการทั้งหมดกลับเริ่มต้นใหม่อีกครั้ง แคชของ CrewAI ได้รับการบันทึกไว้สำหรับผลลัพธ์การดำเนินการของเครื่องมือ เพิ่มตรรกะการข้ามระดับงานหรือที่เก็บข้อมูลความไม่เปลี่ยนแปลง
เอกสารอ้างอิงอย่างเป็นทางการ: CrewAI Tasks , CrewAI Agents และCrewAI Flows
1. เริ่มต้นด้วยการมีเจ้าของเพียงคนเดียวต่อหนึ่งหน่วยงาน
กฎป้องกันการทำงานซ้ำซ้อนที่ง่ายที่สุดและมีประสิทธิภาพที่สุดก็คือ: แต่ละหน่วยงานที่มีความหมายควรมีผู้รับผิดชอบงานเพียงคนเดียว ในกระบวนการ CrewAI แบบลำดับ งานต่างๆ จะทำงานตามลำดับที่ประกาศไว้contextคุณสมบัตินี้ช่วยให้งานในภายหลังสามารถใช้ผลลัพธ์ของงานก่อนหน้าได้ แทนที่จะค้นหาข้อมูลเดียวกันซ้ำอีกครั้งโดยอิสระ
การแยกความรับผิดชอบทำให้เข้าใจได้ง่ายขึ้น: งานหนึ่งทำการวิจัย งานถัดไปวิเคราะห์ผลการวิจัยแทนที่จะทำซ้ำ
รูปแบบที่ไม่พึงประสงค์ที่พบได้ทั่วไปมีลักษณะดังนี้ในเชิงแนวคิด:
research_task: "Research the customer and summarize findings"
analysis_task: "Research the customer, analyze findings, and recommend actions"
writer_task: "Review the customer, research missing details, and write the report"
ทั้งสามงานได้รับอนุญาตให้ค้นคว้าข้อมูล ดังนั้นจึงคาดการณ์ได้ว่าจะมีการค้นหาซ้ำ ควรเลือกใช้ลำดับการค้นหาที่แคบกว่านี้:
from crewai import Agent, Crew, Process, Task
research_task = Task(
description="Research the customer once and return verified facts and sources.",
expected_output="Structured research notes with sources.",
agent=researcher,
)
analysis_task = Task(
description="Analyze only the research provided in context. Do not perform new research.",
expected_output="Prioritized findings and recommendations.",
agent=analyst,
context=[research_task],
)
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
process=Process.sequential,
)
เอกสารอธิบายงานปัจจุบันของ CrewAI รองรับการพึ่งพาของงานอย่างชัดเจนผ่านทางcontextและกระบวนการแบบลำดับจะดำเนินการงานตามลำดับที่ระบุไว้ ดูเอกสารอธิบายการพึ่งพาของงาน และเอกสารอธิบายกระบวนการ อย่างเป็นทางการได้ที่ นี่
รายการตรวจสอบเชิงปฏิบัติสำหรับการกำหนดขอบเขตงาน
กำหนดคำกริยาที่แตกต่างกันให้กับแต่ละงาน เช่น ค้นคว้า ปรับมาตรฐาน วิเคราะห์ เขียน ตรวจสอบ
ระบุสิ่งที่งานนั้นไม่ ควร ทำเมื่อการทำงานซ้ำซ้อนมีค่าใช้จ่ายสูง
ทำให้ผลลัพธ์ที่คาดหวังมีความชัดเจนมากพอที่งานถัดไปสามารถนำไปใช้ได้โดยตรง
ส่งต่อผลลัพธ์ก่อนหน้าcontextแทนที่จะบอกตัวแทนในภายหลังว่า "ให้ทำการวิจัยเพิ่มเติมหากจำเป็น"
จำกัดการใช้งานเครื่องมือในระดับงานหรือระดับตัวแทน โดยอนุญาตให้เพียงบทบาทเดียวเท่านั้นที่สามารถค้นหา เขียนข้อมูลลงฐานข้อมูล ส่งข้อความ หรือเรียกใช้ API ภายนอกได้
2. ข้ามขั้นตอนการทำงานที่เสร็จสมบูรณ์แล้วด้วย ConditionalTask
หากจำเป็นต้องทำงานนั้นเฉพาะเมื่อผลลัพธ์ก่อนหน้านี้ไม่สมบูรณ์ อย่าปล่อยให้เอเจนต์ตัดสินใจเองว่าจะทำงานซ้ำหรือไม่ CrewAI มีConditionalTaskฟังก์ชันที่รับเอาผลลัพธ์จากงานก่อนหน้าเป็นเงื่อนไข และสามารถข้ามการทำงานได้เมื่อเงื่อนไขเป็นเท็จ
ตัวอย่างอย่างเป็นทางการใช้เงื่อนไขที่ตรวจสอบว่ามีการส่งคืนบันทึกเหตุการณ์เพียงพอหรือไม่ หากมีข้อมูลเพียงพออยู่แล้ว งานดึงข้อมูลเพิ่มเติมจะถูกข้ามไป ดูCrewAI Conditional Tasks
from typing import List
from pydantic import BaseModel
from crewai import Agent, Crew, Task
from crewai.tasks.conditional_task import ConditionalTask
from crewai.tasks.task_output import TaskOutput
class ResearchOutput(BaseModel):
sources: List[str]
summary: str
def needs_more_sources(output: TaskOutput) -> bool:
return len(output.pydantic.sources) < 5
research = Task(
description="Find up to five authoritative sources about the topic.",
expected_output="A structured research result.",
agent=researcher,
output_pydantic=ResearchOutput,
)
enrich = ConditionalTask(
description="Find only the missing sources needed to reach five total.",
expected_output="Additional authoritative sources only.",
condition=needs_more_sources,
agent=researcher,
)
รูปแบบนี้มีประสิทธิภาพมากกว่าการกระตุ้นตัวแทนด้วยข้อความว่า “หลีกเลี่ยงการทำงานซ้ำซ้อน” เนื่องจากการตัดสินใจข้ามขั้นตอนเป็นไปตามตรรกะแบบกำหนดได้ของ Python ไม่ใช่การตัดสินจากแบบจำลองภาษาอื่น
3. รู้ว่าเมื่อใดที่การมอบหมายงานทำให้เกิดการทำงานซ้ำซ้อนอย่างเห็นได้ชัด
CrewAI รองรับทั้งกระบวนการแบบลำดับและแบบลำดับชั้น ในทีมงานแบบลำดับชั้น ผู้จัดการจะจัดสรรงาน มอบหมายงาน ตรวจสอบผลลัพธ์ และพิจารณาว่างานเสร็จสมบูรณ์เป็นที่น่าพอใจหรือไม่ ความยืดหยุ่นนี้มีประโยชน์เมื่อการจัดสรรงานต้องมีความยืดหยุ่น แต่ก็หมายความว่าความรับผิดชอบจะไม่ชัดเจนเท่ากับในทีมงานแบบลำดับ
เอกสารประกอบการใช้งานเอเจนต์ของ CrewAI ระบุว่าallow_delegationค่าเริ่มต้นคือFalse. ให้คงค่าเริ่มต้นนี้ไว้สำหรับผู้เชี่ยวชาญ เว้นแต่ว่าเอเจนต์จำเป็นต้องมอบหมายงานให้เอเจนต์อื่นจริงๆ ในกระบวนการแบบลำดับชั้น ผู้จัดการเองเป็นผู้รับผิดชอบในการมอบหมายงาน ดูคู่มือเกี่ยวกับกระบวนการแบบลำดับชั้น
จุดเริ่มต้นที่ปลอดภัยสำหรับทีมงานที่ทำการโทรซ้ำซ้อนคือ:
researcher = Agent(
role="Researcher",
goal="Collect evidence once and return it in structured form.",
backstory="You gather evidence; you do not write the final report.",
allow_delegation=False,
max_iter=8,
max_retry_limit=1,
)
writer = Agent(
role="Writer",
goal="Write from supplied context without doing fresh research.",
backstory="You synthesize existing evidence into a final answer.",
allow_delegation=False,
max_iter=6,
)
จากนั้นค่อยเพิ่มการมอบหมายงานกลับเข้าไปเฉพาะในกรณีที่ก่อให้เกิดประโยชน์ที่วัดผลได้ หากไม่จำเป็นต้องมีการจัดการแบบลำดับชั้นProcess.sequentialการแก้ไขข้อผิดพลาดจะทำได้ง่ายกว่า เนื่องจากลำดับงานและการเป็นเจ้าของมีความชัดเจน
4. อย่าสับสนระหว่างการลองใหม่กับการกำหนดเวลาซ้ำซ้อน
การทำงานซ้ำบางอย่างเป็นพฤติกรรมที่คาดหวังได้ ระบบตรวจสอบความถูกต้องของงาน CrewAI สามารถตรวจสอบความถูกต้องของผลลัพธ์และส่งข้อเสนอแนะกลับไปยังเอเจนต์เมื่อการตรวจสอบความถูกต้องล้มเหลว เอกสารประกอบงานปัจจุบันระบุว่าguardrail_max_retriesค่าเริ่มต้นคือ 3 และระบบตรวจสอบความถูกต้องที่ล้มเหลวจะลองทำงานซ้ำได้จนถึงขีดจำกัดนั้น
นอกจากนี้ เอเจนต์ยังแสดงmax_retry_limitข้อผิดพลาดในการดำเนินการและmax_iterจำนวนรอบสูงสุดของเอเจนต์ก่อนที่จะสร้างคำตอบที่ดีที่สุดเท่าที่จะเป็นไปได้ เอกสารของเอเจนต์ในปัจจุบันระบุค่าเริ่มต้นไว้max_iterที่ 20 และขีดจำกัดการลองใหม่เมื่อเกิดข้อผิดพลาดเริ่มต้นที่ 2
กลไกเหล่านั้นแก้ปัญหาที่แตกต่างกัน:
การตั้งค่า สิ่งที่มันจำกัด ทำไมมันถึงดูซ้ำซ้อน
guardrail_max_retriesการลองใหม่หลังจากตรวจสอบความถูกต้องของผลลัพธ์งานล้มเหลว งานเดียวกันนี้ถูกดำเนินการซ้ำโดยเจตนาพร้อมกับระบบแจ้งเตือนข้อผิดพลาด
max_retry_limitลองใหม่หลังจากเกิดข้อผิดพลาดในการดำเนินการ ความพยายามที่ไม่สำเร็จอาจเรียกใช้เครื่องมือซ้ำอีกครั้ง
max_iterการให้เหตุผลของเอเจนต์/การทำซ้ำของเครื่องมือ ตัวแทนที่ไม่แน่นอนสามารถเรียกใช้เครื่องมือที่คล้ายกันหลายครั้งก่อนที่จะเสร็จสิ้น
ระหว่างการแก้ไขข้อผิดพลาด ให้ลดขีดจำกัดเหล่านี้ลงชั่วคราว หากปัญหาการทำซ้ำหายไป ให้ตรวจสอบว่าเหตุใดงานจึงไม่ผ่านการตรวจสอบ หรือเหตุใดเอเจนต์จึงเชื่อว่าจำเป็นต้องมีการทำซ้ำเครื่องมืออีกครั้ง อย่าตั้งค่าจำนวนการลองใหม่ทั้งหมดเป็นศูนย์ในสภาพแวดล้อมการใช้งานจริง การลองใหม่บางครั้งอาจเหมาะสมสำหรับความล้มเหลวชั่วคราว
5. ตรวจสอบสิ่งที่ถูกดำเนินการจริงก่อนที่จะเขียนข้อความแจ้งเตือนใหม่
บันทึกการดำเนินการช่วยแยกแยะการเรียกใช้งานงานที่สองที่แท้จริงออกจากขั้นตอนต่างๆ การลองใหม่ หรือการเรียกใช้เครื่องมือภายในงานเดียว
CrewAI มีกลไกการตรวจสอบหลายอย่าง ในระดับลูกเรือ เอกสารปัจจุบันประกอบด้วยverbose, step_callback, task_callback, output_log_file, และการควบคุมการติดตาม เอเจนต์ยังรองรับstep_callbackสิ่งเหล่านี้ด้วย ซึ่งมีประโยชน์ในการตอบคำถามสี่ข้อต่อไปนี้:
โปรแกรมกำหนดเวลาได้เริ่มงานเดียวกันสองครั้งหรือไม่?
มีเอเจนต์หนึ่งตัวที่ทำการวนซ้ำหลายครั้งภายในงานเดียวหรือไม่?
ระบบตรวจสอบข้อผิดพลาดปฏิเสธผลลัพธ์และทำให้เกิดการลองใหม่หรือไม่?
มีการเรียกใช้เครื่องมือซ้ำหรือไม่ แม้ว่าตัวงานเองจะทำงานเพียงครั้งเดียวก็ตาม?
สำหรับการตรวจสอบวินิจฉัยเบื้องต้น ให้เปิดใช้งานการแสดงผลแบบละเอียดและไฟล์บันทึก JSON:
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
process=Process.sequential,
verbose=True,
output_log_file="logs/crew-run.json",
)
จากนั้นคุณสามารถเพิ่มฟังก์ชันเรียกกลับ (callback) ได้หากต้องการตัวนับที่มีโครงสร้างหรือข้อมูลการวัดระยะทางแบบกำหนดเอง โปรดดูเอกสารเกี่ยวกับคุณลักษณะของลูกเรือของ CrewAI
6. ป้องกันการเกิดทริกเกอร์ Flow ซ้ำซ้อน
โฟลว์ก่อให้เกิดการทำซ้ำอีกรูปแบบหนึ่ง เอกสารประกอบโฟลว์ปัจจุบันของ CrewAI ระบุว่า@start()เมธอดที่ตรงตามเงื่อนไขทั้งหมดจะทำงานเมื่อโฟลว์เริ่มต้นหรือกลับมาทำงานต่อ หากคุณกำหนดการเริ่มต้นแบบไม่มีเงื่อนไขหลายครั้ง และสองในนั้นเริ่มต้นลูกเรือเดียวกันในที่สุด การทำซ้ำนั้นจะอยู่ในกราฟของคุณ ไม่ใช่ภายในลูกเรือ
ในทำนองเดียวกันor_ตัวรับฟังสามารถทำงานได้เมื่อใดก็ตามที่ เมธอดต้นทางส่งเอาต์พุตออกมา ตัวอย่างของ CrewAI เองแสดงให้เห็นว่าตัวรับฟังทำงานหนึ่งครั้งสำหรับเอาต์พุตต้นทางแต่ละครั้ง ใช้and_เมื่อการดำเนินการปลายทางควรจะรอจนกว่าเงื่อนไขเบื้องต้นหลายอย่างจะเสร็จสมบูรณ์ หรือใช้@router()เมื่อควรดำเนินการในสาขาเดียวเท่านั้น
ก่อนที่จะเพิ่มตัวที่สอง@start()ให้ถามตัวเองว่ามันเป็นจุดเริ่มต้นที่เป็นอิสระจริงหรือไม่ ถ้าไม่ ให้ใช้เมธอดเริ่มต้นเพียงวิธีเดียวและตัวรับฟังที่ชัดเจน
7. เพิ่มคีย์การเติมข้อความอัตโนมัติสำหรับการทำงานซ้ำที่ไม่ส่งผลซ้ำซ้อน
นี่คือรูปแบบการผลิตที่สำคัญที่สุดเมื่อภารกิจหนึ่งๆ มีผลข้างเคียงภายนอก เช่น การส่งอีเมล การเรียกเก็บเงินจากวิธีการชำระเงิน การสร้างบันทึก CRM การโพสต์ข้อความ หรือการเริ่มงาน
CrewAI Flows รองรับสถานะที่มีโครงสร้างและ@persistตัวตกแต่ง (decorator) การคงสถานะไว้ช่วยให้โฟลว์สามารถกู้คืนสถานะได้แม้หลังจากรีสตาร์ท อย่างไรก็ตาม สถานะที่คงไว้เพียงอย่างเดียวไม่สามารถตัดสินได้ว่าควรข้ามการดำเนินการทางธุรกิจหรือไม่ ควรจัดเก็บคีย์การดำเนินการที่แน่นอนของคุณเองและตรวจสอบก่อนที่จะดำเนินการผลข้างเคียง
ความคงทนและหน่วยความจำถือเป็นองค์ประกอบพื้นฐานที่มีประโยชน์ แต่ขั้นตอนการทำงานในการผลิตยังคงต้องการกฎ "เสร็จสมบูรณ์แล้วหรือยัง?" อย่างชัดเจนสำหรับขั้นตอนที่ต้องเกิดขึ้นเพียงครั้งเดียว
from hashlib import sha256
import json
from pydantic import BaseModel
from crewai.flow.flow import Flow, start
from crewai.flow.persistence import persist
class JobState(BaseModel):
completed_keys: list[str] = []
report: str = ""
def operation_key(customer_id: str, period: str) -> str:
payload = {"customer_id": customer_id, "period": period}
raw = json.dumps(payload, sort_keys=True).encode()
return sha256(raw).hexdigest()
@persist
class ReportFlow(Flow[JobState]):
@start()
def run_report(self):
key = operation_key("customer-123", "2026-09")
if key in self.state.completed_keys:
return self.state.report
result = reporting_crew.kickoff(
inputs={"customer_id": "customer-123", "period": "2026-09"}
)
self.state.report = result.raw
self.state.completed_keys.append(key)
return self.state.report
เอกสารของ CrewAI ระบุว่า@persistสามารถจัดเก็บสถานะของ Flow ได้แม้จะรีสตาร์ท และการกลับมาทำงานต่อด้วยรหัสสถานะเดิมจะโหลดสแนปช็อตล่าสุด โปรดดูเอกสารเกี่ยวกับการคงสถานะของ CrewAI Flow
ข้อควรระวังที่สำคัญในการผลิต: ตัวอย่างข้างต้นมีประโยชน์สำหรับการลดความซ้ำซ้อนของเวิร์กโฟลว์ทั่วไป แต่ไม่เพียงพอสำหรับผลข้างเคียงที่สำคัญทางการเงินหรือทางกฎหมาย กระบวนการอาจล้มเหลวหลังจากที่การดำเนินการภายนอกสำเร็จ แต่ก่อนที่คีย์การเสร็จสิ้นจะถูกบันทึก สำหรับพฤติกรรมที่แข็งแกร่งเหมือนการบันทึกเพียงครั้งเดียว ให้ใช้ที่เก็บข้อมูลธุรกรรมภายนอกหรือคีย์ความไม่เปลี่ยนแปลงของ API เป้าหมาย และบันทึกการดำเนินการแบบอะตอมิกเมื่อเป็นไปได้
8. ควรแคชการเรียกใช้เครื่องมือซ้ำๆ แต่ไม่ควรเข้าใจผิดว่าการแคชหมายถึงการทำงานซ้ำได้ของงาน
เอเจนต์และทีมงานของ CrewAI เปิดเผยข้อมูลบางอย่างcacheและเอกสารอย่างเป็นทางการอธิบายว่าเป็นการแคชผลลัพธ์การทำงานของเครื่องมือ เอกสารเอเจนต์ปัจจุบันแสดงให้เห็นว่าการแคชเปิดใช้งานโดยค่าเริ่มต้น และคำแนะนำด้านประสิทธิภาพแนะนำให้เปิดใช้งานไว้สำหรับการใช้งานเครื่องมือซ้ำๆ
วิธีนี้ช่วยได้เมื่อเอเจนต์ทำการค้นหาที่มีค่าใช้จ่ายสูงหรือเรียกใช้เครื่องมือแบบกำหนดผลลัพธ์ที่แน่นอนซ้ำกันมากกว่าหนึ่งครั้ง แต่ไม่ได้หมายความ ว่าการเรียกใช้crew.kickoff()สองครั้งจะข้ามงานของทีมไปโดยอัตโนมัติ งานนั้นยังคงอยู่ในกราฟการดำเนินการอยู่ดี
ใช้แคชสำหรับการอ่านซ้ำๆ ใช้คีย์ยืนยันการทำงานซ้ำสำหรับการเขียนซ้ำๆ
การดำเนินการ การป้องกันที่ต้องการ
ค้นหาเอกสารเดียวกัน แคชเครื่องมือ
นำความรู้เดิมมาใช้ซ้ำในงานต่างๆ บริบทของหน่วยความจำหรือภารกิจ
ข้ามขั้นตอนที่ไม่จำเป็นหากมีข้อมูลเพียงพออยู่แล้ว ConditionalTask
ป้องกันไม่ให้สาขา Flow ทำงานผิดพลาด เราเตอร์ เงื่อนไขสถานะand_หรือการออกแบบกราฟใหม่
ป้องกันการเขียนข้อมูลภายนอกซ้ำซ้อนระหว่างการลองใหม่/การเริ่มต้นใหม่ คีย์ความคงตัวแบบถาวรหรือที่เก็บข้อมูลธุรกรรมภายนอก
9. หน่วยความจำช่วยลดการค้นพบซ้ำ แต่ไม่ได้ยกเลิกภารกิจ
ระบบหน่วยความจำแบบรวมศูนย์ของ CrewAI จะจัดเก็บข้อเท็จจริงหลังจากเสร็จสิ้นภารกิจ และเรียกคืนบริบทที่เกี่ยวข้องก่อนเริ่มภารกิจ เอกสารปัจจุบันระบุว่า เมื่อเปิดใช้งานหน่วยความจำของลูกเรือ ข้อเท็จจริงเฉพาะจะถูกดึงออกมาจากผลลัพธ์ของภารกิจ และหน่วยความจำที่เกี่ยวข้องจะถูกแทรกเข้าไปในข้อความแจ้งเตือนภารกิจในภายหลัง
นั่นสามารถลดการค้นพบซ้ำที่ไม่จำเป็น โดยเฉพาะอย่างยิ่งเมื่อผู้เขียนควรรู้ว่านักวิจัยค้นพบอะไรไปแล้ว แต่หน่วยความจำคือบริบทของการเรียกใช้ ไม่ใช่ตัวบ่งชี้การข้าม งานที่กำหนดไว้อย่างชัดเจนจะยังคงทำงานต่อไป เว้นแต่ตรรกะของ Crew หรือ Flow จะตัดสินใจเป็นอย่างอื่น
ใช้หน่วยความจำสำหรับคำถาม “เรารู้อะไรไปแล้วบ้าง?” ใช้สถานะหรือภารกิจแบบมีเงื่อนไขสำหรับคำถาม “ควรดำเนินการนี้หรือไม่?” ดูรายละเอียดเพิ่มเติมได้ที่ CrewAI Memory
10. ใช้ผลลัพธ์ที่มีโครงสร้างเพื่อทำให้การตัดสินใจข้ามขั้นตอนมีความน่าเชื่อถือ
การแสดงผลในรูปแบบภาษาธรรมชาติเป็นเรื่องยากที่จะใช้ในการควบคุมเวิร์กโฟลว์แบบกำหนดได้ งานของ CrewAI สามารถส่งคืนเอาต์พุตในรูปแบบ Pydantic หรือ JSON ผ่านทางoutput_pydanticและoutput_jsonผลลัพธ์ที่มีโครงสร้างทำให้ตัดสินใจได้ง่ายขึ้นว่าจำเป็นต้องมีการเสริมข้อมูล การตรวจสอบ การยกระดับ หรือภารกิจอื่น ๆ หรือไม่
ตัวอย่างเช่น ส่งคืนค่า:
{
"status": "complete",
"sources_found": 7,
"missing_fields": [],
"needs_review": false
}
จากนั้นจึงกำหนดเส้นทางการจัดส่งโดยอิงตามฟิลด์แทนที่จะขอให้ตัวแทนคนอื่นตีความย่อหน้าที่เป็นข้อความ วิธีนี้มักจะช่วยลดทั้งงานซ้ำซ้อนและความกำกวมของคำถามได้
การกำหนดค่าป้องกันความซ้ำซ้อนที่แนะนำ
การจัดทำเช็คลิสต์แบบกระชับเพื่อทบทวนก่อนเพิ่มความซับซ้อนของโมเดลนั้นมีประโยชน์ เพราะปัญหาความซ้ำซ้อนส่วนใหญ่มักแก้ไขได้ง่ายกว่าในขั้นตอนการออกแบบงานและการควบคุมการไหลของงานก่อน
สำหรับกระบวนการวิจัยจนถึงการจัดทำรายงานโดยทั่วไป ควรเริ่มต้นอย่างระมัดระวัง:
researcher = Agent(
role="Researcher",
goal="Collect evidence once.",
backstory="Owns external research.",
allow_delegation=False,
max_iter=8,
max_retry_limit=1,
cache=True,
)
analyst = Agent(
role="Analyst",
goal="Analyze supplied evidence only.",
backstory="Does not repeat research.",
allow_delegation=False,
max_iter=6,
)
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
process=Process.sequential,
verbose=True,
cache=True,
output_log_file="logs/run.json",
)
จากนั้นค่อยเพิ่มความซับซ้อนเมื่อจำเป็นเท่านั้น:
เพิ่มหน่วยความจำ เมื่อจำเป็นต้องนำข้อมูลไปใช้ซ้ำในงานหรือการทำงานต่างๆ
เพิ่มConditionalTask เมื่อต้องการให้งานทำงานเฉพาะในกรณีที่ผลลัพธ์ก่อนหน้าไม่สมบูรณ์
ใช้ กระบวนการ แบบลำดับชั้น เมื่อจำเป็นต้องมีการจัดสรรผู้จัดการแบบไดนามิกอย่างแท้จริง
เปิดใช้งานการมอบหมายงาน เฉพาะสำหรับเอเจนต์ที่จำเป็นต้องส่งต่องานให้เพื่อนร่วมงานเท่านั้น
เพิ่มกลไกควบคุม คุณภาพของผลลัพธ์ พร้อมทั้งยอมรับว่าหากกลไกควบคุมใดล้มเหลว จะทำให้เกิดการลองใหม่โดยเจตนา
เพิ่มการคงสถานะ Flow เมื่อสถานะต้องคงอยู่หลังจากการรีสตาร์ท
เพิ่ม กลไกการป้องกันการ เกิดผลข้างเคียงซ้ำซ้อนจากภายนอก
รายการตรวจสอบการแก้ไขปัญหาขั้นสุดท้าย
มีการระบุรายการเดียวกันTaskซ้ำสองครั้งในรายการภารกิจของลูกเรือหรือไม่?
คำอธิบายงานสองแบบอนุญาตให้ทำการวิจัยหรือเรียกใช้เครื่องมือเดียวกันหรือไม่?
งานที่ทำในภายหลังสามารถใช้ประโยชน์จากงานที่ทำก่อนหน้าcontextได้หรือไม่?
งานที่ทำซ้ำควรจะเป็นอะไรConditionalTask?
คุณใช้การจัดการแบบลำดับชั้นในขณะที่การจัดการแบบตามลำดับก็เพียงพอแล้วใช่หรือไม่?
เปิดallow_delegationใช้งานในเอเจนต์ที่ไม่จำเป็นต้องใช้หรือไม่?
การปฏิเสธของ guardrail ทำให้เกิดการลองใหม่หรือไม่?
มีmax_iterขนาดใหญ่พอที่งานหนึ่งจะเรียกใช้เครื่องมือที่คล้ายกันหลายครั้งหรือไม่?
มี@start()วิธีการหรือor_ผู้ฟังหลายรายที่กำลังไล่ทีมงานปลายทางเดียวกันอยู่หรือไม่?
การเรียกใช้ งานครั้งที่สองนี้kickoff()หมายถึงการเรียกใช้งานใหม่โดยตั้งใจ หรือเป็นการเรียกใช้งานซ้ำโดยไม่ได้ตั้งใจ?
คุณกำลังพึ่งพาหน่วยความจำหรือแคชราวกับว่ามันเป็นตัวควบคุมการทำงานซ้ำซ้อนในระดับงานใช่หรือไม่?
การเขียนข้อมูลภายนอกมีคีย์ความคงที่ที่แน่นอนหรือไม่?
บันทึกการทำงานสามารถพิสูจน์ได้หรือไม่ว่าการสร้างซ้ำเกิดขึ้นในระดับงาน ขั้นตอนของเอเจนต์ เครื่องมือ หรือโฟลว์?
สรุปแล้ว
การหยุดการทำงานซ้ำซ้อนของ CrewAI ส่วนใหญ่เป็นปัญหาด้านการจัดการระบบ ควรระบุผู้รับผิดชอบอย่างชัดเจน เชื่อมโยงงานต่างๆ เข้าด้วยกันcontextข้ามงานที่เสร็จสมบูรณ์แล้วตามเงื่อนไข จำกัดขอบเขตการมอบหมายงาน ทำความเข้าใจว่าการลองใหม่นั้นเป็นไปโดยเจตนา และติดตามการทำงานก่อนที่จะเปลี่ยนแปลงข้อความแจ้งเตือน สำหรับ Flow และผลข้างเคียงในระบบการผลิต ควรทำมากกว่านั้นอีกขั้น: บันทึกคีย์การเสร็จสิ้นที่แน่นอน หรือใช้กลไกการทำงานซ้ำภายนอก
แบบจำลองทางความคิดที่มีประโยชน์นั้นเรียบง่าย: บริบทป้องกันการค้นพบซ้ำ เงื่อนไขป้องกันงานที่ไม่จำเป็น แคชป้องกันการคำนวณของเครื่องมือซ้ำ และความไม่เปลี่ยนแปลงป้องกันผลข้างเคียงซ้ำซ้อน แบบจำลอง เหล่านี้แก้ปัญหาที่คล้ายคลึงกัน แต่ไม่สามารถใช้แทนกันได้