Vojtěch Vlach, [email protected]
Prezentace na závěr fáze příprav kódu.
Discourseer na Githubu
Obsahová analýza je jedna z technik mediálně vědného výzkumu. Je prováděna manuálně několika kodéry, kteří po přečtení vybraných zpravodajských textů odpovídají na otázky týkající se tématu článku, zastoupených mluvčí, přítomných zpravodajských hodnot či mediálních rámců. Na základě datových matic jednotlivých kodérů se následně provádí analýza inter-rater reliability, kde koeficient (Krippendorfovo alpha, Cohennovo kappa) určí míru vzájemné shody.
Projekt Discourseer má za cíl otestovat, zda se velké jazykové modely mohou do procesu obsahové analýzy zapojit či manuální kódování i zcela nahradit. Ve spolupráci s odborníky z oboru jsme vytvořili sadu obsahové analýzy, na které budeme testovat jazykové modely a měřit jejich úspěšnost a podobnost s reálnými respondenty.
- Současný stav
- Funkcionalita
- Struktura projektu
- Instalace
- Příklad spuštění
- Automatické testování
- Popis parametrů
- Formátovací řetězce
Momentálně je software připraven na experimenty. Data pro experimenty se připravují v rámci projektu semANT na FIT VUT a budou na téma: Obsahová analýza článků souvisejících s aktuálně probíhajícím konfliktem na blízkém východě. Připravená data a první experimenty jsou očekávány během června. Tento software se bude dále vyvíjet podle potřeb uživatelů.
Nástroj Discourseer umožňuje využít velké jazykové modely pomocí openAI API pro analýzu textů a odpovídání na otázky s předdefinovanými možnostmi odpovědí.
Vstupy:
- texty k analýze
- definice otázek a možných odpovědí
- definice promptů pro modely a vybrání modelu
- předchozí odpovědi respondentů
Výstupy:
- odpovědi modelu na otázky (ve formátu CSV)
- výsledky analýzy podobnosti odpovědí modelu a respondentů pomocí Inter-rater reliability (IRR) (ve formátu JSON)
run_discourseer.py
- hlavní skript pro spuštění nástrojediscourseer
- zdrojové kódyexperiments
- výsledky experimentůexperiments/default_experiment
- výchozí experiment pro ukázku
test
- automatické testy jednotlivých modulů spustitelné pomocípython -m unittest
Pro spuštění je potřeba mít nainstalovaný Python 3.8, 3.9, nebo 3.10. Dále je potřeba nainstalovat python knihovny ze souboru requirements
např. pomocí pip
:
pip install -r requirements.txt
Dále je potřeba definovat vlastní API klíč pro OpenAI API buď jako proměnnou prostředí OPENAI_API_KEY
nebo předat programu jako parametr --openai-api-key
.
Výchozí způsob spuštění pomocí vlastního API klíče je následující:
python run_discourseer.py --openai-api-key sk-ZmfV3vvo19y...
python -m unittest
Případně jednotlivé testy pomocí zavolání konkrétní třídy a metody, např.:
python -m unittest test.test_IRR.test_IRR.TestIRRWithoutModel.test_irr_equal
-h
,--help
- Zobrazí nápovědu.--experiment-dir
(složka) - Výchozí složka pro vstupy a výstupy experimentu. Jednotlivé cesty jdou definovat pomocí dalších argumentů.--texts-dir
(složka s .txt soubory) - Adresář s texty, které chcete analyzovat.--ratings-dir
(složka jedna nebo víc s .csv soubory) - Adresáře s hodnoceními textů od respondentů.--prompt-definitions
(soubor .json) - Soubor s definicemi otázek, které chcete z textů extrahovat. (vizexperiments/default_experiment/prompt_definitions.json
)--prompt-subset
- Názvy otázek, které se mají vybrat ze souboru--prompt-definitions
. Ostatní nejsou brány v potaz. Pokud tento argument není zadán, berou se všechny otázky.--prompt-schema-definition
(soubor .json) - Soubor s textem hlavního promptu + formátovacími řetězci pro témata. (vizexperiments/default_experiment/prompt_schema_definitions.json
)--output-dir
(složka) - Složka, kam se uloží výsledky analýzy.--text-count
(číslo) - Možnost omezit počet dokumentů, nad kterýmu se provede analýza--copy-input-ratings
- Možnosti kopírovat hodnocení ze vstupní složky do výstupní složky.none
- Nezkopírovat.original
- Zkopírovat všechny soubory v původním formátu.reorganized
- Zkopírovat přeorganizované soubory na co nejmenší počet respondentů. (mohou být smazány nepotřebné soubory)
--openai-api-key
- Klíč pro OpenAI API.--log
- Úroveň logování informací o průběhu programu do terminálu. (DEBUG, INFO, WARNING, ERROR)
Pomocí formátovacích řetězců lze přesně definovat formulaci otázek pro modely a to nezávisle na konkrétní otázce.
Používají se při definici promptů v souboru prompt_schema_definitions.json
(např. experiments/default_experiment/prompt_schema_definitions.json
) a jsou definovány
v souboru discourseer/extraction_prompts.py
, kde jdou jednoduše přidat další podle předlohy custom_format_string
.
Viz format_string_examples pro příklady.
Seznam implementovaných formátovacích řetězců:
text
: vložení textu článkuprompt_names
: jména otázek oddělené čárkouprompt_descriptions
: popisy otázek oddělené mezerou (popis by měla být celá věta)prompt_names_and_descriptions_colon
: jména a popisy otázek oddělené dvojtečkou (např. "Země": "Země původu textu.")prompt_names_and_descriptions_parentheses
: jména a popisy otázek oddělené závorkami (např. "Země" ("Země původu textu."))single_choice_prompts
: jména otázek, kde má model vybrat právě jednu možnost (single-choice), oddělené čárkoumultiple_choice_prompts
: jména otázek, kde může model vybrat více možností (multiple-choice), oddělené čárkouprompt_options
: několikařádkový seznam možností odpovědi na otázky oddělené čárkou, kde každý řádek odpovídá jedné otázceprompt_options_with_examples
: seznam možností jakoprompt_options
s přidanými příklady na každém řádkuprompt_options_with_examples_bulletpoints
": seznam možností jakoprompt_options_with_examples
, strukturované pomocí odrážekwhole_prompt_info
: několikařádkový seznam informací o otázkách (jméno, single-choice/multiple-choice, popis, seznam možností) oddělené čárkou, kde každý řádek odpovídá jedné otázcewhole_prompt_info_bulletpoints
: několikařádkový seznam informací jakowhole_prompt_info
, strukturované pomocí odrážekprompt_json
: JSON se všemi informacemi o otázkáchresponse_json_schema
: JSON schéma, které odpovídá formátu odpovědí modeluresponse_json_schema_with_options
: JSON schéma, které odpovídá formátu odpovědí modelu s definovanými možnostmi