Мәтіннен білім графиктерін құру біршама уақыт бойы қызықты зерттеу саласы болды. Үлкен тілдік модельдердің (LLM) пайда болуымен бұл салаға көбірек назар аударылды. Дегенмен, LLM өте қымбат болуы мүмкін. Баламалы тәсіл - тиімдірек шешімдерді беретін академиялық зерттеулермен қолдау тапқан кішірек үлгілерді дәл баптау. Бүгін біз Римдегі Сапиенца университетіндегі NLP тобы әзірлеген жылдам және жеңіл ақпаратты алу үлгілерін іске қосуға арналған Relik негізін зерттейміз.
LLM жоқ әдеттегі ақпаратты алу құбыры келесідей көрінеді:
Суретте «Томаз блог жазбаларын жазғанды ұнатады. Ол диаграммаларды салуға ерекше қызығушылық танытады». Процесс «Томаз» және «Ол» бір тұлға ретінде анықтау үшін негізгі анықтамалық шешімнен басталады. Атаулы нысанды тану (NER) содан кейін «Томаз», «Блог» және «Диаграмма» сияқты нысандарды анықтайды.
Нысанды байланыстыру - танылған нысандар дерекқордағы немесе білім қорындағы сәйкес жазбалармен салыстырылатын NER-ден кейінгі процесс. Мысалы, «Tomaz» «Tomaz Bratanic (Q12345)» және «Блог» «Блог (Q321)» дегенмен байланысты, бірақ «Диаграмма» білім қорында сәйкес келмейді.
Қарым-қатынастарды шығару жүйе танылған нысандар арасындағы мағыналы қатынастарды анықтайтын және шығаратын кейінгі қадам болып табылады. Бұл мысал «Томаздың» «ЖАЗУЛАР» арқылы сипатталатын «Блогпен» байланысы бар екенін анықтайды, бұл Томаздың блогтар жазатынын көрсетеді. Оған қоса, ол «Томаздың» «INTERESTED_IN» белгісімен сипатталатын «Диаграммамен» байланысы бар екенін анықтайды, бұл Томаздың диаграммаларға қызығушылық танытатынын көрсетеді.
Ақырында, бұл құрылымдық ақпарат, соның ішінде нысандар мен олардың қарым-қатынастары, әрі қарай талдау немесе іздеу үшін ұйымдастырылған және қолжетімді деректерге мүмкіндік беретін білім графигінде сақталады.
Дәстүрлі түрде, LLM күшінсіз, бұл бүкіл процесс мамандандырылған үлгілер жиынтығына сүйенеді, олардың әрқайсысы негізгі анықтамалық шешімнен қарым-қатынастарды шығаруға дейін белгілі бір тапсырманы орындайды. Бұл модельдерді біріктіру көбірек күш пен үйлестіруді талап етеді, бірақ ол айтарлықтай артықшылық береді: шығындарды азайту. Кішірек, тапсырмаға арналған үлгілерді дәл баптау арқылы жүйені құруға және ұстауға кететін жалпы шығындарды бақылауда ұстауға болады.
Код GitHub сайтында қол жетімді.
Мен сізге Google Colab сияқты жеке Python ортасын пайдалануды ұсынамын, өйткені біз тәуелділіктермен біраз ойнауға тура келеді. Модельдер GPU-да жылдамырақ, сондықтан Pro нұсқасы болса, GPU-мен жұмыс істейтін жұмыс уақытын пайдалануға болады.
Сонымен қатар, алынған ақпаратты сақтау үшін Neo4j, жергілікті графикалық дерекқорды орнату керек. Дерекқор данасын орнатудың көптеген жолдары бар. Дегенмен, Google Colab жазу кітапшасынан оңай қол жеткізуге болатын тегін бұлт данасын қамтамасыз ететін Neo4j Aura пайдалануды ұсынамын.
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)
Құбырдағы бірінші қадам негізгі ажыратымдылық үлгісі болып табылады. Негізгі анықтамалық шешім - мәтіндегі бір нысанға сілтеме жасайтын барлық өрнектерді анықтау міндеті.
Менің білуімше, негізгі анықтамалық ажыратымдылық үшін ашық бастапқы модельдер көп емес. Мен maverick-coref қолданбасын қолданып көрдім, бірақ менің сынақтарымда spaCy ұсынған Corefee жақсы жұмыс істеді, сондықтан біз оны қолданамыз. Coreferee пайдаланудың бірден-бір кемшілігі - бұл ноутбукта шешілетін тәуелділік тозағымен күресуіміз керек, бірақ біз бұл жерде оны қарастырмаймыз.
SpaCy жүйесіне келесі кодпен coreference үлгісін жүктей аласыз:
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
Бұл мысалда үлгі «Томаз» және «Ол» бір нысанға сілтеме жасайтынын анықтады. core_text функциясын пайдалана отырып, біз «Ол» сөзін «Tomaz» дегенге ауыстырамыз.
Кластердегі нысандар үшін қарапайым ауыстыру логикасын пайдалану себебінен қайта жазу әрқашан грамматикалық дұрыс сөйлемдерді қайтармайтынын ескеріңіз. Дегенмен, ол көптеген сценарийлер үшін жеткілікті жақсы болуы керек.
Енді біз негізгі анықтамалық шешімді жаңалықтар деректер жинағына қолданамыз және нәтижелерді 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 қолданумен байланысты жоғары шығындарсыз күрделі деректерді талдау мен іздеу тапсырмаларын жеңілдететін кеңейтілген білім графиктерін құруға болады. Бұл әдіс қуатты деректерді өңдеу құралдарын қол жетімді етіп қана қоймайды, сонымен қатар ақпаратты алудың жұмыс үрдісіндегі инновациялар мен тиімділікке ықпал етеді.
Релик кітапханасына жұлдызша беруді ұмытпаңыз. Код GitHub сайтында қол жетімді.
Осы тақырып туралы көбірек білу үшін 7 қарашада NODES 2024, интеллектуалды қолданбалар, білім графиктері және AI туралы тегін виртуалды әзірлеушілер конференциясына қосылыңыз. ҚАЗІР тіркеліңіз !