
حواجز حماية قابلة للبرمجة لتطبيقات الدردشة المعتمدة على نماذج اللغة الكبيرة (LLM): فرض قيود على الإدخال/الإخراج، حظر عمليات كسر الحماية (jailbreaks) وحقن الأوامر (prompt injections)، اكتشاف الهلوسة، وإخفاء البيانات الحساسة.
أحدث إصدار / نسخة التطوير: يتتبع الفرع develop أحدث تطورات الشجرة الرئيسية. أحدث إصدار مُطلق هو 0.23.0.
✨✨✨
📌 التوثيق الرسمي لمكتبة NeMo Guardrails متاح على docs.nvidia.com/nemo/guardrails.
✨✨✨
مكتبة NVIDIA NeMo Guardrails هي مجموعة أدوات مفتوحة المصدر لإضافة حواجز حماية قابلة للبرمجة بسهولة إلى تطبيقات المحادثة المعتمدة على LLM. حواجز الحماية (أو "الحواجز" اختصارًا) هي طرق محددة للتحكم في مخرجات نموذج اللغة الكبير، مثل عدم الحديث عن السياسة، والاستجابة بطريقة معينة لطلبات مستخدم محددة، واتباع مسار حوار محدد مسبقًا، واستخدام نمط لغوي معين، واستخراج بيانات منظمة، وغير ذلك.
تقدم هذه الورقة مكتبة NeMo Guardrails وتحتوي على نظرة عامة تقنية للنظام والتقييم الحالي.
Python 3.10, 3.11, 3.12 or 3.13.
للتثبيت باستخدام pip:```bash
pip install nemoguardrails
للحصول على تعليمات أكثر تفصيلاً، راجع [دليل التثبيت](https://docs.nvidia.com/nemo/guardrails/get-started/installation-guide).
## نظرة عامة
<!-- start-documentation-reuse -->
تمكّن مكتبة NeMo Guardrails المطوّرين الذين يبنون تطبيقات قائمة على LLM من إضافة **قواعد حماية قابلة للبرمجة** بين كود التطبيق و LLM.
<div align="center">
<img src="https://raw.githubusercontent.com/NVIDIA-NeMo/Guardrails/develop/docs/_static/images/programmable_guardrails.png" width="75%" alt="قواعد حماية قابلة للبرمجة">
</div>
تشمل الفوائد الرئيسية لإضافة *قواعد الحماية القابلة للبرمجة* ما يلي:
- **بناء تطبيقات قائمة على LLM جديرة بالثقة وآمنة ومأمونة:** يمكنك تعريف قواعد حماية لتوجيه المحادثات وحمايتها؛ ويمكنك اختيار تحديد سلوك تطبيقك القائم على LLM بشأن مواضيع محددة ومنعه من الانخراط في نقاشات حول مواضيع غير مرغوب فيها.
- **ربط النماذج والسلاسل والخدمات الأخرى بشكل آمن:** يمكنك ربط LLM بخدمات أخرى (المعروفة أيضًا باسم الأدوات) بسلاسة وأمان.
- **حوار قابل للتحكم:** يمكنك توجيه LLM لاتباع مسارات محادثة محددة مسبقًا، مما يتيح لك تصميم التفاعل وفقًا لأفضل ممارسات تصميم المحادثة وفرض إجراءات التشغيل القياسية (مثل المصادقة والدعم).
<!-- end-documentation-reuse -->
### الحماية من ثغرات LLM
توفر مكتبة NeMo Guardrails عدة آليات لحماية تطبيق دردشة مدعوم بـ LLM من ثغرات LLM الشائعة، مثل عمليات كسر الحماية (jailbreaks) وحقن التعليمات (prompt injections). فيما يلي نظرة عامة نموذجية على الحماية التي توفرها تكوينات قواعد الحماية المختلفة لمثال [ABC Bot](https://github.com/nvidia-nemo/guardrails/blob/develop/examples/bots/abc) المرفق في هذا المستودع. لمزيد من التفاصيل، يرجى الرجوع إلى صفحة [فحص ثغرات LLM](https://docs.nvidia.com/nemo/guardrails/evaluation/llm-vulnerability-scanning.html).
<div align="center">
<img src="https://raw.githubusercontent.com/NVIDIA-NeMo/Guardrails/develop/docs/_static/images/abc-llm-vulnerability-scan-results.png" width="500">
</div>
### حالات الاستخدام
يمكنك استخدام قواعد الحماية القابلة للبرمجة في أنواع مختلفة من حالات الاستخدام:
1. **الإجابة على الأسئلة** حول مجموعة من المستندات (المعروفة أيضًا باسم التوليد المعزز بالاسترجاع): فرض التحقق من الحقائق ومراقبة المخرجات.
2. **المساعدون المتخصصون في مجال معين** (المعروفون أيضًا باسم روبوتات الدردشة): ضمان بقاء المساعد في صلب الموضوع واتباع مسارات المحادثة المصممة.
3. **نقاط نهاية LLM**: أضف قواعد حماية إلى LLM المخصص لديك لتفاعل أكثر أمانًا مع العملاء.
4. **سلاسل LangChain** (اختياري): إذا كنت تستخدم LangChain لأي حالة استخدام، يمكنك إضافة طبقة قواعد حماية حول سلاسلك. لتفعيل هذا التكامل، عيّن متغير البيئة `NEMOGUARDRAILS_LLM_FRAMEWORK=langchain` أو استدعِ `set_default_framework("langchain")`.
### الاستخدام
لإضافة قواعد حماية قابلة للبرمجة إلى تطبيقك، يمكنك استخدام Python API أو خادم قواعد الحماية (انظر [دليل الخادم](https://docs.nvidia.com/nemo/guardrails/get-started/integrate-into-application) لمزيد من التفاصيل). استخدام Python API يشبه استخدام LLM مباشرة. استدعاء طبقة قواعد الحماية بدلاً من LLM يتطلب تغييرات طفيفة فقط في قاعدة الكود، ويتضمن خطوتين بسيطتين:
1. تحميل إعدادات قواعد الحماية وإنشاء مثيل من `LLMRails`.
2. إجراء الاستدعاءات إلى LLM باستخدام الطريقتين `generate`/`generate_async`.```python
from nemoguardrails import LLMRails, RailsConfig
# Load a guardrails configuration from the specified path.
config = RailsConfig.from_path("PATH/TO/CONFIG")
rails = LLMRails(config)
completion = rails.generate(
messages=[{"role": "user", "content": "Hello world!"}]
)
$ pip install evilginx2
ملاحظة: الأمر أعلاه يقوم بتثبيت
Evilginx 2مباشرةً بدلاً من حزمةevilginxعلى مستوى النظام.
cd evilginx2
make
``````json
{"role": "assistant", "content": "Hi! How can I help you?"}
تنسيق الإدخال والإخراج لطريقة generate مشابه لواجهة Chat Completions API من OpenAI.
مكتبة NeMo Guardrails هي مجموعة أدوات تعتمد على البرمجة غير المتزامنة أولاً، حيث يتم تنفيذ الآليات الأساسية باستخدام نموذج Python غير المتزامن. تحتوي الطرق العامة على نسختين: متزامنة وغير متزامنة. على سبيل المثال: LLMRails.generate و LLMRails.generate_async.
يمكنك استخدام NeMo Guardrails مع نماذج لغات كبيرة متعددة مثل OpenAI GPT-3.5 وGPT-4 وLLaMa-2 وFalcon وVicuna أو Mosaic. لمزيد من التفاصيل، راجع قسم نماذج LLM المدعومة في دليل الإعدادات.
تدعم مكتبة NeMo Guardrails خمسة أنواع رئيسية من حواجز الحماية:
حواجز الإدخال: تُطبَّق على مدخلات المستخدم؛ يمكن لحاجز الإدخال رفض الإدخال، مما يوقف أي معالجة إضافية، أو تعديل الإدخال (مثل إخفاء البيانات الحساسة أو إعادة الصياغة).
حواجز الحوار: تؤثر على طريقة توجيه الاستعلامات إلى LLM؛ تعمل حواجز الحوار على رسائل الشكل المتعارف عليه، وللتفاصيل انظر دليل Colang) وتحدد ما إذا كان يجب تنفيذ إجراء، أو ما إذا كان يجب استدعاء LLM لتوليد الخطوة التالية أو الرد، أو ما إذا كان يجب استخدام رد محدد مسبقًا بدلاً من ذلك، وما إلى ذلك.
حواجز الاسترجاع: تُطبَّق على الأجزاء المسترجعة في سيناريو RAG (التوليد المعزز بالاسترجاع)؛ يمكن لحاجز الاسترجاع رفض جزء معين، مما يمنع استخدامه في توجيه LLM، أو تعديل الأجزاء ذات الصلة (مثل إخفاء البيانات الحساسة).
حواجز التنفيذ: تُطبَّق على مدخلات ومخرجات الإجراءات المخصصة (المعروفة أيضًا بالأدوات) التي يحتاج LLM إلى استدعائها.
حواجز الإخراج: تُطبَّق على المخرجات التي يولدها LLM؛ يمكن لحاجز الإخراج رفض المخرجات، مما يمنع إعادتها إلى المستخدم، أو تعديلها (مثل إزالة البيانات الحساسة).
يحدد إعداد حواجز الحماية LLM(s) المطلوب استخدامها وحاجز حماية واحدًا أو أكثر. يمكن أن يتضمن إعداد حواجز الحماية أي عدد من حواجز الإدخال/الحوار/الإخراج/الاسترجاع/التنفيذ. أي إعداد بدون حواجز مهيأة سيحوّل الطلبات إلى LLM بشكل أساسي.
الهيكل القياسي لمجلد إعداد حواجز الحماية يبدو كما يلي:``` . ├── config │ ├── actions.py │ ├── config.py │ ├── config.yml │ ├── rails.co │ ├── ...
يحتوي ملف `config.yml` على جميع خيارات التهيئة العامة، مثل نماذج LLM، وactive rails، وبيانات التهيئة المخصصة". ويحتوي ملف `config.py` على أي كود تهيئة مخصص، ويحتوي `actions.py` على أي إجراءات python مخصصة. للحصول على نظرة عامة كاملة، راجع [دليل التهيئة](https://docs.nvidia.com/nemo/guardrails/configure-guardrails/configure-rails).
فيما يلي مثال على `config.yml`:```yaml
# config.yml
models:
- type: main
engine: openai
model: gpt-3.5-turbo-instruct
rails:
# Input rails are invoked when new input from the user is received.
input:
flows:
- check jailbreak
- mask sensitive data on input
# Output rails are triggered after a bot message has been generated.
output:
flows:
- self check facts
- self check hallucination
- activefence moderation on input
config:
# Configure the types of entities that should be masked on user input.
sensitive_data_detection:
input:
entities:
- PERSON
- EMAIL_ADDRESS
ملفات .co المضمّنة في تكوين guardrails تحتوي على تعريفات Colang (انظر القسم التالي للحصول على نظرة عامة سريعة عن ماهية Colang) التي تُحدد أنواعًا مختلفة من rails. فيما يلي مثال على ملف greeting.co يحدد rails الحوار لتحية المستخدم.```colang
define user express greeting
"Hello!"
"Good afternoon!"
define flow user express greeting bot express greeting bot offer to help
define bot express greeting "Hello there!"
define bot offer to help "How can I help you today?"
فيما يلي مثال إضافي لتعريفات Colang لسكة حوار ضد الإهانات:```colang
define user express insult
"You are stupid"
define flow
user express insult
bot express calmly willingness to help
لتكوين وتنفيذ أنواع مختلفة من الحواجز الوقائية، تقدم هذه المجموعة Colang، وهي لغة نمذجة صُممت خصيصًا لتصميم تدفقات حوار مرنة وقابلة للتحكم في نفس الوقت. تتميز Colang ببنية مشابهة للغة Python وهي مصممة لتكون بسيطة وبديهية، خاصة للمطورين.```{note} Two versions of Colang, 1.0 and 2.0, are supported and Colang 1.0 is the default.
للحصول على مقدمة موجزة حول بناء جملة Colang 1.0، راجع [دليل بناء جملة لغة Colang 1.0](https://docs.nvidia.com/nemo/guardrails/configure-guardrails/colang).
للبدء مع Colang 2.0، راجع [وثائق Colang 2.0](https://docs.nvidia.com/nemo/guardrails/colang-2/overview.html).
### مكتبة الحواجز الأمنية
تأتي NeMo Guardrails مع مجموعة من [الحواجز المدمجة](https://docs.nvidia.com/nemo/guardrails/user-guides/guardrails-library.html).```{note}
The built-in guardrails may or may not be suitable for a given production use case. As always, developers should work with their internal application team to ensure guardrails meets requirements for the relevant industry and use case and address unforeseen product misuse.
تتضمن المكتبة حواجز حماية للفحص الذاتي لنماذج اللغة الكبيرة (الإشراف على الإدخال/الإخراج، والتحقق من الحقائق، وكشف الهلوسة)، ونماذج سلامة NVIDIA (سلامة المحتوى، وسلامة الموضوع)، وكشف الاختراق والحقن، والتكامل مع النماذج المجتمعية وواجهات برمجة التطبيقات التابعة لجهات خارجية. للحصول على القائمة الكاملة، راجع وثائق مكتبة حواجز الحماية.
تأتي مكتبة NeMo Guardrails أيضًا مع واجهة CLI مدمجة.```bash $ nemoguardrails --help
Usage: nemoguardrails [OPTIONS] COMMAND [ARGS]...
actions-server Start a NeMo Guardrails actions server. chat Start an interactive chat session. evaluate Run an evaluation task. server Start a NeMo Guardrails server.
### Guardrails Server
يمكنك استخدام واجهة سطر الأوامر CLI الخاصة بمكتبة NeMo Guardrails لبدء تشغيل خادم guardrails. يمكن للخادم تحميل تكوين واحد أو أكثر من المجلد المحدد وتعريض واجهة برمجة تطبيقات HTTP لاستخدامها.```
nemoguardrails server [--config PATH/TO/CONFIGS] [--port PORT]
على سبيل المثال، للحصول على إكمال محادثة لإعداد sample، يمكنك استخدام نقطة النهاية /v1/chat/completions:```
POST /v1/chat/completions
لم يتم توفير أي محتوى في حقل INPUT. الرجاء إرسال نص المقطع (chunk 25) المطلوب ترجمته.```json
{
"config_id": "sample",
"messages": [{
"role":"user",
"content":"Hello! What can you do for me?"
}]
}
مثال على المخرجات:```json {"role": "assistant", "content": "Hi! How can I help you?"}
#### Docker
لبدء تشغيل خادم guardrails، يمكنك أيضًا استخدام حاوية Docker. توفر مكتبة NeMo Guardrails [Dockerfile](https://github.com/nvidia-nemo/guardrails/blob/develop/Dockerfile) يمكنك استخدامه لبناء صورة `nemoguardrails`. لمزيد من المعلومات، راجع قسم [استخدام Docker](https://docs.nvidia.com/nemo/guardrails/user-guides/advanced/using-docker.html).
## التكامل مع LangChain (اختياري)
التكامل مع LangChain اختياري. لتفعيله، عيّن متغير البيئة `NEMOGUARDRAILS_LLM_FRAMEWORK=langchain` أو استدعِ `set_default_framework("langchain")`. ثم ثبّت حزم LangChain التي يتطلبها تكوينك. بعد تفعيل التكامل، يمكنك تغليف تكوين guardrails حول سلسلة LangChain (أو أي `Runnable`)، كما يمكنك استدعاء سلسلة LangChain من داخل تكوين guardrails. لمزيد من المعلومات، راجع [وثائق التكامل مع LangChain](https://docs.nvidia.com/nemo/guardrails/user-guides/langchain/langchain-integration.html).
## التقييم
يعد تقييم سلامة تطبيق محادثة قائم على LLM مهمة معقدة ولا يزال سؤالًا بحثيًا مفتوحًا. لدعم التقييم السليم، توفر مكتبة NeMo Guardrails ما يلي:
1. [أداة تقييم](https://github.com/nvidia-nemo/guardrails/blob/develop/nemoguardrails/evaluate/README.md)، أي `nemoguardrails evaluate`، مع دعم الـ rails الموضوعية، والتحقق من الحقائق، والمراقبة (كشف كسر الحماية ومراقبة المخرجات) والهلوسة.
2. نماذج لتقارير فحص الثغرات في LLM، على سبيل المثال، [ABC Bot - نتائج فحص ثغرات LLM](https://docs.nvidia.com/nemo/guardrails/evaluation/llm-vulnerability-scanning.html)
## كيف يختلف هذا؟
هناك العديد من الطرق التي يمكن بها إضافة guardrails إلى تطبيق محادثة قائم على LLM. على سبيل المثال: نقاط نهاية مراقبة صريحة (مثل OpenAI و ActiveFence و PolicyAI)، وسلاسل النقد (مثل السلسلة الدستورية)، وتحليل المخرجات (مثل guardrails.ai)، وguardrails فردية (مثل LLM-Guard)، وكشف الهلوسة لتطبيقات RAG (مثل Got It AI و Patronus Lynx).
تهدف مكتبة NeMo Guardrails إلى توفير مجموعة أدوات مرنة يمكنها دمج كل هذه الأساليب التكميلية في طبقة guardrails متماسكة لتطبيقات LLM. على سبيل المثال، توفر المجموعة تكاملًا جاهزًا مع ActiveFence و PolicyAI و AlignScore وسلاسل LangChain.
على حد علمنا، تعد مكتبة NeMo Guardrails هي أداة guardrails الوحيدة التي تقدم أيضًا حلًا لنمذجة الحوار بين المستخدم وLLM. وهذا يتيح من ناحية القدرة على توجيه الحوار بطريقة دقيقة. ومن ناحية أخرى يتيح تحكمًا دقيقًا في متى ينبغي استخدام بعض guardrails، على سبيل المثال، استخدام التحقق من الحقائق فقط لأنواع معينة من الأسئلة.
## معرفة المزيد
- [الوثائق](https://docs.nvidia.com/nemo/guardrails)
- [دليل البدء](https://docs.nvidia.com/nemo/guardrails/getting-started)
- [أمثلة](https://github.com/nvidia-nemo/guardrails/blob/develop/examples)
- [الأسئلة الشائعة](https://docs.nvidia.com/nemo/guardrails/faqs.html)
- [إرشادات الأمان](https://docs.nvidia.com/nemo/guardrails/security/guidelines.html)
## القياس عن بُعد والخصوصية
تجمع مكتبة NVIDIA NeMo Guardrails بيانات القياس عن بُعد بشكل مجهول لمساعدة NVIDIA على فهم أنماط النشر وميزات الأمان الأكثر استخدامًا. تصدر المكتبة حدث استخدام واحدًا عند إنشاء `LLMRails` أو `IORails` أو `Guardrails`، ثم تصدر نبضات دورية من مؤشر ترابط خفي واحد لكل عملية. هذا القياس عن بُعد منفصل عن [التتبع](https://docs.nvidia.com/nemo/guardrails/latest/observability/tracing/index.html) لكل طلب. يمكنك تكوين التتبع في إعداد guardrails الخاص بك وإرساله إلى الواجهة الخلفية للمراقبة الخاصة بك. القياس عن بُعد هو مجرد إشارة مجهولة بسيطة إلى NVIDIA.
### لمحة عن الاستخدام المجتمعي
استخدام مجهول إجمالي عبر إصدارات `0.22.0` و`0.23.0` الدقيقة، من 22 مايو إلى 18 أغسطس 2026:



_آخر تحديث في 18 أغسطس 2026_
تشمل بيانات القياس عن بُعد ما يلي:
- إصدار المكتبة المثبتة، وإصدار Python، ونظام التشغيل، وسلسلة النظام الأساسي
- إصدار لغة تكوين Colang (1.0 أو 2.x)
- أسماء موفري محركات LLM المكوّنين، مثل `openai` أو `nim` أو `nvidia_ai_endpoints`، دون أسماء النماذج أو بيانات الاعتماد أبدًا
- عدد تدفقات الـ rails المكوّنة لإدخال الـ rails، وإخراجها، واسترجاعها، وإدخال الأدوات، وإخراج الأدوات، بالإضافة إلى فئات الـ rails النشطة
- أسماء ميزات المكتبة المدمجة النشطة، مثل `jailbreak_detection` أو `content_safety` أو `topic_safety`
- عدد تدفقات Colang المعرّفة من قبل المستخدم (العدد فقط، وليس أسماء التدفقات أو محتوياتها أبدًا)
- ما إذا كان التتبع أو البث أو قاعدة المعرفة مكوّنة
- كيفية نشر guardrails (خادم `library` أو `api` أو `cli`)
- محرك الـ rails قيد التشغيل المستخدم (`LLMRails` أو `IORails`)
- معرّف UUID عشوائي لكل عملية لربط الأحداث الصادرة من نفس المثيل. تنشئه المكتبة في الذاكرة ولا تخزّنه لإعادة استخدامه عبر عمليات إعادة التشغيل، لكنها تدرجه في سجلات التدقيق وأحداث القياس عن بُعد المرسلة
لا يتم جمع أي محتوى مستخدم في حمولة الحدث. لا تتضمن الحمولة أسماء النماذج أو مفاتيح API أو نقاط النهاية أو المطالبات أو الإكمالات أو عدد التوكنات أو مقاييس كل طلب أو مسارات الملفات أو أسماء المستخدمين أو عناوين IP. تستخدم NVIDIA البيانات بشكل إجمالي لتحديد أولويات العمل الهندسي وستشارك اتجاهات التبني مع المجتمع.
تحاول المكتبة أيضًا كتابة كل حمولة حدث في ملف تدقيق محلي في `~/.config/nemoguardrails/usage_stats.json`. يخزّن ملف التدقيق أحداث JSONL وليس مغلف قياس NVIDIA الكامل. عمليات كتابة التدقيق تتم بأفضل جهد، ولا يزال إرسال القياس عن بُعد مستمرًا حتى إذا فشلت كتابة التدقيق المحلي.
عيّن أيًا من الخيارات التالية لتعطيل القياس عن بُعد:```bash
export NEMO_GUARDRAILS_NO_USAGE_STATS=1
# or
export DO_NOT_TRACK=1
# or
mkdir -p ~/.config/nemoguardrails && touch ~/.config/nemoguardrails/do_not_track
قم بتعيين خيار إلغاء الاشتراك قبل بدء تشغيل مكتبة NVIDIA NeMo Guardrails. لا يؤدي تغيير متغيرات البيئة أو إنشاء do_not_track بعد بدء جمع البيانات عن بُعد إلى إيقاف مؤشر ترابط نبضات القلب الذي يعمل بالفعل.
راجع docs/telemetry.md للحصول على المخطط الكامل والأوصاف حقلاً بحقل.
يمكنك إلغاء الاشتراك في جمع البيانات عن بُعد في أي وقت. لا ينطبق إلغاء الاشتراك إلا على جمع البيانات بواسطة مكتبة NVIDIA NeMo Guardrails نفسها.
تتمتع نقاط النهاية التابعة لجهات خارجية بشروط وممارسات خصوصية منفصلة. يمكن لمكتبة NVIDIA NeMo Guardrails استخدام نقاط نهاية الاستدلال مثل NVIDIA Build (build.nvidia.com). إذا كنت تستخدم NVIDIA Build أو نقطة نهاية أخرى تابعة لجهة خارجية، فإن شروط الخدمة وممارسات الخصوصية لتلك نقطة النهاية تطبق بشكل مستقل عن المكتبة. لا يمتد أي إلغاء اشتراك في جمع البيانات عن بُعد في مكتبة NVIDIA NeMo Guardrails إلى نقطة النهاية التي تختارها. تعد NVIDIA Build مخصصة للتقييم والاختبار فقط ويجب عدم استخدامها في بيئات الإنتاج. لا ترسل معلومات سرية أو بيانات شخصية عند استخدام NVIDIA Build.
تعد أمثلة الـ rails الموجودة في المستودع نقاط بداية ممتازة. ندعو المجتمع بحماس إلى المساهمة في جعل قوة نماذج اللغة الكبيرة الجديرة بالثقة والآمنة والمأمونة في متناول الجميع. للإرشادات حول إعداد بيئة التطوير وكيفية المساهمة في مكتبة NeMo Guardrails، راجع إرشادات المساهمة.
مكتبة NeMo Guardrails مرخصة بموجب رخصة أباتشي، الإصدار 2.0.
إذا كنت تستخدم مكتبة NeMo Guardrails، فاستشهد بـ ورقة EMNLP 2023 التي تقدمها.```bibtex @inproceedings{rebedea-etal-2023-nemo, title = "{N}e{M}o Guardrails: A Toolkit for Controllable and Safe {LLM} Applications with Programmable Rails", author = "Rebedea, Traian and Dinu, Razvan and Sreedhar, Makesh Narsimhan and Parisien, Christopher and Cohen, Jonathan", editor = "Feng, Yansong and Lefever, Els", booktitle = "Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing: System Demonstrations", month = dec, year = "2023", address = "Singapore", publisher = "Association for Computational Linguistics", url = "https://aclanthology.org/2023.emnlp-demo.40", doi = "10.18653/v1/2023.emnlp-demo.40", pages = "431--445", }