RadFact는 접지 유무에 관계없이 실측 보고서가 제공되는 모델 생성 방사선 보고서를 평가하기 위한 프레임워크입니다. 대규모 언어 모델의 논리적 추론 기능을 활용하는 RadFact는 단일 숫자가 아니라 일련 의 측정항목으로, 텍스트 전용 및 텍스트 및 기초 수준에서 정밀도와 재현율의 측면을 포착합니다.
RadFact는 MAIRA-2: Grounded Radiology Report Generation에 도입되었습니다. 여기에서는 메트릭의 사용과 개발을 용이하게 하기 위해 메트릭의 오픈 소스 구현을 제공합니다.
LLMEngine
RadFact를 실행하려면 이 저장소를 복제하고 다음 명령을 실행하면 됩니다.
pip install .
그러면 radfact
패키지와 모든 종속성이 설치됩니다.
또는 모든 종속성이 포함된 Conda 환경을 설정하기 위한 Makefile
제공합니다. 다음을 사용하여 환경을 만들 수 있습니다.
make miniconda
make mamba
make env
conda activate radfact
첫 번째 단계에서는 miniconda를 설치하고, 두 번째 단계에서는 빠른 종속성 해결을 위해 mamba를 설치하고, 세 번째 단계에서는 모든 종속성이 포함된 radfact
라는 conda 환경을 만듭니다. 또한 setup_packages_with_deps
레시피를 통해 기본적으로 편집 가능 모드로 radfact 패키지를 설치합니다(Makefile 참조). 마지막으로 RadFact를 실행하기 위한 환경을 활성화합니다. 프로젝트에 기여하려는 경우 이는 적극 권장됩니다.
RadFact를 사용하려면 대규모 언어 모델에 액세스해야 합니다. 먼저 인증을 사용하여 엔드포인트를 설정한 다음 테스트 스크립트를 사용하여 엔드포인트가 예상대로 작동하는지 확인해야 합니다.
LLM은 API 엔드포인트로 사용 가능해야 하며 langchain
(버전 0.1.4)에서 지원되어야 합니다. AzureChatOpenAI 및 ChatOpenAI 모델이라는 두 가지 유형의 모델을 지원합니다. 전자는 Azure에서 사용할 수 있는 GPT 모델에 적합하고, 후자는 Azure의 Llama-3과 같은 사용자 지정 배포 모델에 적합합니다.
우리는 다음과 같은 인증 방법을 지원합니다:
API_KEY
환경 변수를 엔드포인트의 API 키로 설정합니다. API_KEY
기본 환경 변수 이름으로 사용합니다. 다른 이름을 사용하는 경우 api_key_env_var_name
통해 엔드포인트 구성에서 지정할 수 있습니다. 이는 서로 다른 API 키가 있는 여러 엔드포인트를 사용할 때 특히 유용합니다.config.json
추가합니다. 이 구성에는 subscription_id
, resource_group
및 workspace_name
키가 있어야 합니다. 포털을 통해 AzureML 작업 영역에서 다운로드할 수 있습니다. 이 파일은 실수로 커밋되는 것을 방지하기 위해 .gitignore
에 추가됩니다. 엔드포인트 클래스에서 예상하는 대로 config.json
이름으로 프로젝트의 루트 디렉터리에 파일을 저장해야 합니다.key_vault_secret_name
지정합니다.AzureChatOpenAI
모델의 azure_ad_token_provider
매개 변수로 설정됩니다. 이는 AzureChatOpenAI
모델에만 지원됩니다. RadFact 내에서 enpoint를 통합하는 방법에 대해 자세히 알아보려면 Endpoint.py에 있는 Endpoint
클래스의 엔드포인트 개체를 사용하는 Argument.py의 LLMAPIArguments
클래스를 참조하세요.
우리는 구성 관리를 위해 hydra를 사용합니다. 엔드포인트 구성은 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"
두 가지 유형이 있습니다. Azure에서 사용할 수 있는 GPT 모델의 경우 type: "AZURE_CHAT_OPENAI"
사용합니다. Azure의 Llama-3과 같은 사용자 지정 배포 모델의 경우 type: "CHAT_OPENAI"
사용합니다.url
및 아마도 deployment_name
필드를 적절한 값으로 업데이트해야 합니다.keyvault_secret_name
은 선택 사항이며 환경 변수를 통해 API를 설정하는 경우 필수가 아닙니다. API 키에 기본 "API_KEY"
와 다른 환경 변수 이름을 사용하는 경우 api_key_env_var_name
업데이트하세요. 여러 엔드포인트를 사용하는 경우 각 엔드포인트에 대해 서로 다른 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에서는 이를 위해 AzureChatOpenAI 모델로 쿼리할 수 있는 GPT-4를 사용했습니다.configs/radfact.yaml
-- 수반 확인. MAIRA-2에서는 이를 위해 ChatOpenAI 모델로 쿼리할 수 있는 LLama-3-70B-Instruct
사용했습니다. 다양한 백엔드 LLM은 다르게 동작하고 다양한 측정 결과를 생성할 수 있습니다. 특히, 수반 검증이 제대로 수행되지 않는 모델은 RadFact에 사용해서는 안 됩니다. 수반 확인이 예상대로 작동하는지 확인하려면 python src/radfact/cli/run_radfact_test_examples.py
실행하고 결과가 예상한 것과 유사한지 확인하세요. 예상 결과는 LLama-3-70b-Instruct
모델을 사용하여 얻었습니다.
이는 구문에 대한 보고 단계의 동작을 테스트하지 않는다는 점에 유의하십시오.
LLMEngine
클래스를 사용하면 여러 끝점에서 병렬 처리가 가능합니다. 처리량이 서로 다른 여러 엔드포인트에 액세스할 수 있는 경우 엔진은 속도에 비례하여 엔드포인트 전체에 데이터를 분할할 수 있습니다. 또한 엔진은 단일 엔드포인트에 대한 요청의 병렬 처리를 허용합니다. 이는 엔드포인트 수에 관계없이 기본적으로 사용됩니다. speed_factor
및 num_parallel_processes
옵션은 엔드포인트 구성 파일을 참조하세요. 또한 엔진은 결과의 일괄 처리 및 중간 캐싱을 처리합니다. 모든 중간 결과는 시작 타임스탬프가 태그된 실행 ID 폴더 아래의 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를 실행하는 방법을 보려면 getting_started 노트북을 참조할 수 있습니다. 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
디렉터리의 예제 입력 파일을 참조하세요. 입력 파일은 근거가 없는 보고서의 경우 Finding_Generation_examples.csv 형식이고, 근거가 없는 보고서의 경우는 JSON 파일인 grounded_reporting_examples.json 형식이어야 합니다.
스크립트는 부트스트래핑을 사용하여 지표에 대한 신뢰 구간을 계산합니다. --bootstrap_samples
인수를 사용하여 부트스트랩 샘플 수를 제어할 수 있습니다. 기본값은 500입니다. 부트스트래핑을 비활성화하려면 --bootstrap_samples 0
설정합니다.
num_llm_failures
키 아래에 건너뛴 쿼리 수가 포함되어 있습니다. 스크립트는 실행이 끝날 때 건너뛴 쿼리 수를 인쇄하고 이를 실행 ID 폴더 아래의 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는 먼저 보고서를 최대 하나의 결과를 설명하는 개별 문장으로 나눕니다. 그런 다음 대규모 언어 모델의 논리적 추론 기능을 사용하여 이러한 문장이 참조 보고서에 따라 논리적으로 지원('수반')되는지 여부를 결정합니다. 우리는 이를 두 가지 방향으로 계산합니다. 먼저 Ground Truth(원본) 보고서를 참조로 사용하고 그 반대로 모델 생성 보고서를 참조로 사용하여 계산합니다. 이를 통해 정확성과 완전성을 정량화할 수 있습니다.
전반적으로 RadFact는 (근거 있는) 보고서 품질에 대한 6가지 측정값을 제공합니다.
미터법 | 정의 | 그것은 우리에게 무엇을 말해주는가? | 접지? |
---|---|---|---|
논리적 정밀도 | 실측 보고서에 수반되는 생성된 문장의 비율입니다. | 모델 세대가 얼마나 진실한가: 잘못된 세대에 불이익을 줍니다. | ❌ |
논리적 회상 | 생성된 보고서에 포함된 실측 문장의 비율입니다. | 생성된 보고서의 완성도: 누락에 대한 처벌을 받습니다. | ❌ |
접지 정밀도 | 논리적으로 수반되고 공간적으로도 수반되는 생성된 문장의 비율입니다. | 올바르게 생성된 결과 도 올바르게 근거가 되는 경우가 얼마나 자주 있습니까? | ✔️ |
접지 리콜 | 논리적으로 수반되고 공간적으로도 수반되는 근거 진실 문장의 비율입니다. | 올바르게 캡처된 결과 도 올바르게 근거가 되는 경우가 얼마나 자주 있습니까? | ✔️ |
공간 정밀도 | 논리적으로나 공간적으로 수반되는 모든 기반 생성 문장의 비율입니다. | 점수가 낮다는 것은 모델이 불필요한 상자나 잘못된 문장에 대한 상자를 생성했음을 의미합니다. | ✔️ |
공간 리콜 | 논리적으로나 공간적으로 수반되는 모든 근거 있는 사실 문장의 비율입니다. | 점수가 낮다는 것은 결과를 잘못 설명하거나 전혀 설명하지 않아 모델이 참조에서 결과에 대한 상자를 생성하지 못했음을 의미합니다. | ✔️ |
공간 {정밀도, 재현율}은 다른 측정 항목보다 즉각적으로 해석하기가 쉽지 않지만 접지 {정밀도, 재현율}에 내재된 분모를 제어하기 위해 이를 포함합니다. 접지로 측정된 논리적으로 수반된 문장 상자의 품질만 평가하는 경우 {정밀도, 재현율}, 잘못된 문장(예: 완전히 조작된 결과)과 관련된 외부 상자 또는 누락된 결과와 관련된 누락된 상자로 인해 발생하는 접지 오류를 캡처하지 않습니다.
RadFact는 LLM을 두 단계로 사용합니다. 두 경우 모두 약 10개의 소수 예시를 사용합니다.
단방향 수반 확인(2단계의 일부)은 다음과 같이 작동합니다.
이를 통해 모든 문장에 논리적으로 수반된(또는 포함되지 않은) 및 공간적으로 수반된(또는 포함되지 않은) 라벨을 지정할 수 있으므로 위에 나열된 RadFact 측정항목을 계산할 수 있습니다. 공간적 함의는 상자가 있는 문장에 대해서만 정의됩니다.
보고서를 개별 문장으로 변환하기 위해 FINDINGS
섹션을 사용하여 MIMIC-CXR 보고서 스타일로 합성 예제를 생성했습니다. 원본 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 제공이 필요한지 여부를 결정하고 PR을 적절하게 장식합니다(예: 상태 확인, 댓글). 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하여 모든 저장소에서 이 작업을 한 번만 수행하면 됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있는 경우 [email protected]으로 문의하세요.
이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표나 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용에는 Microsoft의 상표 및 브랜드 지침이 적용되며 이를 따라야 합니다. 이 프로젝트의 수정된 버전에 Microsoft 상표 또는 로고를 사용하더라도 혼동을 일으키거나 Microsoft 후원을 암시해서는 안 됩니다. 제3자 상표 또는 로고의 사용에는 해당 제3자의 정책이 적용됩니다.