Langroid
هو إطار بيثون بديهي وخفيف الوزن وقابل للتمديد والمبدئي لبناء تطبيقات مدعوم من LLM بسهولة ، من باحثين CMU و UW-Madison. قمت بإعداد وكلاء ، وتجهيزهم بمكونات اختيارية (LLM ، ومتجر المتجهات والأدوات/الوظائف) ، وتعيين المهام ، وجعلها تحل مشكلة تعاونية عن طريق تبادل الرسائل. هذا النموذج متعدد الوكلاء مستوحى من إطار الممثل (لكنك لا تحتاج إلى معرفة أي شيء عن هذا!).
Langroid
هو تجربة جديدة على تطوير تطبيقات LLM ، حيث ذهب تفكير كبير في تبسيط تجربة المطور ؛ لا يستخدم Langchain
، أو أي إطار آخر LLM.
اقرأ نظرة عامة (WIP) على بنية Langroid
؟ الشركات تستخدم/تكييف langroid في الإنتاج . هنا اقتباس:
يستخدم Nullify وكلاء الذكاء الاصطناعي لتطوير البرمجيات الآمن. يجد ويضع الأولوية ويصلح نقاط الضعف. لقد قمنا بتكييف إطار التزامن متعدد الوكلاء في الإنتاج داخليًا ، بعد تقييم Crewai و Autogen و Langchain و Langflow ، إلخ. تجريد وكيل Langroid وتجريدات المهام بديهية ومدروسة جيدًا وتوفر تجربة مطور رائعة. أردنا أسرع طريقة للحصول على شيء في الإنتاج. مع أطر أخرى ، كان الأمر قد استغرقنا أسابيع ، ولكن مع Langroid ، حصلنا على نتائج جيدة في دقائق. موصى به للغاية!
- جاكي وونغ ، رئيس منظمة العفو الدولية في Nullify.
شاهد هذا المقدمة إلى منشور مدونة Langroid
نشرت للتو في ML للرعاية الصحية (2024): نظام خرقة متعدد الوكلاء يعتمد على Langroid
نرحب بالمساهمات: راجع وثيقة المساهمات لأفكار حول ما يساهم.
هل تقوم ببناء تطبيقات LLM ، أو تريد المساعدة في Langroid لشركتك ، أو ترغب في تحديد أولويات ميزات Langroid لحالات استخدام شركتك؟ Prasad Chalasani متاح للاستشارات (الاستشارية/التنمية): Pchalasani في Gmail Dot Com.
يتم قبول الرعاية أيضًا عبر رعاة Github
أسئلة ، ردود الفعل ، الأفكار؟ انضم إلينا في Discord!
هذا مجرد دعابة. هناك الكثير ، مثل استدعاء الوظائف/الأدوات ، والتعاون متعدد الوكلاء ، واستخراج المعلومات المهيكلة ، و docchatagent (RAG) ، و SQLChatagent ، و LLMs المحلية/غير البديلة ، وما إلى ذلك. راجع Langroid Quick-Start Colab الذي يبني على مثال مستثمر في الوكلاء باستخدام API Openai ChatCompletion. انظر أيضًا هذا الإصدار الذي يستخدم API API API Openai بدلاً من ذلك.
تم إصدارها للتو! مثال يوضح كيف يمكنك استخدام Langroid Multi-Agents وأدوات لاستخراج المعلومات المنظمة من مستند باستخدام 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 الصارم على LLMs المتوافقة والوضع الصارم لواجهة برمجة تطبيقات Openai.Qwen2.5-Coder-32b-Instruct
) المستضافة على GLHF.CHATأكتوبر 2024:
سبتمبر 2024:
o1-mini
و o1-preview
.DocChatAgent
0.14.0 Docchatagent الانصهار المتبادل (RRF) لترتيب القطع التي تم استردادها بطرق مختلفة.run_batch_task
خيار جديد - stop_on_first_result
- يسمح بإنهاء الدفعة بمجرد إرجاع أي مهمة.أغسطس 2024:
Task.run(), Task.run_async
.يوليو 2024:
يونيو 2024:
RewindTool
، تتيح للوكيل "الترجيح وإعادة" رسالة سابقة (ويتم مسح جميع الرسائل التابعة بفضل تتبع النسب). اقرأ الملاحظات هنا.مايو 2024:
doc-chat
، db
(للتبعيات المتعلقة بقاعدة البيانات). راجع تعليمات التثبيت المحدثة أدناه وفي المستندات.examples
مسماة classmethod ، وسيتم استخدام مثال عشوائي من هذه القائمة لإنشاء مثال 1 طلقة لـ LLM. لقد تم تحسين هذا حتى تتمكن الآن من توفير قائمة بالأمثلة حيث يكون كل مثال إما مثيلًا للأداة ، أو عبارة عن (الوصف ، مثيل الأداة) ، حيث يكون الوصف "فكر" يقود LLM إلى استخدام الأداة (انظر المثال في المستندات). في بعض السيناريوهات ، يمكن أن يحسن دقة توليد أدوات LLM. أيضًا ، الآن بدلاً من مثال عشوائي ، يتم استخدام جميع الأمثلة لإنشاء أمثلة قليلة.TaskConfig
. يكتشف فقط الحلقات الدقيقة ، بدلاً من الحلقات التقريبية حيث تقول الكيانات بشكل أساسي (ولكن ليس بالضبط نفس الأشياء) بشكل متكرر.RecipientTool
، مع المقايضة أنه نظرًا لأنها ليست أداة ، فلا توجد وسيلة لفرض/تذكير LLM لتحديد المرسل إليه بشكل صريح (في السيناريوهات التي يكون هذا أمرًا مهمًا).DocChatAgent
.gpt-4o
هو الآن الافتراضي LLM طوال الوقت ؛ تحديث الاختبارات والأمثلة للعمل مع هذا LLM ؛ استخدام Tokenizer المقابلة لـ LLM.gemini 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
للخروج عندما تتجاوز الرموز أو التكلفة حد. تتضمن النتيجة ChatDocument.metadata
الآن حقل status
وهو رمز يشير إلى رمز سبب إكمال المهمة. أيضا task.run()
etc يمكن استدعاء مع حقل session_id
صريح يستخدم كمفتاح للبحث عن إعدادات مختلفة في ذاكرة التخزين المؤقت Redis. يستخدم حاليًا فقط للبحث عن "حالة القتل" - وهذا يسمح بقتل مهمة تشغيل ، إما عن طريق 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
: إخراج بيانات Data Pandas والتصفية.LanceDocChatAgent
بتعزيز LanceDB
Vector-DB للبحث الفعال في المتجهات والبحث والتصفية النص الكامل.LanceRAGTaskCreator
لإنشاء نظام 2 وكيل يتكون من LanceFilterAgent
الذي يقرر مرشح واستعلام إعادة صياغة لإرساله إلى وكيل خرقة.Task
أبسط مع ChatAgent
الافتراضي.نوفمبر 2023:
0.1.126: OpenaiasSistant Agent: دعم التخزين المؤقت.
0.1.117: دعم أدوات API Assistant Assistant Assistant: استدعاء الوظائف ، والرمز ، و Retriever (RAG) ، تحميل الملفات. هذه تعمل بسلاسة مع orchestration من Langroid. حتى تصبح المستندات جاهزة ، من الأفضل رؤية أمثلة الاستخدام هذه:
الاختبارات:
مثال على البرامج النصية:
0.1.112: OpenAIAssistant
هو فئة فرعية من ChatAgent
التي تستفيد من API Assistant Assistant الجديد Openai. يمكن استخدامه كبديل ChatAgent
، ويعتمد على واجهة برمجة التطبيقات المساعد للحفاظ على حالة المحادثة ، ويعزز الخيوط والمساعدين المستمرة لإعادة الاتصال بهم إذا لزم الأمر. أمثلة: 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
Docchatagent: 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 ، Files ، URLs): LLM تقوم بإنشاء رمز Pandas ، ويتم تنفيذ الكود باستخدام آلية أداة/وظيفة دالة Langroid.DocChatAgent
الآن ملفات PDF أو عناوين URL.لنفترض أنك ترغب في استخراج معلومات منظمة حول الشروط الرئيسية لوثيقة الإيجار التجاري. يمكنك بسهولة القيام بذلك باستخدام Langroid باستخدام نظام ثنائي الكواحين ، كما نظهر في REPO Langroid-Amplames. (انظر هذا البرنامج النصي للحصول على إصدار مع نفس الوظيفة باستخدام نموذج MISTRAL-7B المحلي.) يعرض العرض التوضيحي عددًا قليلًا من ميزات Langroid العديدة ، مثل:
LeaseExtractor
مسؤول عن المهمة ، وإنشاء LLM (GPT4) يولد أسئلة يجب الإجابة عليها من قبل DocAgent
.DocAgent
LLM (GPT4) الاسترداد من متجر متجه للإجابة على أسئلة LeaseExtractor
، ويشير إلى المقتطف المحدد الذي يدعم الإجابة.LeaseExtractor
LLM المعلومات بتنسيق منظم باستخدام وظيفة دالة.إليكم ما يبدو في العمل (مقطع فيديو MP4 قابل للتوقف هنا).
(للاطلاع على قائمة أكثر حداثة ، انظر قسم التحديثات/الإصدارات أعلاه)
Task.run()
بنفس التوقيع على أساليب المستجيب للوكيل ، وهذه هي المفتاح لكيفية تفويض مهمة الوكيل إلى المهام الفرعية الأخرى: من وجهة نظر المهمة ، تكون المهام الفرعية ببساطة مستجيبين إضافيين ، لاستخدامها في أزياء مستديرة بعد المستجيبين للوكيل.Agent
Task
للمستخدمين تصميم الوكلاء بمهارات محددة ، ولفها في المهام ، ودمج المهام بطريقة مرنة.ToolMessage
المكافئة التي تعمل مع أي LLM ، وليس فقط Openai. تتمتع استدعاء الوظائف والأدوات بنفس الواجهة التي تواجه المطور ، والتي يتم تنفيذها باستخدام Pydantic ، مما يجعل من السهل جدًا تحديد الأدوات/الوظائف وتمكين الوكلاء من استخدامها. فوائد استخدام Pydantic هي أنك لا تضطر أبدًا إلى كتابة مواصفات JSON المعقدة للاتصال بالوظائف ، وعندما تتلألأ LLM JSON ، يتم إرسال رسالة خطأ Pydantic إلى LLM حتى تتمكن من إصلاحها.langroid
يتطلب Langroid Python 3.11+. نوصي باستخدام بيئة افتراضية. استخدم pip
لتثبيت إصدار رفيع من langroid
(من PYPI) إلى بيئتك الافتراضية:
pip install langroid
تتيح لك حزمة Langroid Core استخدام نماذج Openai للتضمينات عبر 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. راجع الأدلة لاستخدام LLMs المفتوح/المحلي ، وغيرها من LLMs غير المبين.)
في جذر الريبو ، انسخ ملف .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
SET CACHE_TYPE=momento
(بدلاً من CACHE_TYPE=redis
وهو الافتراضي).GoogleSearchTool
. لاستخدام Google Search كأداة/مكون إضافي/مكونات البرنامج المساعد LLM ، ستحتاج إلى إعداد مفتاح Google API ، ثم قم بإعداد محرك بحث Google Custom (CSE) والحصول على معرف CSE. (يمكن أن تكون الوثائق الخاصة بهذه التحديات ، نقترح أن نطلب من 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
عبر صورة Docker هذه. كل ما عليك فعله هو إعداد متغيرات البيئة في ملف .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). من السهل التحول إلى LLMS (المحلية/المفتوحة والملكية) أمرًا سهلاً (انظر الأدلة المذكورة أعلاه) ، وقد يكون كافياً لبعض التطبيقات ، ولكن بشكل عام قد ترى نتائج أدنى ما لم تقم بضبط المطالبات و/أو الإعداد متعدد الوكلاء.
انظر أيضًا Getting Started Guide
في برنامج تعليمي مفصل.
انقر لتوسيع أي من أمثلة التعليمات البرمجية أدناه. كل هذه يمكن تشغيلها في دفتر كولاب:
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
، فلن تكون هناك حاجة إلى تشغيل خادم الوكيل. ما عليك سوى تعيين param chat_model
أعلاه إلى litellm/[provider]/[model]
، مثل litellm/anthropic/claude-instant-1
واستخدم كائن التكوين على النحو الوارد أعلاه. لاحظ أنه لاستخدام litellm
، تحتاج إلى تثبيت langroid مع litellm
Extra: poetry install -E litellm
أو pip install langroid[litellm]
. بالنسبة للنماذج البعيدة ، ستحتاج عادةً إلى تعيين مفاتيح API وما إلى ذلك كمتغيرات بيئة. يمكنك تعيين تلك بناء على مستندات litellm. إذا كانت أي متغيرات بيئة مطلوبة مفقودة ، فإن Langroid يعطي رسالة خطأ مفيدة تشير إلى أي منها مطلوب. لاحظ أنه لاستخدام langroid
مع litellm
، تحتاج إلى تثبيت litellm
extra ، أي إما pip install langroid[litellm]
في env الظاهري الخاص بك ، أو إذا كنت تتطور داخل repo langroid
، 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
's LLM ببساطة إرجاع n
،even_task
n/2
إذا كان n
حتى ، يقول "لا تعرف"odd_task
's LLM 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 لدعم واجهة برمجة تطبيقات Openai الوظيفية بالإضافة إلى أدواتها الأصلية. الفوائد هي أنه لا يتعين عليك كتابة أي JSON لتحديد المخطط ، وأيضًا إذا كان LLM هلوسًا بناء جملة للأدوات المشوهة ، يرسل Langroid خطأ التحقق من صحة Pydantic (تم تطهيره بشكل مناسب) إلى LLM حتى يتمكن من إصلاحه!
مثال بسيط: قل أن الوكيل لديه قائمة سرية للأرقام ، ونريد أن تجد LLM أصغر رقم في القائمة. نريد أن نعطي LLM أداة/دالة probe
التي تأخذ رقمًا واحدًا n
كوسيطة. تقوم طريقة معالج الأدوات في الوكيل بإرجاع عدد الأرقام الموجودة في قائمته على n
.
حدد الأداة أولاً باستخدام فئة أدوات Langroid's ToolMessage
:
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
على أنه فئة فرعية من 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 )
للحصول على مثال عمل كامل ، راجع نص الدردشة على 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
كفئة فرعية من Langroid's ToolMessage
. لاحظ أن الأداة لها 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 الخاصة بالوكيل بإنشاء رمز Pandas للرد على الاستعلام ، عبر استدعاء الوظائف (أو الأداة/المكون الإضافي) ، وتنفيذ طريقة معالجة وظائف الوكيل الرمز وإرجاع الإجابة.
إليكم كيف يمكنك القيام بذلك:
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.