Zināšanu grafiku veidošana no teksta jau ilgu laiku ir bijusi aizraujoša pētniecības joma. Līdz ar lielo valodu modeļu (LLM) parādīšanos šī joma ir ieguvusi lielāku uzmanību. Tomēr LLM var būt diezgan dārgi. Alternatīva pieeja ir precizēt mazākus modeļus, ko atbalsta akadēmiskais pētījums, radot efektīvākus risinājumus. Šodien mēs izpētīsim Relik — ietvaru, kas ļauj darboties ātri un viegliem informācijas ieguves modeļiem, ko izstrādājusi NLP grupa Romas Sapienza Universitātē.
Tipisks informācijas ieguves cauruļvads bez LLM izskatās šādi:
Attēlā ilustrēts informācijas ieguves cauruļvads, sākot no ievades datiem, kas sastāv no teksta, kurā minēts “Tomazam patīk rakstīt emuāra ierakstus. Viņu īpaši interesē diagrammu zīmēšana. Process sākas ar pamatreferences izšķirtspēju, lai identificētu “Tomaz” un “Viņš” kā vienu un to pašu entītiju. Nosauktā entītiju atpazīšana (NER) pēc tam identificē tādas entītijas kā “Tomaz”, “Blogs” un “Diagram”.
Entītiju saistīšana ir process, kas seko NER, kurā atpazītās entītijas tiek kartētas ar atbilstošiem ierakstiem datu bāzē vai zināšanu bāzē. Piemēram, “Tomaz” ir saistīts ar “Tomaz Bratanic (Q12345)” un “Blogs” ar “Blog (Q321), bet “Diagram” zināšanu bāzē nav atbilstības.
Attiecību iegūšana ir nākamais solis, kurā sistēma identificē un iegūst nozīmīgas attiecības starp atzītajām entītijām. Šis piemērs norāda, ka “Tomaz” ir saistība ar “Blog”, ko raksturo “RAKSTA”, norādot, ka Tomaz raksta emuārus. Turklāt tas norāda, ka “Tomaz” ir saistība ar “diagrammu”, ko raksturo “INTERESTED_IN”, norādot, ka Tomaz interesē diagrammas.
Visbeidzot, šī strukturētā informācija, tostarp entītijas un to attiecības, tiek glabāta zināšanu grafikā, ļaujot sakārtot un pieejamus datus turpmākai analīzei vai izguvei.
Tradicionāli, neizmantojot LLM spēku, viss šis process balstās uz specializētu modeļu komplektu, katrs veic konkrētu uzdevumu no pamatareferences izšķiršanas līdz attiecību iegūšanai. Lai gan šo modeļu integrācija prasa lielāku piepūli un koordināciju, tā piedāvā ievērojamu priekšrocību: samazinātas izmaksas. Precizējot mazākus, uzdevumam raksturīgus modeļus, sistēmas izveides un uzturēšanas kopējos izdevumus var kontrolēt.
Kods ir pieejams vietnē GitHub .
Es iesaku izmantot atsevišķu Python vidi, piemēram, Google Colab , jo mums būs nedaudz jāspēlējas ar atkarībām. Modeļi ir ātrāki ar GPU, tāpēc varat izmantot ar GPU darbinātu izpildlaiku, ja jums ir Pro versija.
Turklāt mums ir jāiestata Neo4j, vietējā grafiku datu bāze, lai saglabātu iegūto informāciju. Ir daudzi veidi, kā iestatīt datu bāzes gadījumu . Tomēr es iesaku izmantot Neo4j Aura , kas nodrošina bezmaksas mākoņa instanci, kurai var viegli piekļūt no Google Colab piezīmju grāmatiņas.
Neo4j Aura — pilnībā pārvaldīts mākoņa risinājums
Pēc datu bāzes izveidošanas mēs varam definēt savienojumu, izmantojot LlamaIndex:
from llama_index.graph_stores.neo4j import Neo4jPGStore username="neo4j" password="rubber-cuffs-radiator" url="bolt://54.89.19.156:7687" graph_store = Neo4jPGStore( username=username, password=password, url=url, refresh_schema=False )
Mēs izmantosim ziņu datu kopu, ko pirms kāda laika ieguvu, izmantojot Diffbot API . Datu kopa ir ērti pieejama vietnē GitHub, lai mēs varētu atkārtoti izmantot:
import pandas as pd NUMBER_OF_ARTICLES = 100 news = pd.read_csv( "https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/news_articles.csv" ) news = news.head(NUMBER_OF_ARTICLES)
Pirmais solis izstrādes procesā ir pamatareferences izšķirtspējas modelis. Korekcijas izšķirtspēja ir uzdevums identificēt visas teksta izteiksmes, kas attiecas uz vienu un to pašu entītiju.
Cik man zināms, pamatreferences izšķirtspējai nav pieejams daudz atvērtā pirmkoda modeļu. Es izmēģināju maverick-coref , bet manos testos Coreferee no spaCy darbojās labāk, tāpēc mēs to izmantosim. Vienīgais Coreferee lietošanas trūkums ir tas, ka mums ir jātiek galā ar atkarības elli, kas ir atrisināta piezīmjdatorā, taču mēs to nepārskatīsim.
Varat ielādēt pamatreferences modeli spaCy ar šādu kodu:
import spacy, coreferee coref_nlp = spacy.load('en_core_web_lg') coref_nlp.add_pipe('coreferee')
Coreferee modelis nosaka izteiksmju kopas, kas attiecas uz vienu un to pašu entītiju vai entītijām. Lai pārrakstītu tekstu, pamatojoties uz šīm kopām, mums ir jāievieš sava funkcija:
def coref_text(text): coref_doc = coref_nlp(text) resolved_text = "" for token in coref_doc: repres = coref_doc._.coref_chains.resolve(token) if repres: resolved_text += " " + " and ".join( [ t.text if t.ent_type_ == "" else [e.text for e in coref_doc.ents if t in e][0] for t in repres ] ) else: resolved_text += " " + token.text return resolved_text
Pārbaudīsim funkciju, lai pārliecinātos, vai modeļi un atkarības ir iestatītas pareizi:
print( coref_text("Tomaz is so cool. He can solve various Python dependencies and not cry") ) # Tomaz is so cool . Tomaz can solve various Python dependencies and not cry
Šajā piemērā modelis identificēja, ka “Tomaz” un “Viņš” attiecas uz vienu un to pašu entītiju. Izmantojot funkciju coref_text, mēs aizstājam “Viņš” ar “Tomaz”.
Ņemiet vērā, ka pārrakstīšana ne vienmēr atgriež gramatiski pareizus teikumus, jo klastera entītijām tiek izmantota vienkārša aizstāšanas loģika. Tomēr tam vajadzētu būt pietiekami labam vairumam scenāriju.
Tagad mūsu ziņu datu kopai piemērojam pamatreferences izšķirtspēju un apkopojam rezultātus kā LlamaIndex dokumentus:
from llama_index.core import Document news["coref_text"] = news["text"].apply(coref_text) documents = [ Document(text=f"{row['title']}: {row['coref_text']}") for i, row in news.iterrows() ]
Relik ir bibliotēka ar entītiju saistīšanas (EL) un attiecību iegūšanas (RE) modeļiem, un tā atbalsta arī modeļus, kas apvieno abus. Entītiju saistīšanā Vikipēdija tiek izmantota kā mērķa zināšanu bāze, lai kartētu entītijas tekstā ar to atbilstošajiem ierakstiem enciklopēdijā.
No otras puses, attiecību iegūšana ietver attiecību identificēšanu un kategorizēšanu starp entītijām tekstā, ļaujot iegūt strukturētu informāciju no nestrukturētiem datiem.
Ja izmantojat Colab bezmaksas versiju, izmantojiet relik-ie/relik-relation-extraction-small modeli, kas veic tikai attiecību izgūšanu. Ja jums ir Pro versija vai jūs to izmantosit spēcīgākā vietējā datorā, varat pārbaudīt relik-ie/relik-cie-small modeli, kas veic entītiju saistīšanu un attiecību izgūšanu.
from llama_index.extractors.relik.base import RelikPathExtractor relik = RelikPathExtractor( model="relik-ie/relik-relation-extraction-small" ) # Use on Pro Collab with GPU # relik = RelikPathExtractor( # model="relik-ie/relik-cie-small", model_config={"skip_metadata": True, "device":"cuda"} # )
Turklāt mums ir jādefinē iegulšanas modelis, kas tiks izmantots entītiju iegulšanai, un LLM jautājumu atbilžu plūsmai:
import os from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.llms.openai import OpenAI os.environ["OPENAI_API_KEY"] = "sk-" llm = OpenAI(model="gpt-4o", temperature=0.0) embed_model = OpenAIEmbedding(model_name="text-embedding-3-small")
Ņemiet vērā, ka LLM netiks izmantots grafika veidošanas laikā.
Tagad, kad viss ir izveidots, mēs varam izveidot PropertyGraphIndex un izmantot ziņu dokumentus kā ievades datus zināšanu diagrammā.
Turklāt mums ir jānodod relik modelis kā kg_extractors vērtība, lai iegūtu attiecības:
from llama_index.core import PropertyGraphIndex index = PropertyGraphIndex.from_documents( documents, kg_extractors=[relik], llm=llm, embed_model=embed_model, property_graph_store=graph_store, show_progress=True, )
Pēc grafika izveidošanas varat atvērt pārlūkprogrammu Neo4j, lai apstiprinātu importēto grafiku. Jums vajadzētu iegūt līdzīgu vizualizāciju, izpildot šādu Cypher paziņojumu:
MATCH p=(:__Entity__)--(:__Entity__) RETURN p LIMIT 250
Rezultāti
Izmantojot LlamaIndex, tagad ir viegli atbildēt uz jautājumiem. Lai izmantotu noklusējuma grafiku retrīverus, varat uzdot tik vienkāršus jautājumus kā:
query_engine = index.as_query_engine(include_text=True) response = query_engine.query("What happened at Ryanair?") print(str(response))
Šeit tiek izmantots definētais LLM un iegulšanas modelis. Protams, jūs varat arī ieviest pielāgotus retrīverus, lai nodrošinātu potenciāli labāku precizitāti.
Zināšanu grafiku veidošana, nepaļaujoties uz LLM, ir ne tikai iespējama, bet arī rentabla un efektīva. Precīzi pielāgojot mazākus, uzdevumam raksturīgus modeļus, piemēram, tos, kas iekļauti Relik sistēmā, varat sasniegt augstas veiktspējas informācijas ieguvi savām izguves paplašinātās paaudzes (RAG) lietojumprogrammām.
Entītiju saistīšana, kas ir būtisks solis šajā procesā, nodrošina, ka atpazītās entītijas tiek precīzi kartētas ar atbilstošajiem ierakstiem zināšanu bāzē, tādējādi saglabājot zināšanu diagrammas integritāti un lietderību.
Izmantojot tādus ietvarus kā Relik un tādas platformas kā Neo4j, ir iespējams izveidot progresīvu zināšanu grafikus, kas atvieglo sarežģītus datu analīzes un izguves uzdevumus, bez lielām izmaksām, kas parasti saistītas ar LLM izvietošanu. Šī metode ne tikai padara jaudīgus datu apstrādes rīkus pieejamākus, bet arī veicina inovāciju un efektivitāti informācijas ieguves darbplūsmās.
Noteikti piešķiriet Relik bibliotēkai zvaigznīti . Kods ir pieejams vietnē GitHub .
Lai uzzinātu vairāk par šo tēmu, pievienojieties mums NODES 2024 7. novembrī — mūsu bezmaksas virtuālajā izstrādātāju konferencē par viedajām lietotnēm, zināšanu diagrammām un AI. Reģistrējies TAGAD !