Տեքստից գիտելիքների գծապատկերների կառուցումը բավականին երկար ժամանակ եղել է հետազոտության հետաքրքրաշարժ ոլորտ: Լեզուների մեծ մոդելների (LLM) հայտնվելով այս ոլորտը ավելի մեծ ուշադրություն է գրավել: Այնուամենայնիվ, LLM-ները կարող են բավականին ծախսատար լինել: Այլընտրանքային մոտեցումը փոքր մոդելների ճշգրտումն է, որն ապահովվել է ակադեմիական հետազոտություններով՝ տալով ավելի արդյունավետ լուծումներ: Այսօր մենք կուսումնասիրենք Relik-ը ՝ մի շրջանակ, որն աշխատում է արագ և թեթև տեղեկատվության արդյունահանման մոդելների համար, որը մշակվել է Հռոմի Սապիենցա համալսարանի NLP խմբի կողմից:
Տիպիկ տեղեկատվության արդյունահանման խողովակաշարն առանց LLM-ի նման է հետևյալին.
Պատկերը ցույց է տալիս տեղեկատվության արդյունահանման խողովակաշարը՝ սկսած մուտքային տվյալներից, որը բաղկացած է տեքստից, որտեղ նշվում է «Թոմազը սիրում է գրել բլոգային գրառումներ։ Նա հատկապես հետաքրքրված է գծապատկերներ գծելով»։ Գործընթացը սկսվում է «Թոմազին» և «Նա»-ին որպես նույն կառույց ճանաչելու հիմնական որոշմամբ: Անվանված միավորի ճանաչումը (NER) այնուհետև նույնականացնում է այնպիսի միավորներ, ինչպիսիք են «Տոմազը», «Բլոգը» և «Դիագրամը»:
Կազմակերպությունների կապակցումը NER-ին հաջորդող գործընթացն է, որտեղ ճանաչված սուբյեկտները քարտեզագրվում են տվյալների բազայի կամ գիտելիքների բազայի համապատասխան գրառումներին: Օրինակ, «Tomaz»-ը կապված է «Tomaz Bratanic (Q12345)» և «Blog»-ը «Blog» (Q321) հետ, սակայն «Diagram»-ը չի համապատասխանում գիտելիքների բազայում:
Հարաբերությունների արդյունահանումը հաջորդ քայլն է, որտեղ համակարգը նույնականացնում և արդյունահանում է ճանաչված կազմակերպությունների միջև իմաստալից հարաբերությունները: Այս օրինակը ցույց է տալիս, որ «Թոմազը» կապ ունի «Բլոգի» հետ, որը բնութագրվում է «ԳՐՈՒՄ է», ինչը ցույց է տալիս, որ Թոմազը բլոգներ է գրում: Բացի այդ, այն բացահայտում է, որ «Տոմազը» կապ ունի «Դիագրամի» հետ, որը բնութագրվում է «INTERESTED_IN»-ով, ինչը ցույց է տալիս, որ Թոմազը հետաքրքրված է դիագրամներով:
Վերջապես, այս կառուցվածքային տեղեկատվությունը, ներառյալ սուբյեկտները և նրանց հարաբերությունները, պահվում են գիտելիքի գծապատկերում, որը թույլ է տալիս կազմակերպված և մատչելի տվյալներ հետագա վերլուծության կամ որոնման համար:
Ավանդաբար, առանց LLM-ների հզորության, այս ամբողջ գործընթացը հիմնված է մասնագիտացված մոդելների փաթեթի վրա, որոնցից յուրաքանչյուրը կատարում է որոշակի խնդիր՝ հիմնական լուծումից մինչև հարաբերությունների արդյունահանում: Թեև այս մոդելների ինտեգրումը պահանջում է ավելի շատ ջանք և համակարգում, այն առաջարկում է էական առավելություն՝ կրճատված ծախսեր: Մանր կարգավորելով ավելի փոքր, առաջադրանքին հատուկ մոդելները, համակարգի կառուցման և պահպանման ընդհանուր ծախսերը կարող են վերահսկվել:
Կոդը հասանելի է GitHub- ում:
Ես առաջարկում եմ օգտագործել առանձին Python միջավայր, ինչպիսին է Google Colab-ը , քանի որ մենք ստիպված կլինենք մի փոքր խաղալ կախվածությունների հետ: Մոդելներն ավելի արագ են աշխատում GPU-ով, այնպես որ կարող եք օգտագործել GPU-ով աշխատող գործարկման ժամանակ, եթե ունեք Pro տարբերակը:
Բացի այդ, մենք պետք է ստեղծենք Neo4j՝ բնիկ գրաֆիկական տվյալների բազա՝ արդյունահանված տեղեկատվությունը պահելու համար: Ձեր տվյալների բազայի օրինակը կարգավորելու բազմաթիվ եղանակներ կան: Այնուամենայնիվ, ես խորհուրդ եմ տալիս օգտագործել Neo4j Aura-ն , որն ապահովում է անվճար ամպային օրինակ, որը հեշտությամբ կարելի է մուտք գործել Google Colab նոթատետրից:
Neo4j Aura – Լիովին կառավարվող ամպային լուծում
Տվյալների բազան ստեղծելուց հետո մենք կարող ենք կապ սահմանել 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 )
Մենք կօգտագործենք նորությունների հավաքածու, որը ես ստացել եմ որոշ ժամանակ առաջ Diffbot API-ի միջոցով: Տվյալների հավաքածուն հարմար է GitHub-ում, որպեսզի մենք նորից օգտագործենք.
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)
Խողովակաշարի առաջին քայլը հիմնարար լուծման մոդելն է: Համապատասխան լուծումը տեքստի բոլոր արտահայտությունների նույնականացման խնդիրն է, որոնք վերաբերում են նույն անձին:
Իմ գիտելիքներով, բաց կոդով շատ մոդելներ չկան, որոնք հասանելի են coreference-ի լուծման համար: Ես փորձեցի maverick-coref- ը, բայց իմ թեստերում Coreferee-ն spaCy-ից ավելի լավ աշխատեց, ուստի մենք կօգտագործենք դա: Coreferee-ի օգտագործման միակ թերությունն այն է, որ մենք պետք է գործ ունենանք կախվածության դժոխքի հետ, որը լուծվում է նոթատետրում, բայց մենք այստեղ չենք անցնի դրա միջով:
Դուք կարող եք բեռնել coreference մոդելը spaCy-ում հետևյալ կոդով.
import spacy, coreferee coref_nlp = spacy.load('en_core_web_lg') coref_nlp.add_pipe('coreferee')
Coreferee մոդելը հայտնաբերում է արտահայտությունների կլաստերներ, որոնք վերաբերում են միևնույն էությանը կամ սուբյեկտներին: Այս կլաստերների հիման վրա տեքստը վերագրելու համար մենք պետք է իրականացնենք մեր սեփական գործառույթը.
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
Եկեք փորձարկենք ֆունկցիան՝ համոզվելու համար, որ մոդելները և կախվածությունները ճիշտ են կարգավորվել.
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
Այս օրինակում մոդելը բացահայտեց, որ «Թոմազ»-ը և «Նա»-ն վերաբերում են միևնույն էությանը: Օգտագործելով coref_text ֆունկցիան՝ «Նա»-ն փոխարինում ենք «Տոմազ»-ով:
Նկատի ունեցեք, որ վերաշարադրումը միշտ չէ, որ վերադարձնում է քերականորեն ճիշտ նախադասություններ՝ կլաստերի ներսում գտնվող սուբյեկտների համար պարզ փոխարինող տրամաբանության օգտագործման պատճառով: Այնուամենայնիվ, այն պետք է բավականաչափ լավ լինի սցենարների մեծ մասի համար:
Այժմ մենք կիրառում ենք համադրման բանաձեւը մեր նորությունների տվյալների բազայում և արդյունքները փաթեթավորում ենք որպես LlamaIndex փաստաթղթեր.
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-ը գրադարան է միավորման (EL) և հարաբերությունների արդյունահանման (RE) մոդելներով, և այն նաև աջակցում է երկուսը համատեղող մոդելներին: Կազմակերպությունների կապակցման ժամանակ Վիքիպեդիան օգտագործվում է որպես նպատակային գիտելիքների բազա՝ տեքստում գտնվող սուբյեկտները հանրագիտարանի իրենց համապատասխան գրառումներին քարտեզագրելու համար:
Մյուս կողմից, հարաբերությունների արդյունահանումը ներառում է տեքստի ներսում սուբյեկտների միջև հարաբերությունների նույնականացում և դասակարգում, ինչը հնարավորություն է տալիս կառուցվածքային տեղեկատվության արդյունահանումը չկառուցված տվյալներից:
Եթե դուք օգտագործում եք Colab-ի անվճար տարբերակը, օգտագործեք relik-ie/relik-relation-extraction-small մոդելը, որն իրականացնում է միայն հարաբերությունների արդյունահանում: Եթե ունեք Pro տարբերակ, կամ այն կօգտագործեք ավելի ուժեղ տեղական մեքենայի վրա, կարող եք փորձարկել relik-ie/relik-cie-small մոդելը, որն իրականացնում է միավորների կապակցում և հարաբերությունների արդյունահանում:
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"} # )
Բացի այդ, մենք պետք է սահմանենք ներդրման մոդելը, որը կօգտագործվի միավորների և LLM-ի ներդրման համար՝ հարցուպատասխանի հոսքի համար.
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")
Նկատի ունեցեք, որ LLM-ը չի օգտագործվի գրաֆիկի կառուցման ժամանակ:
Այժմ, երբ մենք ունենք ամեն ինչ, մենք կարող ենք ստեղծել PropertyGraphIndex-ը և օգտագործել նորությունների փաստաթղթերը որպես գիտելիքների գրաֆիկի մուտքագրման տվյալներ:
Բացի այդ, մենք պետք է փոխանցենք relik մոդելը որպես kg_extractors արժեք՝ հարաբերությունները հանելու համար.
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, )
Գրաֆիկը կառուցելուց հետո կարող եք բացել Neo4j դիտարկիչը՝ ներմուծված գրաֆիկը վավերացնելու համար: Դուք պետք է ստանաք նմանատիպ վիզուալացում՝ գործարկելով հետևյալ Cypher հայտարարությունը.
MATCH p=(:__Entity__)--(:__Entity__) RETURN p LIMIT 250
Արդյունքներ
Օգտագործելով LlamaIndex-ը, այժմ հեշտ է կատարել հարցերի պատասխանները: Լռելյայն գրաֆիկական ռետրիվերներ օգտագործելու համար կարող եք հարցեր տալ այնքան պարզ, որքան.
query_engine = index.as_query_engine(include_text=True) response = query_engine.query("What happened at Ryanair?") print(str(response))
Ահա թե որտեղ է գործում սահմանված LLM-ը և ներդրման մոդելը: Իհարկե, դուք կարող եք նաև կիրառել մաքսային ռետրիվերներ պոտենցիալ ավելի լավ ճշգրտության համար:
Գիտելիքի գծապատկերների կառուցումն առանց LLM-ների վրա հենվելու ոչ միայն իրագործելի է, այլև ծախսարդյունավետ և արդյունավետ: Մանրացնելով ավելի փոքր, առաջադրանքների համար նախատեսված մոդելները, ինչպիսիք են Relik շրջանակում, դուք կարող եք հասնել բարձր արդյունավետության տեղեկատվության արդյունահանման ձեր որոնման հավելյալ սերնդի (RAG) հավելվածների համար:
Կազմակերպությունների կապակցումը, որը կարևոր քայլ է այս գործընթացում, ապահովում է, որ ճանաչված սուբյեկտները ճշգրիտ քարտեզագրվեն գիտելիքների բազայի համապատասխան գրառումներին՝ դրանով իսկ պահպանելով գիտելիքների գրաֆիկի ամբողջականությունն ու օգտակարությունը:
Օգտագործելով այնպիսի շրջանակներ, ինչպիսիք են Relik-ը և այնպիսի հարթակներ, ինչպիսին է Neo4j-ը, հնարավոր է կառուցել առաջադեմ գիտելիքների գծապատկերներ, որոնք հեշտացնում են տվյալների բարդ վերլուծությունը և որոնման առաջադրանքները՝ առանց բարձր ծախսերի, որոնք սովորաբար կապված են LLM-ների տեղակայման հետ: Այս մեթոդը ոչ միայն ավելի մատչելի է դարձնում տվյալների մշակման հզոր գործիքները, այլև խթանում է նորարարությունն ու արդյունավետությունը տեղեկատվության արդյունահանման գործընթացներում:
Համոզվեք, որ Relik գրադարանին աստղ տվեք: Կոդը հասանելի է GitHub- ում:
Այս թեմայի մասին ավելին իմանալու համար միացեք մեզ նոյեմբերի 7-ին կայանալիք NODES 2024-ին՝ խելացի հավելվածների, գիտելիքի գծապատկերների և AI-ի վերաբերյալ մեր անվճար վիրտուալ մշակողների համաժողովին: Գրանցվեք ՀԻՄԱ !