จะเพิ่มหน่วยความจำให้กับทั้ง Agent และเครื่องมือใน LangChain ได้อย่างไร

Ca Pheim Hnwy Khwam Ca Hi Kab Thang Agent Laea Kheruxng Mux Ni Langchain Di Xyangri



LangChain จัดเตรียมเครื่องมือที่จำเป็นทั้งหมดสำหรับการสร้างตัวแทนเพื่อควบคุมกระบวนการดึงข้อมูลสำหรับผู้ใช้ เครื่องมือเหล่านี้จำเป็นสำหรับการสร้างตัวแทนเนื่องจากจัดการงานโดยใช้เครื่องมือที่แตกต่างกัน เจ้าหน้าที่ยังจัดการเครื่องมือเหล่านี้เพื่อดำเนินการตามขั้นตอนและดำเนินกิจกรรมทั้งหมด รู้ว่าเครื่องมือใดที่จำเป็นสำหรับงาน และเมื่อใดที่ควรมอบหมายให้กับงานเฉพาะนั้น

โครงร่างด่วน

โพสต์นี้จะสาธิตสิ่งต่อไปนี้:

จะเพิ่มหน่วยความจำให้กับทั้ง Agent และเครื่องมือใน LangChain ได้อย่างไร

การเพิ่มหน่วยความจำให้กับเจ้าหน้าที่และเครื่องมือช่วยให้ทำงานได้ดีขึ้นด้วยความสามารถในการใช้ประวัติการแชทของโมเดล ด้วยหน่วยความจำ เอเจนต์สามารถตัดสินใจได้อย่างมีประสิทธิภาพว่าจะปรับใช้เครื่องมือใดและเมื่อใด แนะนำให้ใช้ “ อ่านอย่างเดียวหน่วยความจำ ” สำหรับทั้งตัวแทนและเครื่องมือ ดังนั้น พวกเขาจึงไม่สามารถแก้ไขได้ หากต้องการเรียนรู้กระบวนการเพิ่มหน่วยความจำให้กับทั้งเอเจนต์และเครื่องมือใน LangChain ให้ทำตามขั้นตอนที่แสดง:







ขั้นตอนที่ 1: การติดตั้งกรอบงาน

ก่อนอื่นให้ติดตั้งไฟล์ langchain-ทดลอง โมดูลเพื่อรับการขึ้นต่อกันสำหรับการสร้างโมเดลภาษาและเครื่องมือสำหรับเอเจนต์ การทดลองของ LangChain เป็นโมดูลที่ได้รับการพึ่งพาสำหรับการสร้างแบบจำลองอาคารที่ส่วนใหญ่ใช้สำหรับการทดลองและการทดสอบ:



pip ติดตั้ง langchain - - ทดลอง



รับ ผลการค้นหาของ Google โมดูลที่มีการพึ่งพา OpenAI เพื่อรับคำตอบที่เกี่ยวข้องมากที่สุดจากอินเทอร์เน็ต:





pip ติดตั้ง openai google - - ค้นหา - - ผลลัพธ์

ขั้นตอนที่ 2: การตั้งค่าสภาพแวดล้อม

ในการสร้างแบบจำลองที่ได้รับคำตอบจากอินเทอร์เน็ต จำเป็นต้องตั้งค่าสภาพแวดล้อมโดยใช้ OpenAI และ SerpAPi กุญแจ:



นำเข้า คุณ
นำเข้า รับผ่าน

คุณ. ประมาณ [ 'OPENAI_API_KEY' ] = รับผ่าน รับผ่าน ( 'คีย์ OpenAI API:' )
คุณ. ประมาณ [ 'SERPAPI_API_KEY' ] = รับผ่าน รับผ่าน ( 'คีย์ Serpapi API:' )

ขั้นตอนที่ 3: การนำเข้าไลบรารี

หลังจากตั้งค่าสภาพแวดล้อมแล้ว ให้นำเข้าไลบรารีเพื่อสร้างเครื่องมือสำหรับเอเจนต์และหน่วยความจำเพิ่มเติมเพื่อรวมเข้ากับไลบรารีเหล่านั้น โค้ดต่อไปนี้ใช้เอเจนต์ หน่วยความจำ llms เชน พรอมต์ และยูทิลิตีเพื่อรับไลบรารีที่จำเป็น:

จากแลงเชน. ตัวแทน นำเข้า ZeroShotAgent , เครื่องมือ , AgentExecutor
จากแลงเชน. หน่วยความจำ นำเข้า หน่วยความจำบัฟเฟอร์การสนทนา , อ่านอย่างเดียวหน่วยความจำที่ใช้ร่วมกัน
จากแลงเชน. llms นำเข้า OpenAI
#รับห้องสมุด สำหรับ การสร้างห่วงโซ่โดยใช้ LangChain
จากแลงเชน. ห่วงโซ่ นำเข้า LLMChain
จากแลงเชน. แจ้ง นำเข้า พรอมต์เทมเพลต
#รับห้องสมุด สำหรับ รับข้อมูลจากอินเทอร์เน็ต
จากแลงเชน. สาธารณูปโภค นำเข้า SerpAPIWrapper

ขั้นตอนที่ 4: การเพิ่ม ReadOnlyMemory

กำหนดค่าเทมเพลตสำหรับตัวแทนเพื่อเริ่มต้นการทำงานทันทีที่ผู้ใช้ป้อนข้อมูล หลังจากนั้นให้เพิ่ม “หน่วยความจำการสนทนาบัฟเฟอร์()” เพื่อจัดเก็บประวัติการแชทของโมเดลและเริ่มต้น “อ่านอย่างเดียวหน่วยความจำ” สำหรับตัวแทนและเครื่องมือ:

แม่แบบ = '' “นี่คือการสนทนาระหว่างมนุษย์กับบอท:

{แชท_ประวัติศาสตร์}
#กำหนดโครงสร้างการดึงข้อมูลสรุปที่แม่นยำและง่ายดาย
สรุปการแชทสำหรับ {input}:
'
''

พร้อมท์ = พรอมต์เทมเพลต ( input_variables = [ 'ป้อนข้อมูล' , 'แชท_ประวัติ' ] , แม่แบบ = แม่แบบ )
หน่วยความจำ = หน่วยความจำบัฟเฟอร์การสนทนา ( หน่วยความจำ_คีย์ = 'แชท_ประวัติ' )
หน่วยความจำแบบอ่านอย่างเดียว = อ่านอย่างเดียวหน่วยความจำที่ใช้ร่วมกัน ( หน่วยความจำ = หน่วยความจำ )
#ลูกโซ่สรุปรวมทุกองค์ประกอบ สำหรับ รับบทสรุปของการสนทนา
สรุป_chain = LLMChain (
llm = OpenAI ( ) ,
พร้อมท์ = พร้อมท์ ,
รายละเอียด = จริง ,
หน่วยความจำ = หน่วยความจำแบบอ่านอย่างเดียว ,
)

ขั้นตอนที่ 5: การตั้งค่าเครื่องมือ

ตอนนี้ ให้ตั้งค่าเครื่องมือ เช่น การค้นหาและสรุป เพื่อรับคำตอบจากอินเทอร์เน็ตพร้อมกับสรุปการแชท:

ค้นหา = SerpAPIWrapper ( )
เครื่องมือ = [
เครื่องมือ (
ชื่อ = 'ค้นหา' ,
ฟังก์ชั่น = ค้นหา. วิ่ง ,
คำอธิบาย = 'คำตอบที่เหมาะสมต่อคำถามที่ตรงเป้าหมายเกี่ยวกับเหตุการณ์ล่าสุด' ,
) ,
เครื่องมือ (
ชื่อ = 'สรุป' ,
ฟังก์ชั่น = สรุป_chain. วิ่ง ,
คำอธิบาย = 'มีประโยชน์ในการสรุปแชทและอินพุตของเครื่องมือนี้ควรเป็นสตริงเพื่อแสดงว่าใครจะอ่านบทสรุปนี้' ,
) ,
]

ขั้นตอนที่ 6: สร้างตัวแทน

กำหนดค่าตัวแทนทันทีที่เครื่องมือพร้อมที่จะทำงานที่จำเป็นและแยกคำตอบจากอินเทอร์เน็ต “ คำนำหน้า ” ตัวแปรจะถูกดำเนินการก่อนที่ตัวแทนจะมอบหมายงานใดๆ ให้กับเครื่องมือและ “ คำต่อท้าย ” จะถูกดำเนินการหลังจากที่เครื่องมือได้แยกคำตอบแล้ว:

คำนำหน้า = '' 'สนทนากับมนุษย์ โดยตอบคำถามต่อไปนี้ให้ดีที่สุดโดยเข้าถึงเครื่องมือต่อไปนี้:' ''
คำต่อท้าย = '' 'เริ่ม!'
#โครงสร้าง สำหรับ ตัวแทนเพื่อเริ่มใช้เครื่องมือในขณะที่ใช้หน่วยความจำ
{ แชท_ประวัติ }
คำถาม : : { ป้อนข้อมูล }
{ agent_scratchpad } '' '

prompt = ZeroShotAgent.create_prompt(
#configure เทมเพลตข้อความแจ้งเพื่อทำความเข้าใจบริบทของคำถาม
เครื่องมือ,
คำนำหน้า = คำนำหน้า
คำต่อท้าย=คำต่อท้าย,
input_variables=['
ป้อนข้อมูล , ' แชท_ประวัติ , ' agent_scratchpad '],
)

วิธีที่ 1: การใช้ ReadOnlyMemory

เมื่อเอเจนต์ถูกตั้งค่าให้รันเครื่องมือ โมเดลที่มี ReadOnlyMemory จะเป็น ที่ต้องการ วิธีสร้างและดำเนินการลูกโซ่เพื่อดึงคำตอบ โดยมีกระบวนการดังนี้

ขั้นตอนที่ 1: สร้างห่วงโซ่

ขั้นตอนแรกในวิธีนี้คือการสร้างห่วงโซ่และตัวดำเนินการสำหรับ “ZeroShotAgent()” ด้วยข้อโต้แย้งของมัน ที่ “LLMChain()” ใช้เพื่อสร้างการเชื่อมต่อระหว่างการแชททั้งหมดในโมเดลภาษาโดยใช้ llm และอาร์กิวเมนต์พร้อมท์ เอเจนต์ใช้ llm_chain เครื่องมือ และ verbose เป็นอาร์กิวเมนต์ และสร้าง agent_chain เพื่อดำเนินการทั้งเอเจนต์และเครื่องมือด้วยหน่วยความจำ:

llm_chain = LLMChain ( llm = OpenAI ( อุณหภูมิ = 0 ) , พร้อมท์ = พร้อมท์ )
ตัวแทน = ZeroShotAgent ( llm_chain = llm_chain , เครื่องมือ = เครื่องมือ , รายละเอียด = จริง )
agent_chain = AgentExecutor. from_agent_and_tools (
ตัวแทน = ตัวแทน , เครื่องมือ = เครื่องมือ , รายละเอียด = จริง , หน่วยความจำ = หน่วยความจำ
)

ขั้นตอนที่ 2: ทดสอบโซ่

โทรหา agent_chain ใช้เมธอด run() เพื่อถามคำถามจากอินเทอร์เน็ต:

agent_chain. วิ่ง ( ป้อนข้อมูล = “แลงเชนคืออะไร” )

ตัวแทนได้ดึงคำตอบมาจากอินเทอร์เน็ตโดยใช้เครื่องมือค้นหา:

ผู้ใช้สามารถถามคำถามติดตามผลที่ไม่ชัดเจนเพื่อทดสอบหน่วยความจำที่เชื่อมต่อกับเอเจนต์:

agent_chain. วิ่ง ( ป้อนข้อมูล = “ใครเป็นคนพัฒนามัน” )

ตัวแทนใช้การแชทก่อนหน้านี้เพื่อทำความเข้าใจบริบทของคำถามและดึงคำตอบตามที่แสดงในภาพหน้าจอต่อไปนี้:

เอเจนต์ใช้เครื่องมือ (summary_chain) เพื่อแยกข้อมูลสรุปของคำตอบทั้งหมดที่แยกออกมาก่อนหน้านี้โดยใช้หน่วยความจำของเอเจนต์:

agent_chain. วิ่ง (
ป้อนข้อมูล = “ขอบคุณครับ สรุปบทสนทนาของผมตอนอายุ 5 ขวบ”
)

เอาท์พุต
สรุปคำถามที่ถามก่อนหน้านี้แสดงไว้สำหรับเด็กอายุ 5 ปีในภาพหน้าจอต่อไปนี้:

ขั้นตอนที่ 3: การทดสอบหน่วยความจำ

พิมพ์หน่วยความจำบัฟเฟอร์เพื่อแยกการสนทนาที่เก็บไว้ในนั้น โดยใช้รหัสต่อไปนี้:

พิมพ์ ( agent_chain. หน่วยความจำ . กันชน )

การแชทตามลำดับที่ถูกต้องโดยไม่มีการแก้ไขใด ๆ ได้ถูกแสดงในส่วนย่อยต่อไปนี้:

วิธีที่ 2: การใช้หน่วยความจำเดียวกันสำหรับทั้งตัวแทนและเครื่องมือ

วิธีที่สองซึ่งแพลตฟอร์มไม่แนะนำคือการใช้หน่วยความจำบัฟเฟอร์สำหรับทั้งเอเจนต์และเครื่องมือ เครื่องมือสามารถเปลี่ยนการแชทที่เก็บไว้ในหน่วยความจำซึ่งอาจส่งคืนผลลัพธ์ที่ผิดพลาดในการสนทนาขนาดใหญ่:

ขั้นตอนที่ 1: สร้างห่วงโซ่

การใช้โค้ดที่สมบูรณ์จากเทมเพลตเพื่อสร้างเครื่องมือและเชนสำหรับเอเจนต์ที่มีการเปลี่ยนแปลงเล็กน้อยเนื่องจาก ReadOnlyMemory ไม่ได้ถูกเพิ่มในครั้งนี้:

แม่แบบ = '' “นี่คือการสนทนาระหว่างมนุษย์กับบอท:

{แชท_ประวัติศาสตร์}

เขียนสรุปการสนทนาสำหรับ {input}:
'
''
#สร้างโครงสร้างแชท อินเตอร์เฟซ โดยใช้เทมเพลตพร้อมต์โดยการเพิ่มหน่วยความจำด้วยสายโซ่
พร้อมท์ = พรอมต์เทมเพลต ( input_variables = [ 'ป้อนข้อมูล' , 'แชท_ประวัติ' ] , แม่แบบ = แม่แบบ )
หน่วยความจำ = หน่วยความจำบัฟเฟอร์การสนทนา ( หน่วยความจำ_คีย์ = 'แชท_ประวัติ' )
สรุป_chain = LLMChain (
llm = OpenAI ( ) ,
พร้อมท์ = พร้อมท์ ,
รายละเอียด = จริง ,
หน่วยความจำ = หน่วยความจำ ,
)
#สร้างเครื่องมือ ( ค้นหาและสรุป ) สำหรับ การกำหนดค่าตัวแทน
ค้นหา = SerpAPIWrapper ( )
เครื่องมือ = [
เครื่องมือ (
ชื่อ = 'ค้นหา' ,
ฟังก์ชั่น = ค้นหา. วิ่ง ,
คำอธิบาย = 'คำตอบที่เหมาะสมต่อคำถามที่ตรงเป้าหมายเกี่ยวกับเหตุการณ์ล่าสุด' ,
) ,
เครื่องมือ (
ชื่อ = 'สรุป' ,
ฟังก์ชั่น = สรุป_chain. วิ่ง ,
คำอธิบาย = 'มีประโยชน์ในการรับสรุปของการแชทและต้องการอินพุตสตริงในเครื่องมือนี้เพื่อแสดงว่าใครจะอ่านบทสรุปนี้' ,
) ,
]
#อธิบายขั้นตอน สำหรับ ตัวแทนใช้เครื่องมือในการดึงข้อมูล สำหรับ การแชท
คำนำหน้า = '' 'สนทนากับมนุษย์ ตอบคำถามด้วยวิธีที่ดีที่สุดเท่าที่จะเป็นไปได้โดยการเข้าถึงเครื่องมือต่อไปนี้:' ''
คำต่อท้าย = '' 'เริ่ม!'
#โครงสร้าง สำหรับ ตัวแทนเพื่อเริ่มใช้เครื่องมือในขณะที่ใช้หน่วยความจำ
{ แชท_ประวัติ }
คำถาม : : { ป้อนข้อมูล }
{ agent_scratchpad } '' '

prompt = ZeroShotAgent.create_prompt(
#configure เทมเพลตข้อความแจ้งเพื่อทำความเข้าใจบริบทของคำถาม
เครื่องมือ,
คำนำหน้า = คำนำหน้า
คำต่อท้าย=คำต่อท้าย,
input_variables=['
ป้อนข้อมูล , ' แชท_ประวัติ , ' agent_scratchpad '],
)
#integrate ส่วนประกอบทั้งหมดในขณะที่สร้างตัวแทนดำเนินการ
llm_chain = LLMChain(llm=OpenAI(อุณหภูมิ=0), พร้อมท์=พร้อมท์)
ตัวแทน = ZeroShotAgent (llm_chain=llm_chain, เครื่องมือ = เครื่องมือ, verbose = True)
agent_chain = AgentExecutor.from_agent_and_tools(
ตัวแทน = ตัวแทน, เครื่องมือ = เครื่องมือ, verbose = True, หน่วยความจำ = หน่วยความจำ
)

ขั้นตอนที่ 2: ทดสอบโซ่

เรียกใช้รหัสต่อไปนี้:

agent_chain. วิ่ง ( ป้อนข้อมูล = “แลงเชนคืออะไร” )

คำตอบถูกแสดงและเก็บไว้ในหน่วยความจำสำเร็จ:

ถามคำถามติดตามผลโดยไม่ต้องให้บริบทมากนัก:

agent_chain. วิ่ง ( ป้อนข้อมูล = “ใครเป็นคนพัฒนามัน” )

เจ้าหน้าที่ใช้หน่วยความจำเพื่อทำความเข้าใจคำถามโดยการแปลงคำถาม แล้วพิมพ์คำตอบ:

รับข้อมูลสรุปของการแชทโดยใช้หน่วยความจำที่แนบมากับตัวแทน:

agent_chain. วิ่ง (
ป้อนข้อมูล = “ขอบคุณครับ สรุปบทสนทนาของผมตอนอายุ 5 ขวบ”
)

เอาท์พุต
แยกข้อมูลสรุปได้สำเร็จ และจนถึงขณะนี้ทุกอย่างดูเหมือนจะเหมือนเดิม แต่การเปลี่ยนแปลงเกิดขึ้นในขั้นตอนต่อไป:

ขั้นตอนที่ 3: การทดสอบหน่วยความจำ

แยกข้อความแชทออกจากหน่วยความจำโดยใช้รหัสต่อไปนี้:

พิมพ์ ( agent_chain. หน่วยความจำ . กันชน )

เครื่องมือได้แก้ไขประวัติโดยเพิ่มคำถามอื่นที่ไม่ได้ถามตั้งแต่แรก สิ่งนี้เกิดขึ้นเมื่อโมเดลเข้าใจคำถามโดยใช้ ถามตัวเอง คำถาม. เครื่องมือคิดผิดว่าผู้ใช้ถามและถือว่าเป็นแบบสอบถามแยกต่างหาก ดังนั้นจึงเพิ่มคำถามนั้นเข้าไปในความทรงจำเช่นกัน ซึ่งจะนำไปใช้ในการทำความเข้าใจบริบทของการสนทนา:

นั่นคือทั้งหมดที่สำหรับตอนนี้.

บทสรุป

หากต้องการเพิ่มหน่วยความจำให้กับทั้งตัวแทนและเครื่องมือใน LangChain ให้ติดตั้งโมดูลเพื่อรับการขึ้นต่อกันและนำเข้าไลบรารีจากพวกเขา หลังจากนั้น ให้สร้างหน่วยความจำการสนทนา โมเดลภาษา เครื่องมือ และตัวแทนเพื่อเพิ่มหน่วยความจำ ที่ วิธีการที่แนะนำ ในการเพิ่มหน่วยความจำคือการใช้ ReadOnlyMemory กับตัวแทนและเครื่องมือในการจัดเก็บประวัติการสนทนา ผู้ใช้ยังสามารถใช้ หน่วยความจำการสนทนา สำหรับทั้งตัวแทนและเครื่องมือ แต่พวกเขาได้รับ สับสน บางครั้งและเปลี่ยนแชทในความทรงจำ