RadFact هو إطار عمل لتقييم تقارير الأشعة التي يتم إنشاؤها بواسطة النماذج في ضوء تقرير الحقيقة الأرضية، مع أو بدون أسس . من خلال الاستفادة من قدرات الاستدلال المنطقي لنماذج اللغة الكبيرة، فإن RadFact ليس رقمًا واحدًا بل مجموعة من المقاييس، تلتقط جوانب الدقة والتذكر على مستويات النص فقط والنص والتأريض.
تم تقديم RadFact في MAIRA-2: إنشاء تقارير الأشعة الأرضية. نقدم هنا تطبيقًا مفتوح المصدر للمقياس لتسهيل استخدامه وتطويره.
LLMEngine
للمعالجة المتوازيةلتشغيل RadFact، تحتاج فقط إلى استنساخ هذا المستودع وتشغيل الأمر التالي:
pip install .
سيؤدي هذا إلى تثبيت حزمة radfact
وجميع تبعياتها.
وبدلاً من ذلك، نوفر Makefile
لإعداد بيئة conda بكل التبعيات. يمكنك إنشاء البيئة باستخدام:
make miniconda
make mamba
make env
conda activate radfact
تقوم الخطوة الأولى بتثبيت miniconda، بينما تقوم الخطوة الثانية بتثبيت mamba لتحليل التبعيات بسرعة، وتقوم الخطوة الثالثة بإنشاء بيئة conda تسمى radfact
مع جميع التبعيات. سيؤدي هذا أيضًا إلى تثبيت حزمة radfact في الوضع القابل للتحرير افتراضيًا عبر وصفة setup_packages_with_deps
(راجع Makefile). وأخيرًا، قم بتنشيط البيئة لتشغيل RadFact. يوصى بهذا بشدة إذا كنت تنوي المساهمة في المشروع.
لاستخدام RadFact، تحتاج إلى الوصول إلى نموذج لغة كبير. يتعين عليك أولاً إعداد نقاط النهاية بالمصادقة، ثم التأكد من أنها تعمل كما هو متوقع باستخدام البرنامج النصي للاختبار الخاص بنا.
يجب أن يكون LLM متاحًا كنقطة نهاية لواجهة برمجة التطبيقات (API) وأن يكون مدعومًا بواسطة langchain
(الإصدار 0.1.4). نحن ندعم نوعين من النماذج: نماذج AzureChatOpenAI وChatOpenAI. الأول مناسب لنماذج GPT المتوفرة على Azure، بينما الأخير مناسب للنماذج المنشورة المخصصة مثل Llama-3 في Azure.
نحن ندعم طرق المصادقة التالية:
API_KEY
على مفتاح API الخاص بنقطة النهاية. نحن نستخدم API_KEY
كاسم متغير البيئة الافتراضي. إذا كنت تستخدم اسمًا مختلفًا، فيمكنك تحديده في تكوين نقطة النهاية عبر api_key_env_var_name
. يعد هذا مفيدًا بشكل خاص عند استخدام نقاط نهاية متعددة مع مفاتيح API مختلفة.config.json
في الدليل الجذر للمشروع. workspace_name
أن يحتوي هذا التكوين على subscription_id
resource_group
. ويمكن تنزيله من مساحة عمل AzureML عبر البوابة الإلكترونية. تتم إضافة هذا الملف إلى .gitignore
لتجنب ارتكاب الأخطاء غير المقصودة. تأكد من حفظ الملف في الدليل الجذر للمشروع تحت اسم config.json
كما هو متوقع بواسطة فئة نقطة النهاية.key_vault_secret_name
في تكوين نقطة النهاية.azure_ad_token_provider
لنموذج AzureChatOpenAI
مما يسمح بتحديث الرمز المميز تلقائيًا. وهذا مدعوم فقط لنماذج AzureChatOpenAI
. لمعرفة المزيد حول كيفية دمج النقاط داخل RadFact، يرجى الرجوع إلى فئة LLMAPIArguments
في الوسيطات.py التي تستهلك كائن نقطة النهاية من فئة Endpoint
في endpoint.py.
نحن نستخدم هيدرا لإدارة التكوين. تكوينات نقطة النهاية موجودة في المسار: configs/endpoints
.
وهذا مثال لملف التكوين:
ENDPOINT_EXAMPLE : type : " CHAT_OPENAI " url : "" deployment_name : " llama3-70b " api_key_env_var_name : "" keyvault_secret_name : "" speed_factor : 1.0 num_parallel_processes : 10
type: "CHAT_OPENAI"
type: "AZURE_CHAT_OPENAI"
اعتمادًا على نقطة النهاية النموذجية المستخدمة. بالنسبة لنماذج GPT المتوفرة على Azure، استخدم type: "AZURE_CHAT_OPENAI"
. بالنسبة للنماذج المنشورة المخصصة مثل Llama-3 على Azure، استخدم type: "CHAT_OPENAI"
.url
وحقول deployment_name
المحتملة بالقيم المناسبة.keyvault_secret_name
اختياريًا وغير مطلوب إذا قمت بتعيين واجهة برمجة التطبيقات عبر متغير بيئة. قم بتحديث api_key_env_var_name
إذا كنت تستخدم اسم متغير بيئة مختلف لمفتاح API عن الاسم الافتراضي "API_KEY"
. عند استخدام نقاط نهاية متعددة، حدد api_key_env_var_name
مختلفًا لكل نقطة نهاية.speed_factor
عند توفر أكثر من نقطة نهاية واحدة. يتيح لك هذا تحديد السرعة النسبية لنقطة النهاية مقارنة بالنقاط الأخرى المستخدمة لتقسيم البيانات عبر نقاط النهاية بشكل متناسب.num_parallel_processes
لتحديد عدد العمليات المتوازية التي سيتم استخدامها عند الاستعلام عن نقطة نهاية محددة. تتم معالجة كافة الطلبات بشكل تسلسلي ما لم يتم تعيين num_parallel_processes
على قيمة أكبر من 1 مما يسمح بالمعالجة المتوازية. كما هو مذكور أعلاه، عند استخدام RadFact لتقييم التقارير غير المستندة إلى الأساس ، على سبيل المثال، التقارير السردية، يقوم RadFact أولاً بتحويل التقارير إلى قائمة من العبارات. نحن نستخدم شهادة LLM لهذه الخطوة، ولكن ليس من الضروري أن تكون نفس شهادة LLM المستخدمة للتحقق من الاستحقاق. يمكنك تحديد نقطة النهاية (وبالتالي LLM) المستخدمة لكل مهمة في التكوينات التالية، ضمن override endpoints:
:
configs/report_to_phrases.yaml
- تحويل التقرير إلى قائمة العبارات. في MAIRA-2، استخدمنا GPT-4 لهذا والذي يمكن الاستعلام عنه كنموذج AzureChatOpenAI.configs/radfact.yaml
- التحقق من الاستحقاق. في MAIRA-2، استخدمنا LLama-3-70B-Instruct
لهذا والذي يمكن الاستعلام عنه كنموذج ChatOpenAI. قد تتصرف برامج LLM الخلفية المختلفة بشكل مختلف وتنتج نتائج مترية مختلفة. على وجه الخصوص، لا ينبغي استخدام النموذج الذي يؤدي أداءً سيئًا عند التحقق من الاستحقاق في RadFact. للتأكد من أن التحقق من الاستحقاق يعمل كما هو متوقع، قم بتشغيل python src/radfact/cli/run_radfact_test_examples.py
وتأكد من أن النتائج مشابهة لتلك المتوقعة. تم الحصول على النتائج المتوقعة باستخدام نموذج LLama-3-70b-Instruct
.
لاحظ أن هذا لا يختبر سلوك خطوة التقرير إلى العبارات.
تتيح فئة LLMEngine
المعالجة المتوازية عبر نقاط نهاية متعددة. إذا كان لديك إمكانية الوصول إلى نقاط نهاية متعددة بإنتاجية مختلفة، فيمكن للمحرك تقسيم البيانات عبر نقاط النهاية بما يتناسب مع سرعتها. يسمح المحرك أيضًا بالمعالجة المتوازية للطلبات إلى نقطة نهاية واحدة. يتم استخدام هذا بشكل افتراضي بغض النظر عن عدد نقاط النهاية. ارجع إلى ملف تكوين نقاط النهاية للتعرف على خيارات speed_factor
و num_parallel_processes
. بالإضافة إلى ذلك، يعتني المحرك بمعالجة الدفعات والتخزين المؤقت للنتائج. يتم تخزين كافة النتائج الوسيطة في دليل outputs/radfact
ضمن مجلد معرف التشغيل الذي تم وضع علامة عليه بالطابع الزمني للبدء، على سبيل المثال outputs/radfact/run_20240814_075225
. بنية المجلد هي كما يلي:
outputs/radfact/run_20240814_075225
├── batch_outputs
│ ├── outputs_0_100.json
| ├── .
| ├── .
| ├── .
│ └── outputs_1000_1100.json
├── progress
│ ├── subset_0_240.csv
| ├── .
| ├── .
| ├── .
│ └── subset_800_1100.csv
├── skipped
│ ├── subset_0_240.csv
| ├── .
| ├── .
| ├── .
│ └── subset_800_1100.csv
├── outputs.json
├── progress.csv
└── skipped.csv
يحتوي outputs.json
على النتائج النهائية لجميع نقاط البيانات. يحتوي progress.csv
على تقدم المعالجة لكل نقطة نهاية. يحتوي batch_outputs
على النتائج المتوسطة لكل حجم دفعة. يحتوي skipped
نقاط البيانات التي تم تخطيها بسبب الأخطاء.
يمكنك الرجوع إلى دفتر ملاحظات "بدء_البدء" لمعرفة كيفية تشغيل RadFact على بياناتك الخاصة. نوصي بشدة بقراءة دفتر الملاحظات أولاً لفهم سير عمل RadFact وكيفية استخدامه. ونوفر أيضًا برنامجًا نصيًا لتشغيل RadFact على بياناتك. تأكد من إعداد نقاط النهاية كما هو موضح أعلاه قبل تشغيل البرنامج النصي. يقوم الأمر run_radfact
بتشغيل البرنامج النصي python src/radfact/cli/run_radfact.py
تحت الغطاء. يمكنك تجاوز السلوك الافتراضي عبر وسيطات سطر الأوامر الموضحة أدناه عن طريق تشغيل run_radfact --help
. تحتاج إلى تثبيت الحزمة محليًا حتى تتمكن من تشغيل البرنامج النصي.
$ run_radfact --help
usage: run_radfact [-h] [--radfact_config_name RADFACT_CONFIG_NAME] [--phrases_config_name PHRASES_CONFIG_NAME] --input_path INPUT_PATH [--is_narrative_text] [--output_dir OUTPUT_DIR] [--bootstrap_samples BOOTSTRAP_SAMPLES]
Compute RadFact metric for a set of samples and saves the results to a json file.
options:
-h, --help show this help message and exit
--input_path INPUT_PATH
The path to the csv or json file containing the samples to compute RadFact for. For finding generation samples, the csv file should have columns ' example_id ' ,
' prediction ' , and ' target ' similar to the example in ` examples/findings_generation_examples.csv ` . For grounded reporting samples, provide a json file in the
same format as ` examples/grounded_reporting_examples.json ` .
--is_narrative_text Whether the input samples are narrative text or not. If true, the input samples are expected to be narrative text, otherwise they are expected to be grounded
phrases.
--radfact_config_name RADFACT_CONFIG_NAME
The name of the config file for RadFact processing. We use the default config file but you can provide a custom config. Make sure the config follows the same
structure as ` configs/radfact.yaml ` and is saved in the ` configs ` directory. This is necessary for hydra initialization from the ` configs ` directory.
--phrases_config_name PHRASES_CONFIG_NAME
The name of the config file for reports to phrases conversion. We use the default config file but you can provide a custom config. Make sure the config follows
the same structure as ` configs/report_to_phrases.yaml ` and is saved in the ` configs ` directory. This is necessary for hydra initialization from the ` configs `
directory.
--output_dir OUTPUT_DIR
Path to the directory where the results will be saved as a json file.
--bootstrap_samples BOOTSTRAP_SAMPLES
Number of bootstrap samples to use for computing the confidence intervals. Set to 0 to disable bootstrapping.
run_radfact --input_path < path_to_input_file.csv > --is_narrative_text
run_radfact --input_path < path_to_input_file.json >
ارجع إلى ملفات الإدخال النموذجية في دليل examples
لمعرفة التنسيق المتوقع لملفات الإدخال. يجب أن تكون ملفات الإدخال بتنسيق ملف CSV للتقارير غير المؤرضة Findings_generation_examples.csv وملف JSON للتقارير المؤرضة grounded_reporting_examples.json.
يحسب البرنامج النصي فترات الثقة للمقاييس باستخدام bootstrapping. يمكن التحكم في عدد عينات التمهيد باستخدام الوسيطة --bootstrap_samples
. القيمة الافتراضية هي 500. لتعطيل bootstrapping، اضبط --bootstrap_samples 0
.
num_llm_failures
. سيقوم البرنامج النصي بطباعة عدد الاستعلامات التي تم تخطيها في نهاية التشغيل، وتخزينها في الدليل skipped
ضمن مجلد معرف التشغيل. ستشاهد أيضًا رسالة تحذير في السجلات لكل استعلام فاشل. WARNING: No response for example {query_id}. Setting as NOT ENTAILED
.
ونوفر أيضًا برنامجًا نصيًا لتحويل التقارير إلى عبارات. يكون هذا مفيدًا عندما يكون لديك تقرير سردي وتريد تحويله إلى قائمة عبارات لتقييم RadFact. يمكنك تشغيل هذه الخطوة دون الاتصال بالإنترنت ثم استخدام ملف الإخراج كمدخل إلى RadFact. تأكد من إعداد نقاط النهاية كما هو موضح أعلاه قبل تشغيل البرنامج النصي. يقوم الأمر run_report_to_phrases
بتشغيل البرنامج النصي python src/radfact/cli/run_report_to_phrases.py
تحت الغطاء.
run_report_to_phrases dataset.csv_path= < your_path_to_cxr_reports >
هذا البرنامج النصي قابل للتكوين باستخدام ملف التكوين report_to_phrases.yaml
. يمكنك تحديد ملف الإدخال وملف الإخراج ونقطة النهاية لاستخدامها في التحويل.
إذا لزم الأمر، تقوم RadFact أولاً بتقسيم التقارير إلى جمل فردية تصف نتيجة واحدة على الأكثر. ثم يستخدم قدرات الاستدلال المنطقي لنموذج لغة كبير لتحديد ما إذا كانت هذه الجمل مدعومة منطقيًا ("متضمنة") في ضوء التقرير المرجعي. نقوم بحساب ذلك في اتجاهين، أولاً باستخدام تقرير الحقيقة الأرضية (الأصلي) كمرجع، والعكس بالعكس، باستخدام تقرير النموذج الذي تم إنشاؤه كمرجع. وهذا يسمح للقياس الكمي لكل من الصحة والاكتمال.
بشكل عام، يوفر RadFact ستة مقاييس لجودة التقرير (المؤرض):
متري | تعريف | ماذا يخبرنا؟ | التأريض؟ |
---|---|---|---|
الدقة المنطقية | جزء الجمل المولدة التي يتضمنها تقرير الحقيقة الأرضية. | ما مدى صدق الأجيال النموذجية: فهي تعاقب الأجيال الخاطئة. | ❌ |
الاستدعاء المنطقي | جزء من جمل الحقيقة الأرضية التي يتضمنها التقرير الذي تم إنشاؤه. | مدى اكتمال التقرير الذي تم إنشاؤه: فهو يعاقب على الإغفالات. | ❌ |
دقة التأريض | جزء من الجمل المولدة ذات الأساس المنطقي والمتضمنة مكانيًا أيضًا. | كم مرة يتم أيضًا ترسيخ النتائج التي تم إنشاؤها بشكل صحيح بشكل صحيح؟ | ✔️ |
استدعاء التأريض | جزء من جمل الحقيقة الأرضية المرتكزة منطقيًا والمتضمنة مكانيًا أيضًا. | كم مرة يتم أيضًا ترسيخ النتائج التي تم التقاطها بشكل صحيح بشكل صحيح؟ | ✔️ |
الدقة المكانية | جزء من جميع الجمل المولدة المؤرضة والمتضمنة منطقيًا ومكانيًا. | تعني الدرجة المنخفضة أن النموذج قد أنشأ مربعات أو مربعات غير ضرورية لجمل غير صحيحة. | ✔️ |
الاستدعاء المكاني | جزء من جميع جمل الحقيقة الأرضية المبنية على المنطق والمكان. | تعني الدرجة المنخفضة أن النموذج فشل في إنشاء مربعات للنتائج في المرجع، ربما عن طريق وصف النتيجة بشكل غير صحيح أو عدم وصفها على الإطلاق. | ✔️ |
تعد {الدقة، التذكير} المكانية أقل قابلية للتفسير على الفور من المقاييس الأخرى، ولكننا ندرجها للتحكم في المقام الضمني في التأريض {الدقة، التذكير}: إذا قمنا فقط بتقييم جودة مربعات الجمل المتضمنة منطقيًا كما تم قياسها عن طريق التأريض {الدقة، التذكير}، نحن لا نلتقط حالات الفشل التأريضية الناشئة عن المربعات الدخيلة المرتبطة بجمل غير صحيحة (على سبيل المثال، النتائج الملفقة بالكامل)، أو المربعات المفقودة المرتبطة بالنتائج المفقودة.
يستخدم RadFact LLMs في خطوتين. في كلتا الحالتين، نستخدم حوالي 10 أمثلة قليلة.
يعمل التحقق من الاستحقاق أحادي الاتجاه (جزء من الخطوة 2) على النحو التالي:
يتيح لنا هذا تصنيف كل جملة على أنها مستلزمة منطقيًا (أو لا) ومستلزمة مكانيًا (أو لا)، وبالتالي حساب مقاييس RadFact المذكورة أعلاه. لاحظ أن الاستحقاق المكاني يتم تعريفه فقط للجمل التي تحتوي على مربعات.
لتحويل التقارير إلى جمل فردية، قمنا بإنشاء أمثلة تركيبية بأسلوب تقارير MIMIC-CXR، باستخدام قسم FINDINGS
. تقارير MIMIC الأصلية محمية بموجب اتفاقية استخدام البيانات التي تحظر إعادة التوزيع. قمنا بتقسيم التقارير السردية يدويًا إلى جمل فردية. يمكن رؤية الأمثلة ورسالة النظام ضمن llm_utils.report_to_phrases.prompts
.
للتحقق من الاستحقاق، يتم الحصول على الأمثلة القليلة من مجموعة بيانات خاصة ("USMix"). يحتوي كل مثال على جمل من تقريرين، اخترناهما ليكونا متشابهين ولكن غير متطابقين باستخدام إحصائيات tf-idf. وبالتعاون مع استشاري الأشعة، قمنا بعد ذلك بتسميتها يدويًا بحالة الاستحقاق والأدلة. على الرغم من كونها مهمة استدلال منطقي، إلا أن هناك درجة من الذاتية في التحقق من الاستلزام، والتي تنشأ من مدى دقة تفسير بعض المفاهيم. ومن ثم، فإن بعض هذه الأمثلة يمكن الطعن فيها. تتوفر الأمثلة ورسائل النظام ضمن llm_utils.nli.prompts
.
للاستشهاد بـ RadFact، يمكنك استخدام:
@article { Bannur2024MAIRA2GR ,
title = { MAIRA-2: Grounded Radiology Report Generation } ,
author = { Shruthi Bannur and Kenza Bouzid and Daniel C. Castro and Anton Schwaighofer and Sam Bond-Taylor and Maximilian Ilse and Fernando P'erez-Garc'ia and Valentina Salvatelli and Harshita Sharma and Felix Meissen and Mercy Prasanna Ranjit and Shaury Srivastav and Julia Gong and Fabian Falck and Ozan Oktay and Anja Thieme and Matthew P. Lungren and Maria T. A. Wetscherek and Javier Alvarez-Valle and Stephanie L. Hyland } ,
journal = { arXiv } ,
year = { 2024 } ,
volume = { abs/2406.04449 } ,
url = { https://arxiv.org/abs/2406.04449 }
}
يتم توفير RadFact للاستخدام البحثي فقط. لم يتم تصميم RadFact أو المقصود به أو إتاحته للاستخدام في تشخيص المرض أو الحالة الطبية أو الوقاية منه أو تخفيفه أو علاجه ولا لأداء أي وظيفة طبية، ولم يتم إثبات أداء RadFact لهذه الأغراض. تتحمل وحدك المسؤولية عن أي استخدام لـ RadFact، بما في ذلك دمجها في أي منتج مخصص لغرض طبي.
يرحب هذا المشروع بالمساهمات والاقتراحات. تتطلب معظم المساهمات منك الموافقة على اتفاقية ترخيص المساهم (CLA) التي تعلن أن لديك الحق في منحنا حقوق استخدام مساهمتك، بل وتفعل ذلك بالفعل. للحصول على التفاصيل، تفضل بزيارة https://cla.opensource.microsoft.com.
عند إرسال طلب سحب، سيحدد روبوت CLA تلقائيًا ما إذا كنت بحاجة إلى تقديم CLA وتزيين العلاقات العامة بشكل مناسب (على سبيل المثال، التحقق من الحالة، التعليق). ما عليك سوى اتباع التعليمات التي يقدمها لك الروبوت. سوف تحتاج إلى القيام بذلك مرة واحدة فقط في جميع عمليات إعادة الشراء باستخدام CLA الخاص بنا.
اعتمد هذا المشروع قواعد السلوك الخاصة بشركة Microsoft مفتوحة المصدر. لمزيد من المعلومات، راجع الأسئلة الشائعة حول قواعد السلوك أو اتصل بـ [email protected] لطرح أي أسئلة أو تعليقات إضافية.
قد يحتوي هذا المشروع على علامات تجارية أو شعارات للمشاريع أو المنتجات أو الخدمات. يخضع الاستخدام المصرح به للعلامات التجارية أو الشعارات الخاصة بشركة Microsoft ويجب أن يتبع إرشادات العلامة التجارية والعلامات التجارية الخاصة بشركة Microsoft. يجب ألا يتسبب استخدام العلامات التجارية أو الشعارات الخاصة بشركة Microsoft في الإصدارات المعدلة من هذا المشروع في حدوث ارتباك أو الإشارة ضمنًا إلى رعاية Microsoft. ويخضع أي استخدام لعلامات تجارية أو شعارات تابعة لجهات خارجية لسياسات تلك الجهات الخارجية.