(Acest articol a fost publicat pentru prima dată pe BLUECOLOGIE BLOGși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
În viitorul apropiat, cu toții vom face recenzii sistematice Lit, obținând LLMS să adune date din lucrări. Mai jos este un exemplu despre modul de extragere a datelor text dintr -un studiu. După ce puteți interacționa cu LLM de la R, puteți prelucra apoi multe documente pentru a transforma textul în date structurate.
TLDR; Dezvoltarea unui flux de lucru pentru extracția datelor este o muncă grea. Dezvoltarea de prompturi, extragerea datelor și curățarea datelor consumă mult timp și necesită gândire. Deci, va dura în continuare pentru a face o revizuire sistematică. De asemenea, v -aș recomanda să verificați manual rezultatele, astfel încât să învățați în continuare ceva singur și să corectați erorile.
Voi menționa, de asemenea, că lucrările ies acum testând această idee, de exemplu, aceasta arată că rezultatele AI pot fi exacte, dar numai pentru unele tipuri de solicitări. Codul suplimentar pentru acea lucrare are, de asemenea, îndrumări utile.
Vom avea nevoie de câteva abilități R pentru a extrage date din lucrări pentru recenzii aprinse:
- Cum să interacționezi cu LLMS prin API -uri de la r
- Cum să gestionați documentele PDF și să extrageți text din ele
- Cum să curățați datele de text semi-structurate și să le transformați în date structurate.
- Cum se lotează procesul.
Mă voi concentra în principal pe pasul 1 aici. Pasul 2 este posibil, prin poate fi finniky și depinde de modul în care este format PDF. Pasul 3 este destul de simplu cu un pachet de genul stringr. Pasul 4 este doar bucla cu orice cadru preferi pentru asta (de exemplu, pentru bucle sau PURRR).
Acest blog tratează un singur tip de aplicație de LLMS pentru a aprinde recenzii, care este poate cel mai simplu și mai ieftin. Există și alte modalități de a le folosi pentru a scrie sinteze sau pentru a descoperi tendințe de cercetare, cum ar fi modelele de finetuning pe un corpus mare de lucrări.
Configurarea accesului API
API = Interfață de programare a aplicației. Acesta este un mod de a interacționa cu un serviciu (furnizorul LLM) prin R.
În primul rând, va trebui să mergeți la furnizorul de alegere LLM (aici folosesc antropic) și să obțineți o cheie API. Acest lucru vă va solicita să vă înregistrați și apoi să cumpărați câteva credite. Veți fi perceput pe jeton per (fragmentul unui cuvânt) pe care îl utilizați.
Am început cu 25USD, care pare a fi suficient pentru testare. Nu am încă idee cât de mult va costa să faceți o recenzie sistematică LIT -uri sistematice cu 100 de lucrări.
Acum obțineți cheia API. Păstrați acest secret este ca o parolă. De asemenea, îl puteți vizualiza o singură dată, așa că va trebui să îl salvați, de exemplu, într -un manager de parole.
Utilizarea cheii API în r
Folosesc dotenv Pachet pentru a ajuta la gestionarea API -ului. În primul rând, asigurați -vă
.env este în tine .gitignore fişier. În acest fel nu puteți împărtăși din neatenție cheia cu lumea.
Acum creați un fișier într -un editor de text (de exemplu, RStudio sau VSCODE) numit
.env. Puneți acest lucru este folderul dvs. de proiect.
Fișierul va arăta astfel:
ANTHROPIC_KEY="your_api_key_here"
Asigurați -vă că accesați Enter după ultima linie.
Acum puteți folosi dotenv Pachet pentru a încărca cheia în sesiunea R. Acest blog are sfaturi bune despre gestionarea secretelor
dotenv::load_dot_env('.env')
Verificați că a funcționat pentru a încărca cheia:
Sys.getenv("ANTHROPIC_KEY")
Acest lucru ar trebui să imprime cheia.
Interacționând cu API -ul de la r
Acum sunteți gata să utilizați API -ul. Există destul de multe pachete care vă pot ajuta să faceți acest lucru. Voi folosi noul tidychatmodels Pachet, pentru că îmi place sintaxa sa (este ca TidyModels).
Instalarea instrucțiunilor sunt aici (nu este pe CRAN ca să scrieți) și iată un exemplu frumos despre modul de utilizare a LLM -urilor cu PDF -uri, ceea ce m -a ajutat foarte mult să scriu acest blog.
library(tidyverse) library(tidychatmodels)
Acum începeți să construiți instrucțiunile de trimis la API. TidychatModels face acest pas cu pas cu conducte. Deci, vom construi o secvență de comenzi. În ultimul pas îl vom trimite la API.
newchat <- create_chat("anthropic",
api_key = Sys.getenv("ANTHROPIC_KEY"),
api_version = '2023-06-01')
Aici folosesc „antropic”, dar există și altele, de exemplu, Openai și Mistral.
Acum adăugați un model. Am primit numele modelului pe pagina web APIS
Alegerea modelului este dictată de viteză, cost și tipul de sarcină pe care doriți să îl faceți. Faceți unele cercetări pentru a optimiza acest lucru.
De asemenea, stabilesc temperatura pentru a controla nivelul de creativitiy în ieșire, valori mai mici = mai puțin creative. max_tokens controlează lungimea ieșirii.
newchat <- add_model(newchat, "claude-3-5-haiku-20241022") |>
add_params('temperature' = 0.2, max_tokens = 800)
Promptând prin API
Să facem un test. Voi crea un text
newchat <- newchat |>
add_message(
role="user",
message="You are a funky dude who loves writing online R lessons.
Write a paragraph about loading dataframes in R. "
)
Acum suntem gata să ajungem pe ringul de dans. Acesta este bitul în care cerem de fapt LLM să facă ceva. De asemenea, este bitul care costă bani …
newchat <- newchat |>
perform_chat()
responses <- newchat |> extract_chat()
Așa că prima dată când am rulat acest lucru am primit o eroare „400”. Se pare că parametrul „max_tokens” a fost esențial de setat. Acest parametru controlează lungimea ieșirii. Rezultatele mai lungi costă mai mult (sunteți perceput pe jeton).
Eroare în httr2::req_perform()! HTTP 400 Cerere proastă. BackTrace: 1. TidychatModels :: perform_chat (newchat) 5. HTTR2 :: req_perform (preparate_engine)
Roluri
Majoritatea LLM -urilor au roluri diferite, adesea un „utilizator” și un rol de „sistem”. Acestea vă oferă un control mai precis asupra producției LLM. Există sfaturi grozave din partea vânzătorilor cu privire la modul de utilizare a acestor roluri, de exemplu, cu (antropic) (https://docs.antropic.com/en/docs/build-with-claude/prompt-engineering/system-prompts#legal-contract -Analize-cu-promptând-rol)
Setarea unui rol de sistem controlează modul în care se comportă LLM. Oamenii folosesc acestea pentru a face AI să acționeze ca un anumit personaj, cum ar fi un asistent de cercetare. Să o vedem în acțiune.
Promparea este ca o programare, dar mai puțin precisă (enervant pentru mine, căruia îi place programarea și lucrurile să fie exacte!). Prompturile bune vor tinde să vă obțină rezultate mai bune. Dar, desigur, ca în cazul tuturor învățării profunde, rezultatele au un element de aleatoriu, la fel și poate fi inconsistent.
base_settings <- create_chat("anthropic",
api_key = Sys.getenv("ANTHROPIC_KEY"),
api_version = '2023-06-01') |>
add_model("claude-3-5-haiku-20241022") |>
add_params('temperature' = 0.8, max_tokens = 100)
newchat <- base_settings |>
add_message(
role="system",
message="You are a funky dude who loves writing online R lessons."
) |>
add_message(
#defaults to 'user' role
message="Write a paragraph about loading dataframes in R. ") |>
perform_chat()
extract_chat(newchat)
OK, deci rolul de sistem nu a funcționat foarte bine în acest caz. Pentru a obține ieșirea „Funky Dude”, trebuie să o puneți în rolul utilizatorului.
Acum să ne uităm să facem asta pentru o hârtie adevărată.
Ca exemplu, voi folosi hârtia mea recentă despre mortalitatea țestoase, pentru că o știu bine și dimensiunea fișierului nu este prea mare.
Acum putem folosi pachetul PDFTOols pentru a citi în text din fișier. De asemenea, puteți încerca să citiți acest lucru direct de pe web ca HTML, care vă poate permite să identificați anumite secțiuni sau date în tabele, mai eficient (folosind etichete HTML).
Rețineți că efectuarea de solicitări repetate pentru paginile HTML ar putea să vă blocheze temporar de pe serverul editorului.
library(pdftools)
text <- pdf_text("data/Brown_etal2024 national scale turtle mortality.pdf")
Acum, făcând cele de mai sus nu au reușit să funcționeze, am primit din nou eroarea darn 400 când am trimis -o la API. Problema părea să fie în formatarea textului. Așa că pot continua cu următorul pas, am tăiat și lipit textul într -un fișier text. În mod clar, curățarea PDFS/HTML pentru utilizare va fi o mare parte a acestui proces. (Ca toate modelarea, curățarea datelor durează de obicei de cele mai multe ori).
methods_text <- readLines("data/example-text.txt") |>
paste(collapse = " ")
Trimiterea textului către LLM
Acum avem textul nostru îl putem trimite la LLM.
newchat <- base_settings |>
add_params('temperature' = 0.2, max_tokens = 600) |>
add_message(
role="system",
message = "You are a research assistant who has been asked to summarise the methods section of a paper on turtle mortality.
You will extract key statistics on:
Sample size: << Insert sample size here>>
Year of the study: << Insert year here>>
DONT EXTRACT ANY MORE INFORMATION BEYOND THIS POINT.
"
) |>
add_message(
message = methods_text
) |>
perform_chat()
extract_chat(newchat)
Promptul este esențial aici. În rolul de sistem, i -am spus să extragem datele într -un mod structurat. De asemenea, am inclus „Nu extrageți mai multe informații dincolo de acest punct”. pentru a împiedica să continue să vorbească. Utilizarea CAPS subliniază punctul către AI.
Iată ieșirea:
Pe baza secțiunii Metode, aici sunt statisticile cheie: dimensiunea eșantionului: 357 seturi (monitorizare electronică) pentru pe scară largă pe scară largă de pescuit longline (LLF) Anul studiului: 2018
Iată ieșirea fără partea finală în CAPS:
Asistent: Pe baza secțiunii Metode, aici sunt statisticile cheie: Mărimea eșantionului: – Pentru pescuit la scară mică (SSF): capturi monitorizate din 10 comunități din 8 din 9 provincii – pentru pescuitul de lungă durată (LLF): 357 de seturi revizuite , cuprinzând între 2018-01-24 până în 2019-08-17-Evenimente totale de captură pentru LLF: 25.403 Evenimente de captură-Monitorizare electronică implementată pe 7 nave Anul studiului: 2018 (anul primar de colectare a datelor) Detalii notabile suplimentare:-utilizat Bootstrapping non -parametric pentru extinderea și estimarea intervalelor de încredere – Metodele de monitorizare au implicat membri ai comunității instruite și sisteme de monitorizare electronică – revizuirea video a datelor LLF a durat 0,5 până la 2 zile pe set – a folosit trei metode diferite pentru a extinde capturile de broască țestoasă pentru LLF pentru a ține cont variabilitate
Acest lucru este foarte precis, dar include prea multe „detalii suplimentare”. Cu toate acestea, obține mai multe detalii despre metode cu privire la diferitele dimensiuni de eșantion pentru diferite părți ale studiului.
Să obținem textul de ieșire:
chatout <- extract_chat(newchat) output <- chatout(chatout$role == 'assistant', 'message')
Pentru repetabilitate doar pentru blog, codific greu asta
output <- data.frame(message = "Based on the methods section, here are the key statistics:nnSample size: 357 sets (electronic monitoring) for large-scale longline fishery (LLF)nYear of the study: 2018")
Transformați textul în date structurate
Datele noastre sunt semi -structurate după modul în care am făcut promptul. Acum vrem să punem dimensiunea eșantionului și anul în câmpurile de date.
Folosesc separate_wider_delim Pentru a separa mai întâi primul paragraf care a avut două pauze ”, apoi din nou pentru a împărți dimensiunea eșantionului și anul în coloane (au fost separate de ”).
În cele din urmă, str_remove_all scapă de „dimensiunea eșantionului:” și „anul studiului:” text.
library(stringr)
cleaned_output <- output |>
separate_wider_delim(
cols = message,
delim = 'nn',
names = c('response', 'stats')
) |>
separate_wider_delim(
cols = stats,
delim = 'n',
names = c('sample_size', 'year')
) |>
mutate(
across(
sample_size:year,
(x) str_remove_all(
x,
'Sample size: |Year of the study: '
)
))
Deci, acum ne putem obține cu ușurință variabilele (un fel de)
cleaned_output$sample_size cleaned_output$year
Reflecții despre provocări și pașii următori pentru automatizarea extragerii datelor
Incertitudinea costurilor
Acest lucru ar trebui să fie ieftin. A costat <1c pentru a face această postare cu toate testările. Deci, în teorie, puteți face 100 de secțiuni de metode pentru <100USD. Cu toate acestea, dacă testați înapoi și înainte sau utilizați lucrări complete, costul s -ar putea adăuga. Va fi greu să estimați acest lucru până când oamenii nu obțin mai multă experiență.
Obținerea lucrărilor și tratarea textului nestructurat în PDFS sau HTML
O mare provocare va fi introducerea textului într -un format pe care LLM îl poate folosi. Apoi, există probleme precum obținerea textului. Descărcarea PDF -urilor consumă mult timp și intensă date. Încercarea de a citi date text de pe paginile web poate fi, de asemenea, dificilă, din cauza pereților de plată și a limitelor de rată (s -ar putea să vă blocați pentru a face solicitări de reqeat).
De exemplu, într -un studiu trecut, am făcut acolo unde am făcut simplu „Bag of Words Analysis”, fie am descărcat manual PDF -urile, fie am stabilit cronometre pentru a întârzia accesurile web și pentru a evita să ne blocăm.
Formatul HTML ar fi ideal, deoarece etichetele înseamnă secțiunile hârtiei, iar figurile deja semi-structurate.
Solicitare
Trebuie să experimentați cu acest lucru pentru a -l înțelege corect. De asemenea, ar putea fi bine să repetați același text pentru a triangula rezultate exacte.
Curățarea ieșirii textului LLM
În exemplul meu simplu, acest lucru a fost ușor. Cu toate acestea, cu un număr mare de prompturi și documente, răspunsurile LLM ar putea avea mai multă variabilitate care trebuie tratate, de exemplu, va folosi întotdeauna o pauză de linie între întrebările mele de date? Puteți ajuta la controlul acestei probleme, solicitându -i să structureze ieșirea în format XML sau JSON, ceea ce este mai ușor de analizat în foi de date.
Datele încă nu sunt date și necesită interpretare
Puteți vedea din exemplele mele simple de mai sus că ieșirea nu poate fi reprezentată. De fapt, necesită mai multă interpretare. Mărimea eșantionului a fost prezentată ca „357 de seturi (monitorizare electronică) pentru pescuitul longline pe scară largă (LLF)”. Deci este 357? Există și alte dimensiuni de eșantion care ar putea fi relevante?
Validare
Cu siguranță veți dori să verificați manual ieșirea și să raportați statisticile de precizie în studiul dvs. Poate că recenzia dvs. are 1000 de lucrări, veți dori să verificați manual 100 dintre ele pentru a vedea cât de precis a fost LLM.
Mai va trebui să citiți o mulțime de lucrări pentru a scrie o recenzie bună
O revizuire aprinsă este mai mult decât datele sistematice. Încă cred că trebuie să citești o mulțime de lucrări pentru a înțelege literatura și pentru a face o sinteză utilă. Dacă utilizați AI, sunteți vulnerabil la „iluzia înțelegerii”.
Concluzie
Acest instrument va fi cel mai bun pentru sarcini bine definite și lucrări scrise constant. De exemplu, un caz de utilizare ideal ar fi revizuirea a 500 de lucrări de acidificare oceanică care au folosit toate proiectele experimentale similare și terminologia. Vei putea apoi să obții răspunsuri consistente la solicitări despre dimensiunea eșantionului, etc …
Un alt caz de utilizare ar fi extragerea tipurilor de model din documentele modelului de distribuție a speciilor.
Sarcinile mai grele vor fi în cazul în care lucrările provin din diverse discipline sau vor folosi terminologie inconsistentă sau metode. Studiul meu a fost un bun exemplu în acest sens, au fost raportate aproximativ 5 dimensiuni diferite de eșantion. Așadar, în acest exemplu, ar trebui să ne gândim mai întâi la ce dimensiune de eșantion pe care ați dorit să o extrageți înainte de a scrie promptul.
