Langroid
เป็นกรอบ Python ที่ใช้งานง่ายน้ำหนักเบาขยายได้และมีหลักการในการสร้างแอพพลิเคชั่นที่ขับเคลื่อนด้วย LLM ได้อย่างง่ายดายจากนักวิจัย CMU และ UW-Madison คุณตั้งค่าตัวแทนจัดเตรียมส่วนประกอบที่เป็นตัวเลือก (LLM ร้านค้าเวกเตอร์และเครื่องมือ/ฟังก์ชั่น) กำหนดงานและให้พวกเขาแก้ปัญหาร่วมกันโดยการแลกเปลี่ยนข้อความ กระบวนทัศน์หลายตัวแทนนี้ได้รับแรงบันดาลใจจากกรอบนักแสดง (แต่คุณไม่จำเป็นต้องรู้อะไรเกี่ยวกับเรื่องนี้!)
Langroid
เป็นสิ่งที่สดใหม่ในการพัฒนาแอพ LLM ซึ่งความคิดจำนวนมากได้ทำให้ประสบการณ์นักพัฒนาง่ายขึ้น มันไม่ได้ใช้ Langchain
หรือกรอบ LLM อื่น ๆ
อ่านภาพรวม (WIP) ของสถาปัตยกรรม Langroid
- บริษัท ต่างๆกำลังใช้/ปรับ Langroid ใน การผลิต นี่คือคำพูด:
Nullify ใช้ตัวแทน AI เพื่อการพัฒนาซอฟต์แวร์ที่ปลอดภัย พบจัดลำดับความสำคัญและแก้ไขช่องโหว่ เราได้ดัดแปลงกรอบการเตรียมการหลายตัวแทนของ Langroid ภายในการผลิตหลังจากประเมินลูกเรือ, autogen, langchain, langflow ฯลฯ เราพบว่า Langroid นั้นเหนือกว่ากรอบการทำงานเหล่านั้นในแง่ของความสะดวกในการติดตั้งและความยืดหยุ่น ตัวแทนและสิ่งที่เป็นนามธรรมของ Langroid นั้นใช้งานง่ายคิดออกมาดีและมอบประสบการณ์นักพัฒนาที่ยอดเยี่ยม เราต้องการวิธีที่เร็วที่สุดในการผลิต ด้วยเฟรมเวิร์กอื่น ๆ มันจะต้องใช้เวลาหลายสัปดาห์กับเรา แต่ด้วย Langroid เราได้ผลลัพธ์ที่ดีในไม่กี่นาที แนะนำเป็นอย่างยิ่ง!
- Jacky Wong หัวหน้า AI ที่ Nullify
ดูบทนำนี้ไปยังโพสต์บล็อก Langroid จากทีม LancingB
เพิ่งตีพิมพ์ใน ML for HealthCare (2024): ระบบ RAG หลายตัวแทนที่ใช้ Langroid สำหรับ pharmacovigilance ดูโพสต์บล็อก
เรายินดีต้อนรับการมีส่วนร่วม: ดูเอกสารการมีส่วนร่วมสำหรับแนวคิดเกี่ยวกับสิ่งที่จะมีส่วนร่วม
คุณกำลังสร้างแอปพลิเคชัน LLM หรือต้องการความช่วยเหลือเกี่ยวกับ Langroid สำหรับ บริษัท ของคุณหรือต้องการจัดลำดับความสำคัญของคุณสมบัติ Langroid สำหรับกรณีการใช้งานของ บริษัท ของคุณหรือไม่? Prasad Chalasani พร้อมให้คำปรึกษา (คำแนะนำ/การพัฒนา): Pchalasani ที่ Gmail dot com
การสนับสนุนยังได้รับการยอมรับผ่านผู้สนับสนุน GitHub
คำถามข้อเสนอแนะความคิด? เข้าร่วมกับเราใน Discord!
นี่เป็นเพียงทีเซอร์ มีอีกมากมายเช่นการเรียกใช้ฟังก์ชั่น/เครื่องมือการทำงานร่วมกันแบบหลายตัวแทนการสกัดข้อมูลที่มีโครงสร้าง, docchatagent (RAG), sqlchatagent, Local/Remote LLMs ที่ไม่ใช่ Openai ฯลฯ เลื่อนลงหรือดูเอกสารเพิ่มเติม ดู colab เริ่มต้นอย่างรวดเร็วของ Langroid ที่สร้างตัวอย่างการสกัดข้อมูล 2 ตัวแทนโดยใช้ OpenAI ChatCompletion API ดูรุ่นนี้ที่ใช้ OpenAI Assistants API แทน
เพิ่งเปิดตัว! ตัวอย่างสคริปต์แสดงวิธีที่คุณสามารถใช้ตัวแทนและเครื่องมือหลายชิ้นและเครื่องมือในการดึงข้อมูลที่มีโครงสร้างจากเอกสารโดยใช้ LLM ท้องถิ่นเท่านั้น (Mistral-7b-Instruct-V0.2)
import langroid as lr
import langroid . language_models as lm
# set up LLM
llm_cfg = lm . OpenAIGPTConfig ( # or OpenAIAssistant to use Assistant API
# any model served via an OpenAI-compatible API
chat_model = lm . OpenAIChatModel . GPT4o , # or, e.g., "ollama/mistral"
)
# use LLM directly
mdl = lm . OpenAIGPT ( llm_cfg )
response = mdl . chat ( "What is the capital of Ontario?" , max_tokens = 10 )
# use LLM in an Agent
agent_cfg = lr . ChatAgentConfig ( llm = llm_cfg )
agent = lr . ChatAgent ( agent_cfg )
agent . llm_response ( "What is the capital of China?" )
response = agent . llm_response ( "And India?" ) # maintains conversation state
# wrap Agent in a Task to run interactive loop with user (or other agents)
task = lr . Task ( agent , name = "Bot" , system_message = "You are a helpful assistant" )
task . run ( "Hello" ) # kick off with user saying "Hello"
# 2-Agent chat loop: Teacher Agent asks questions to Student Agent
teacher_agent = lr . ChatAgent ( agent_cfg )
teacher_task = lr . Task (
teacher_agent , name = "Teacher" ,
system_message = """
Ask your student concise numbers questions, and give feedback.
Start with a question.
"""
)
student_agent = lr . ChatAgent ( agent_cfg )
student_task = lr . Task (
student_agent , name = "Student" ,
system_message = "Concisely answer the teacher's questions." ,
single_round = True ,
)
teacher_task . add_sub_task ( student_task )
teacher_task . run ()
พ.ย. 2024:
Agent
S ด้วยรูปแบบเอาต์พุต JSON Schema ที่เข้มงวดบน LLM ที่เข้ากันได้และโหมดที่เข้มงวดสำหรับ OpenAI Tools APIQwen2.5-Coder-32b-Instruct
) โฮสต์บน GLHF.CHATต.ค. 2024:
ก.ย. 2024:
o1-mini
และ o1-preview
DocChatAgent
ใช้ Fusion Rank (RRF) ซึ่งกันและกันเพื่อจัดอันดับชิ้นที่ดึงมาโดยวิธีการต่าง ๆrun_batch_task
- stop_on_first_result
- อนุญาตให้ยกเลิกแบทช์ทันทีที่งานใด ๆ ส่งคืนผลลัพธ์ส.ค. 2024:
Task.run(), Task.run_async
ก.ค. 2024:
มิ.ย. 2024:
RewindTool
ที่ช่วยให้ตัวแทน "ย้อนกลับและทำซ้ำ" ข้อความที่ผ่านมา (และข้อความที่ขึ้นอยู่กับทั้งหมดจะถูกล้างออกด้วยการติดตามสายเลือด) อ่านบันทึกที่นี่พฤษภาคม 2024:
doc-chat
, db
(สำหรับการพึ่งพาที่เกี่ยวข้องกับฐานข้อมูล) ดูคำแนะนำการติดตั้งที่อัปเดตด้านล่างและในเอกสารexamples
ที่ชื่อ classMethod และตัวอย่างแบบสุ่มจากรายการนี้จะถูกใช้เพื่อสร้างตัวอย่าง 1-shot สำหรับ LLM สิ่งนี้ได้รับการปรับปรุงเพื่อให้คุณสามารถจัดหารายการตัวอย่างที่แต่ละตัวอย่างเป็นอินสแตนซ์เครื่องมือหรือ tuple ของ (คำอธิบายอินสแตนซ์เครื่องมือ) โดยที่คำอธิบายเป็น "ความคิด" ที่นำไปสู่ LLM เพื่อใช้เครื่องมือ (ดูตัวอย่างในเอกสาร) ในบางสถานการณ์สิ่งนี้สามารถปรับปรุงความแม่นยำในการสร้างเครื่องมือ LLM นอกจากนี้แทนที่จะเป็นตัวอย่างแบบสุ่มตัวอย่างทั้งหมดจะใช้เพื่อสร้างตัวอย่างไม่กี่นัดTaskConfig
เพียงตรวจจับลูป ที่แน่นอน แทนที่จะเป็นลูป โดยประมาณ ที่เอนทิตีพูดเป็นหลัก (แต่ไม่เหมือนกัน) ซ้ำ ๆRecipientTool
ด้วยการแลกเปลี่ยนว่าเนื่องจากไม่ใช่เครื่องมือจึงไม่มีวิธีที่จะบังคับใช้/เตือน LLM เพื่อระบุที่อยู่อย่างชัดเจน (ในสถานการณ์ที่มีความสำคัญ)DocChatAgent
gpt-4o
ตอนนี้เป็น LLM เริ่มต้นตลอด อัปเดตการทดสอบและตัวอย่างเพื่อทำงานกับ LLM นี้ ใช้ tokenizer ที่สอดคล้องกับ LLMgemini 1.5 pro
Support ผ่าน litellm
QdrantDB:
อัปเดตเพื่อรองรับการฝังตัวแบบเบาบางเม.ย. 2024:
chat_model="groq/llama3-8b-8192"
ดูการสอนTask.run(), Task.run_async(), run_batch_tasks
มี max_cost
และ max_tokens
params เพื่อออกเมื่อโทเค็นหรือค่าใช้จ่ายเกินขีด จำกัด ผลลัพธ์ ChatDocument.metadata
ตอนนี้มีฟิลด์ status
ซึ่งเป็นรหัสที่ระบุรหัสเหตุผลการทำงานให้สมบูรณ์ นอกจากนี้ task.run()
ฯลฯ สามารถเรียกใช้กับฟิลด์ session_id
ที่ชัดเจนซึ่งใช้เป็นคีย์ในการค้นหาการตั้งค่าต่าง ๆ ใน Redis Cache ปัจจุบันใช้เพื่อค้นหา "สถานะการฆ่า" เท่านั้น - สิ่งนี้อนุญาตให้ฆ่างานที่กำลังทำงานไม่ว่าจะโดย task.kill()
หรือโดย classmethod Task.kill_session(session_id)
ตัวอย่างเช่นการใช้งานดู test_task_kill
ในการทดสอบ/main/test_task.pyมี.ค. 2024:
DocChatAgent
ดูที่ test_doc_chat_agent.py
โดยเฉพาะอย่างยิ่ง test_doc_chat_batch()
; ยูทิลิตี้งานเรียกใช้งานใหม่: run_batch_task_gen
ซึ่งสามารถระบุตัวสร้างงานเพื่อสร้างงานหนึ่งงานต่ออินพุตDocChatAgent
จะทำงานกับ Image-PDFs)DocChatAgent
URLLoader
: ตรวจจับเวลาไฟล์จากส่วนหัวเมื่อ URL ไม่ได้จบลงด้วยคำต่อท้ายที่เป็นที่รู้จักเช่น .pdf
, .docx
ฯลฯsentence_transformer
พร้อมใช้งานหรือไม่unstructured
, haystack
, chromadb
, mkdocs
, huggingface-hub
, sentence-transformers
import langroid as lr
ก.พ. 2024:
chat_model="ollama/mistral"
ดูบันทึกย่อม.ค. 2024:
SQLChatAgent
) ดูตัวอย่างสคริปต์โดยใช้ตัวแทนนี้เพื่อตอบคำถามเกี่ยวกับการพึ่งพา Python PKG.doc
(นอกเหนือจาก .docx
)formatter
ที่เป็นตัวเลือกใน OpenAIGPTConfig
เพื่อให้แน่ใจว่าการจัดรูปแบบการแชทที่แม่นยำสำหรับ LLMS ในท้องถิ่นDocChatAgentConfig
มีพารามิเตอร์ใหม่: add_fields_to_content
เพื่อระบุฟิลด์เอกสารเพิ่มเติมเพื่อแทรกลงในฟิลด์ content
หลักเพื่อช่วยปรับปรุงการดึงธ.ค. 2023:
DocChatAgent
: Ingest Pandas dataframes และการกรองLanceDocChatAgent
ใช้ประโยชน์จาก LanceDB
VECTOR-DB สำหรับการค้นหาเวกเตอร์ที่มีประสิทธิภาพและการค้นหาและการกรองข้อความแบบเต็มLanceRAGTaskCreator
เพื่อสร้างระบบ 2-agent ซึ่งประกอบด้วย LanceFilterAgent
ที่ตัดสินใจตัวกรองและแบบสอบถามใหม่เพื่อส่งไปยังตัวแทน RAGTask
ที่ง่ายขึ้นด้วยการเริ่มต้น ChatAgent
พ.ย. 2023:
0.1.126: ตัวแทน OpenAiAssistant: การสนับสนุนการแคช
0.1.117: การสนับสนุนเครื่องมือ API ผู้ช่วย OpenAI: การเรียกใช้ฟังก์ชั่น, รหัสผู้ใช้และ Retriever (RAG), การอัปโหลดไฟล์ งานเหล่านี้ได้อย่างราบรื่นกับการทำงานของ Langroid จนกว่าเอกสารจะพร้อมควรเห็นตัวอย่างการใช้งานเหล่านี้:
การทดสอบ:
ตัวอย่างสคริปต์:
0.1.112: OpenAIAssistant
เป็นคลาสย่อยของ ChatAgent
ที่ใช้ประโยชน์จาก API ผู้ช่วย OpenAI ใหม่ มันสามารถใช้เป็นตัวแทนที่แบบดรอปอินสำหรับ ChatAgent
และอาศัยผู้ช่วย API เพื่อรักษาสถานะการสนทนาและใช้ประโยชน์จากเธรดและผู้ช่วยถาวรเพื่อเชื่อมต่อกับพวกเขาหากจำเป็น ตัวอย่าง: test_openai_assistant.py
, test_openai_assistant_async.py
0.1.111: สนับสนุนรุ่น OpenAI ล่าสุด: GPT4_TURBO
(ดู test_llm.py ตัวอย่างการใช้งาน)
0.1.110: อัพเกรดจาก Openai v0.x เป็น v1.1.1 (ในการเตรียมการสำหรับผู้ช่วย API และอื่น ๆ ); ( litellm
ปิดใช้งานชั่วคราวเนื่องจากความขัดแย้งของเวอร์ชัน OpenAI)
ต.ค. 2023:
DocChatAgent
Re-Rankers: rank_with_diversity
, rank_to_periphery
(แพ้ตรงกลาง)DocChatAgentConfig.n_neighbor_chunks > 0
อนุญาตให้ส่งกลับบริบทรอบการแข่งขันDocChatAgent
ใช้ RelevanceExtractorAgent
เพื่อให้ได้สารสกัด LLM ส่วนที่เกี่ยวข้องของ LangChain
โดยใช้ประโยคประโยคส่งผลให้ความเร็วสูงขึ้นและลดต้นทุนเมื่อเทียบกับวิธีการที่ไร้ LLMChainExtractor
import langroid as lr
ดูเอกสารสำหรับการใช้งานก.ย. 2023:
docx
(เบื้องต้น)SQLChatAgent
ที่ดึงข้อมูลสคีมาที่เกี่ยวข้องได้อย่างมีประสิทธิภาพเมื่อแปลภาษาธรรมชาติเป็น SQLส.ค. 2023:
GoogleSearchTool
เพื่อให้ตัวแทน (LLM) ทำการค้นหาของ Google ผ่านการเรียกใช้ฟังก์ชั่น/เครื่องมือ ดูตัวอย่างการแชทนี้สำหรับการเพิ่มเครื่องมือนี้ให้กับเอเจนต์ได้ง่ายเพียงใดSQLChatAgent
- ขอบคุณผู้สนับสนุนล่าสุดของเรา Rithwik Babu!กรกฎาคม 2023:
TableChatAgent
ในการแชทด้วยชุดข้อมูลแบบตาราง (dataframes, ไฟล์, URL): LLM สร้างรหัสแพนด้าและรหัสดำเนินการโดยใช้กลไกเครื่องมือ/ฟังก์ชั่นการโทรของ LangroidDocChatAgent
ยอมรับไฟล์หรือ URL ของ PDFสมมติว่าคุณต้องการดึงข้อมูลที่มีโครงสร้างเกี่ยวกับเงื่อนไขสำคัญของเอกสารการเช่าเชิงพาณิชย์ คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วย Langroid โดยใช้ระบบสองตัวแทนตามที่เราแสดงใน repo ตัวอย่างของ Langroid (ดูสคริปต์นี้สำหรับเวอร์ชันที่มีฟังก์ชั่นเดียวกันโดยใช้โมเดล Mistral-7B ในท้องถิ่น) การสาธิตแสดงเพียงไม่กี่คุณสมบัติหลายอย่างของ Langroid เช่น::
LeaseExtractor
เป็นหน้าที่ของงานและ LLM (GPT4) สร้างคำถามที่จะตอบโดย DocAgent
DocAgent
LLM (GPT4) ใช้การดึงข้อมูลจากร้านค้าเวกเตอร์เพื่อตอบคำถามของ LeaseExtractor
อ้างอิงข้อความที่ตัดตอนมาเฉพาะที่รองรับคำตอบLeaseExtractor
LLM จะแสดงข้อมูลในรูปแบบที่มีโครงสร้างโดยใช้ฟังก์ชั่นโทรนี่คือสิ่งที่ดูเหมือนว่าในการดำเนินการ (วิดีโอ MP4 ที่หยุดพักได้อยู่ที่นี่)
(สำหรับรายการที่ทันสมัยมากขึ้นโปรดดูที่ส่วนอัปเดต/เผยแพร่ด้านบน)
Task.run()
มีการลงนามประเภทเดียวกับวิธีการตอบกลับของตัวแทนและนี่คือกุญแจสำคัญในการทำงานของตัวแทนสามารถมอบหมายให้ทำงานย่อยอื่น ๆ ได้อย่างไรจากมุมมองของงานงานย่อยเป็นเพียงผู้ตอบกลับAgent
และ abstractions Task
ช่วยให้ผู้ใช้สามารถออกแบบตัวแทนที่มีทักษะเฉพาะห่อไว้ในงานและรวมงานในวิธีที่ยืดหยุ่นToolMessage
ที่เทียบเท่าซึ่งทำงานกับ LLM ใด ๆ ไม่ใช่แค่ OpenAI การเรียกใช้ฟังก์ชั่นและเครื่องมือมีอินเทอร์เฟซที่หันหน้าเข้าหานักพัฒนาซอฟต์แวร์เดียวกันโดยใช้ Pydantic ซึ่งทำให้ง่ายต่อการกำหนดเครื่องมือ/ฟังก์ชั่นและช่วยให้ตัวแทนสามารถใช้งานได้ ประโยชน์ของการใช้ pydantic คือคุณไม่จำเป็นต้องเขียนสเป็ค JSON ที่ซับซ้อนสำหรับการเรียกใช้ฟังก์ชันและเมื่อ LLM หลอน Malformed JSON ข้อความแสดงข้อผิดพลาด pydantic จะถูกส่งกลับไปยัง LLM เพื่อให้สามารถแก้ไขได้langroid
Langroid ต้องการ Python 3.11+ เราขอแนะนำให้ใช้สภาพแวดล้อมเสมือนจริง ใช้ pip
เพื่อติดตั้ง langroid
(จาก PYPI) ในเวอร์ชันที่เพรียวบาง (จาก PYPI) ไปยังสภาพแวดล้อมเสมือนจริงของคุณ:
pip install langroid
แพ็คเกจ Core Langroid ช่วยให้คุณใช้โมเดล OpenAI EMBEDDINGS ผ่าน API ของพวกเขา หากคุณต้องการใช้โมเดลที่ฝัง sentence-transformers
จาก HuggingFace ให้ติดตั้ง Langroid เช่นนี้:
pip install " langroid[hf-embeddings] "
สำหรับสถานการณ์ที่เป็นประโยชน์หลายอย่างคุณอาจต้องมีการพึ่งพาเพิ่มเติมเพิ่มเติม:
doc-chat
Extra: pip install " langroid[doc-chat] "
db
Extra: pip install " langroid[db] "
` `
pip install " langroid[doc-chat,db] "
all
(แต่โปรดทราบว่าสิ่งนี้จะส่งผลให้เวลาโหลด/เริ่มต้นนานขึ้นและขนาดการติดตั้งที่ใหญ่กว่า): pip install " langroid[all] "
หากคุณใช้ SQLChatAgent
(เช่น examples/data-qa/sql-chat/sql_chat.py
) ด้วย db postgres คุณจะต้อง:
sudo apt-get install libpq-dev
บน ubuntu,brew install postgresql
บน Mac ฯลฯpip install langroid[postgres]
หรือ poetry add langroid[postgres]
หรือ poetry install -E postgres
หากสิ่งนี้ทำให้คุณมีข้อผิดพลาดลอง pip install psycopg2-binary
ใน virtualenv ของคุณ หากคุณได้รับข้อผิดพลาดแปลก ๆ ที่เกี่ยวข้องกับ mysqlclient
ลองทำ pip uninstall mysqlclient
ตามด้วย pip install mysqlclient
ในการเริ่มต้นสิ่งที่คุณต้องการคือคีย์ OpenAI API หากคุณไม่มีให้ดูหน้า OpenAI นี้ (โปรดทราบว่าในขณะที่นี่เป็นวิธีที่ง่ายที่สุดในการเริ่มต้น Langroid ทำงานร่วมกับ LLM ใด ๆ ไม่เพียง แต่จาก OpenAI ดูคำแนะนำในการใช้ LLM แบบเปิด/ท้องถิ่นและ LLM ที่เป็นกรรมสิทธิ์อื่น ๆ ที่ไม่ใช่ Openai)
ในรูทของ repo คัดลอกไฟล์. .env-template
ไปยังไฟล์ใหม่ .env
:
cp .env-template .env
จากนั้นใส่คีย์ OpenAI API ของคุณ ไฟล์ .env
ของคุณควรมีลักษณะเช่นนี้ (องค์กรเป็นทางเลือก แต่อาจจำเป็นต้องใช้ในบางสถานการณ์)
OPENAI_API_KEY=your-key-here-without-quotes
OPENAI_ORGANIZATION=optionally-your-organization-id
หรือคุณสามารถตั้งค่าสิ่งนี้เป็นตัวแปรสภาพแวดล้อมในเชลล์ของคุณ (คุณจะต้องทำสิ่งนี้ทุกครั้งที่คุณเปิดเชลล์ใหม่):
export OPENAI_API_KEY=your-key-here-without-quotes
การตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้ทั้งหมดเป็นทางเลือกและบางอย่างจำเป็นต้องใช้คุณสมบัติเฉพาะ (ดังที่ระบุไว้ด้านล่าง)
.env
เป็นค่าของ MOMENTO_AUTH_TOKEN
(ดูตัวอย่างไฟล์ด้านล่าง).env
CACHE_TYPE=momento
(แทนที่จะเป็น CACHE_TYPE=redis
ซึ่งเป็นค่าเริ่มต้น)GoogleSearchTool
เท่านั้น หากต้องการใช้ Google Search เป็นเครื่องมือ LLM/ปลั๊กอิน/ฟังก์ชั่นโทรคุณจะต้องตั้งค่าคีย์ Google API จากนั้นตั้งค่าเครื่องมือค้นหาของ Google Search (CSE) และรับ CSE ID (เอกสารสำหรับสิ่งเหล่านี้อาจเป็นเรื่องที่ท้าทายเราขอแนะนำให้ขอคำแนะนำ GPT4 ทีละขั้นตอน) หลังจากได้รับข้อมูลประจำตัวเหล่านี้จัดเก็บไว้เป็นค่าของ GOOGLE_API_KEY
และ GOOGLE_CSE_ID
ในไฟล์ .env
ของคุณ เอกสารฉบับเต็มเกี่ยวกับการใช้สิ่งนี้ (และเครื่องมือ "ไร้สัญชาติ" อื่น ๆ ) กำลังจะมาเร็ว ๆ นี้ แต่ในระหว่างนี้ลองดูตัวอย่างการแชทนี้ซึ่งแสดงให้เห็นว่าคุณสามารถจัดเตรียมตัวแทนด้วย GoogleSearchtool
ได้อย่างง่ายดาย หากคุณเพิ่มตัวแปรเสริมเหล่านี้ไฟล์ .env
ของคุณควรมีลักษณะเช่นนี้:
OPENAI_API_KEY=your-key-here-without-quotes
GITHUB_ACCESS_TOKEN=your-personal-access-token-no-quotes
CACHE_TYPE=redis # or momento
REDIS_PASSWORD=your-redis-password-no-quotes
REDIS_HOST=your-redis-hostname-no-quotes
REDIS_PORT=your-redis-port-no-quotes
MOMENTO_AUTH_TOKEN=your-momento-token-no-quotes # instead of REDIS* variables
QDRANT_API_KEY=your-key
QDRANT_API_URL=https://your.url.here:6333 # note port number must be included
GOOGLE_API_KEY=your-key
GOOGLE_CSE_ID=your-cse-id
เมื่อใช้ Azure OpenAI ต้องใช้ตัวแปรสภาพแวดล้อมเพิ่มเติมในไฟล์. .env
หน้านี้ Microsoft Azure Openai ให้ข้อมูลเพิ่มเติมและคุณสามารถตั้งค่าตัวแปรแต่ละสภาพแวดล้อมดังนี้:
AZURE_OPENAI_API_KEY
จากค่าของ API_KEY
AZURE_OPENAI_API_BASE
จากค่าของ ENDPOINT
โดยทั่วไปดูเหมือน https://your.domain.azure.com
AZURE_OPENAI_API_VERSION
คุณสามารถใช้ค่าเริ่มต้นใน .env-template
และเวอร์ชันล่าสุดสามารถพบได้ที่นี่AZURE_OPENAI_DEPLOYMENT_NAME
เป็นชื่อของโมเดลที่ปรับใช้ซึ่งกำหนดโดยผู้ใช้ในระหว่างการตั้งค่าโมเดลAZURE_OPENAI_MODEL_NAME
AZURE OPENAI อนุญาตให้ชื่อโมเดลเฉพาะเมื่อคุณเลือกรุ่นสำหรับการปรับใช้ของคุณ คุณต้องใส่ชื่อโมเดลที่แน่นอนที่เลือกไว้อย่างแม่นยำ ตัวอย่างเช่น GPT-4 (ควรเป็น gpt-4-32k
หรือ gpt-4
)AZURE_OPENAI_MODEL_VERSION
เป็นสิ่งจำเป็นหาก AZURE_OPENAI_MODEL_NAME = gpt=4
ซึ่งจะช่วย Langroid ในการกำหนดค่าใช้จ่ายของโมเดล เราให้บริการที่เก็บตัวอย่างของ langroid-examples
เวอร์ชันผ่านภาพนักเทียบท่านี้ สิ่งที่คุณต้องทำคือตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์. .env
โปรดทำตามขั้นตอนเหล่านี้เพื่อตั้งค่าคอนเทนเนอร์:
# get the .env file template from `langroid` repo
wget -O .env https://raw.githubusercontent.com/langroid/langroid/main/.env-template
# Edit the .env file with your favorite editor (here nano), and remove any un-used settings. E.g. there are "dummy" values like "your-redis-port" etc -- if you are not using them, you MUST remove them.
nano .env
# launch the container
docker run -it --rm -v ./.env:/langroid/.env langroid/langroid
# Use this command to run any of the scripts in the `examples` directory
python examples/ < Path/To/Example.py >
เหล่านี้เป็นทีเซอร์ที่รวดเร็วเพื่อให้เห็นสิ่งที่คุณสามารถทำได้กับ Langroid และรหัสของคุณจะเป็นอย่างไร
langroid-examples
การแจ้งเตือนและคำแนะนำ LLM ต่างๆใน Langroid ได้รับการทดสอบให้ทำงานได้ดีกับ GPT-4 (และในระดับหนึ่ง GPT-4O) การเปลี่ยนไปใช้ LLM อื่น ๆ (ท้องถิ่น/เปิดและเป็นกรรมสิทธิ์) เป็นเรื่องง่าย (ดูคำแนะนำที่กล่าวถึงข้างต้น) และอาจพอเพียงสำหรับแอปพลิเคชันบางอย่าง แต่โดยทั่วไปคุณอาจเห็นผลลัพธ์ที่ต่ำกว่าเว้นแต่คุณจะปรับพรอมต์และ/หรือการตั้งค่าหลายตัวแทน
ดู Getting Started Guide
สำหรับการสอนโดยละเอียด
คลิกเพื่อขยายตัวอย่างรหัสใด ๆ ด้านล่าง ทั้งหมดนี้สามารถทำงานในสมุดบันทึก colab:
import langroid . language_models as lm
mdl = lm . OpenAIGPT ()
messages = [
lm . LLMMessage ( content = "You are a helpful assistant" , role = lm . Role . SYSTEM ),
lm . LLMMessage ( content = "What is the capital of Ontario?" , role = lm . Role . USER ),
]
response = mdl . chat ( messages , max_tokens = 200 )
print ( response . message )
cfg = lm . OpenAIGPTConfig (
chat_model = "local/localhost:8000" ,
chat_context_length = 4096
)
mdl = lm . OpenAIGPT ( cfg )
# now interact with it as above, or create an Agent + Task as shown below.
หากโมเดลได้รับการสนับสนุนโดย liteLLM
ไม่จำเป็นต้องเปิดตัวพร็อกซีเซิร์ฟเวอร์ เพียงตั้งค่าพารามิเตอร์ chat_model
ด้านบนเป็น litellm/[provider]/[model]
เช่น litellm/anthropic/claude-instant-1
และใช้วัตถุ config ดังกล่าวข้างต้น โปรดทราบว่าในการใช้ litellm
คุณต้องติดตั้ง Langroid ด้วย litellm
Extra: poetry install -E litellm
หรือ pip install langroid[litellm]
สำหรับรุ่นระยะไกลคุณจะต้องตั้งค่าปุ่ม API ฯลฯ เป็นตัวแปรสภาพแวดล้อม คุณสามารถตั้งค่าเหล่านั้นตามเอกสาร Litellm หากตัวแปรสภาพแวดล้อมที่จำเป็นหายไป Langroid จะให้ข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ระบุว่าต้องการตัวใด โปรดทราบว่าในการใช้ langroid
กับ litellm
คุณต้องติดตั้ง litellm
Extra เช่น pip install langroid[litellm]
ใน Env เสมือนของคุณหรือถ้าคุณกำลังพัฒนาภายใน langroid
Repo, poetry install -E litellm
pip install langroid[litellm]
import langroid as lr
agent = lr . ChatAgent ()
# get response from agent's LLM, and put this in an interactive loop...
# answer = agent.llm_response("What is the capital of Ontario?")
# ... OR instead, set up a task (which has a built-in loop) and run it
task = lr . Task ( agent , name = "Bot" )
task . run () # ... a loop seeking response from LLM or User at each turn
เกมของเล่นตัวเลขที่เมื่อได้รับหมายเลข n
:
repeater_task
เพียงแค่ส่งคืน n
,even_task
ส่งคืน n/2
ถ้า n
เป็นแม้กระทั่งอื่น ๆ พูดว่า "ไม่ควรรู้"odd_task
ส่งคืน 3*n+1
ถ้า n
เป็นคี่อื่นพูดว่า "ไม่ควรรู้" แต่ละ Task
เหล่านี้จะกำหนดค่า ChatAgent
เริ่มต้นโดยอัตโนมัติ
import langroid as lr
from langroid . utils . constants import NO_ANSWER
repeater_task = lr . Task (
name = "Repeater" ,
system_message = """
Your job is to repeat whatever number you receive.
""" ,
llm_delegate = True , # LLM takes charge of task
single_round = False ,
)
even_task = lr . Task (
name = "EvenHandler" ,
system_message = f"""
You will be given a number.
If it is even, divide by 2 and say the result, nothing else.
If it is odd, say { NO_ANSWER }
""" ,
single_round = True , # task done after 1 step() with valid response
)
odd_task = lr . Task (
name = "OddHandler" ,
system_message = f"""
You will be given a number n.
If it is odd, return (n*3+1), say nothing else.
If it is even, say { NO_ANSWER }
""" ,
single_round = True , # task done after 1 step() with valid response
)
จากนั้นเพิ่ม even_task
และ odd_task
เป็นงานย่อยของ repeater_task
และเรียกใช้ repeater_task
เตะมันออกด้วยตัวเลขเป็นอินพุต:
repeater_task . add_sub_task ([ even_task , odd_task ])
repeater_task . run ( "3" )
Langroid ใช้ประโยชน์จาก Pydantic เพื่อรองรับ API ที่เรียกใช้ฟังก์ชั่นของ OpenAI รวมถึงเครื่องมือดั้งเดิมของตัวเอง ประโยชน์คือคุณไม่จำเป็นต้องเขียน JSON ใด ๆ เพื่อระบุสคีมาและหาก LLM เห็นภาพหลอนเป็นไวยากรณ์เครื่องมือที่ไม่ถูกต้อง Langroid จะส่งข้อผิดพลาดการตรวจสอบความถูกต้องของ Pydantic (sanitized อย่างเหมาะสม) ไปยัง LLM
ตัวอย่างง่ายๆ: บอกว่าเอเจนต์มีรายการลับของตัวเลขและเราต้องการให้ LLM ค้นหาตัวเลขที่เล็กที่สุดในรายการ เราต้องการให้เครื่องมือ/ฟังก์ชั่น probe
LLM ซึ่งใช้หมายเลขเดียว n
เป็นอาร์กิวเมนต์ วิธีการจัดการเครื่องมือในเอเจนต์ส่งคืนจำนวนตัวเลขในรายการที่มากที่สุด n
ก่อนกำหนดเครื่องมือโดยใช้คลาส ToolMessage
ของ Langroid:
import langroid as lr
class ProbeTool ( lr . agent . ToolMessage ):
request : str = "probe" # specifies which agent method handles this tool
purpose : str = """
To find how many numbers in my list are less than or equal to
the <number> you specify.
""" # description used to instruct the LLM on when/how to use the tool
number : int # required argument to the tool
จากนั้นกำหนด SpyGameAgent
เป็น subclass ของ ChatAgent
ด้วย probe
วิธีการที่จัดการเครื่องมือนี้:
class SpyGameAgent ( lr . ChatAgent ):
def __init__ ( self , config : lr . ChatAgentConfig ):
super (). __init__ ( config )
self . numbers = [ 3 , 4 , 8 , 11 , 15 , 25 , 40 , 80 , 90 ]
def probe ( self , msg : ProbeTool ) -> str :
# return how many numbers in self.numbers are less or equal to msg.number
return str ( len ([ n for n in self . numbers if n <= msg . number ]))
จากนั้นเราจะสร้างอินสแตนซ์เอเจนต์และเปิดใช้งานให้ใช้และตอบสนองต่อเครื่องมือ:
spy_game_agent = SpyGameAgent (
lr . ChatAgentConfig (
name = "Spy" ,
vecdb = None ,
use_tools = False , # don't use Langroid native tool
use_functions_api = True , # use OpenAI function-call API
)
)
spy_game_agent . enable_message ( ProbeTool )
สำหรับตัวอย่างการทำงานแบบเต็มรูปแบบให้ดูสคริปต์แชท-agent-tool.py ใน repo langroid-examples
สมมติว่าคุณต้องการให้เอเจนต์แยกข้อกำหนดสำคัญของการเช่าจากเอกสารการเช่าเป็นโครงสร้าง JSON ที่ซ้อนกัน ก่อนกำหนดโครงสร้างที่ต้องการผ่านโมเดล Pydantic:
from pydantic import BaseModel
class LeasePeriod ( BaseModel ):
start_date : str
end_date : str
class LeaseFinancials ( BaseModel ):
monthly_rent : str
deposit : str
class Lease ( BaseModel ):
period : LeasePeriod
financials : LeaseFinancials
address : str
จากนั้นกำหนดเครื่องมือ LeaseMessage
เป็นคลาสย่อยของ ToolMessage
ของ Langroid หมายเหตุเครื่องมือมี terms
อาร์กิวเมนต์ที่จำเป็นของประเภท Lease
:
import langroid as lr
class LeaseMessage ( lr . agent . ToolMessage ):
request : str = "lease_info"
purpose : str = """
Collect information about a Commercial Lease.
"""
terms : Lease
จากนั้นกำหนด LeaseExtractorAgent
ด้วยวิธีการ lease_info
ที่จัดการเครื่องมือนี้สร้างอินสแตนซ์เอเจนต์และเปิดใช้งานเพื่อใช้และตอบสนองต่อเครื่องมือนี้:
class LeaseExtractorAgent ( lr . ChatAgent ):
def lease_info ( self , message : LeaseMessage ) -> str :
print (
f"""
DONE! Successfully extracted Lease Info:
{ message . terms }
"""
)
return json . dumps ( message . terms . dict ())
lease_extractor_agent = LeaseExtractorAgent ()
lease_extractor_agent . enable_message ( LeaseMessage )
ดูสคริปต์ chat_multi_extract.py
ใน repo langroid-examples
สำหรับตัวอย่างการทำงานเต็มรูปแบบ
Langroid จัดเตรียม DocChatAgent
คลาสตัวแทนพิเศษเพื่อจุดประสงค์นี้ มันรวมเอาเอกสารการฝังตัวการฝังพื้นที่เก็บข้อมูลในเวกเตอร์ -DB และการสร้างคำตอบแบบสอบถามแบบสืบค้นแบบสืบค้น การใช้คลาสนี้เพื่อแชทกับคอลเลกชันของเอกสารเป็นเรื่องง่าย ก่อนอื่นสร้างอินสแตนซ์ DocChatAgentConfig
ด้วยฟิลด์ doc_paths
ที่ระบุเอกสารเพื่อแชทด้วย
import langroid as lr
from langroid . agent . special import DocChatAgentConfig , DocChatAgent
config = DocChatAgentConfig (
doc_paths = [
"https://en.wikipedia.org/wiki/Language_model" ,
"https://en.wikipedia.org/wiki/N-gram_language_model" ,
"/path/to/my/notes-on-language-models.txt" ,
],
vecdb = lr . vector_store . QdrantDBConfig (),
)
จากนั้นสร้างอินสแตนซ์ DocChatAgent
(สิ่งนี้นำเสนอเอกสารลงในร้านค้าเวกเตอร์):
agent = DocChatAgent ( config )
จากนั้นเราสามารถถามคำถามตัวแทนออกไปได้
agent . llm_response ( "What is a language model?" )
หรือห่อมันใน Task
และเรียกใช้การวนซ้ำแบบโต้ตอบกับผู้ใช้:
task = lr . Task ( agent )
task . run ()
ดูสคริปต์การทำงานเต็มรูปแบบในโฟลเดอร์ docqa
ของ repo langroid-examples
การใช้ Langroid คุณสามารถตั้งค่า TableChatAgent
ด้วยชุดข้อมูล (เส้นทางไฟล์, URL หรือ DataFrame) และสอบถาม LLM ของเอเจนต์สร้างรหัสแพนด้าเพื่อตอบคำถามผ่านการเรียกใช้ฟังก์ชั่น (หรือเครื่องมือ/ปลั๊กอิน) และวิธีการจัดการฟังก์ชั่นของเอเจนต์จะดำเนินการรหัสและส่งคืนคำตอบ
นี่คือวิธีที่คุณสามารถทำได้:
import langroid as lr
from langroid . agent . special import TableChatAgent , TableChatAgentConfig
ตั้งค่า TableChatAgent
สำหรับไฟล์ข้อมูล url หรือ dataframe (ตรวจสอบให้แน่ใจว่าตารางข้อมูลมีแถวส่วนหัว; ตัวคั่น/ตัวคั่นถูกตรวจพบอัตโนมัติ):
dataset = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
# or dataset = "/path/to/my/data.csv"
# or dataset = pd.read_csv("/path/to/my/data.csv")
agent = TableChatAgent (
config = TableChatAgentConfig (
data = dataset ,
)
)
ตั้งค่างานและถามคำถามแบบครั้งเดียวเช่นนี้:
task = lr . Task (
agent ,
name = "DataAssistant" ,
default_human_response = "" , # to avoid waiting for user input
)
result = task . run (
"What is the average alcohol content of wines with a quality rating above 7?" ,
turns = 2 # return after user question, LLM fun-call/tool response, Agent code-exec result
)
print ( result . content )
หรือหรือตั้งค่างานและเรียกใช้ในลูปแบบโต้ตอบกับผู้ใช้:
task = lr . Task ( agent , name = "DataAssistant" )
task . run ()
สำหรับตัวอย่างการทำงานเต็มรูปแบบให้ดูสคริปต์ table_chat.py
ใน repo langroid-examples
ถ้าคุณชอบโครงการนี้โปรดให้ดาวและ? กระจายคำในเครือข่ายหรือโซเชียลมีเดียของคุณ:
การสนับสนุนของคุณจะช่วยสร้างแรงผลักดันและชุมชนของ Langroid