Nayax sapa kutiw machaq amtawinakax Retrieval-Augmented Generation (RAG) ukar gráficos ukan phuqhañatak ch’amanchaski, ukax GraphRAG satawa. Ukampirus, taqiniw GraphRAG uka aru ist’asax mayj mayj phuqhañ amuyunïpkaspas ukhamawa. Aka blog tuqinx “ From Local to Global GraphRAG ” qillqatan ukhamarak Microsoft yatxatirinakan phuqhawiparux manqhar ch’allt’añäni. Jiwasax yatiñ gráfico lurañ ukat sumar tukuyañ chiqawj uñakipt’añäni ukatx jutir blog tuqin qillqt’añatakix apsutanakaruw jaytañäni. Yatxatirinakax wali suma chuymampiw código ukan imañ utap churapxitu, ukat jupanakax mä proyecto ukan pankapax utjarakiwa.
Aka patat parltʼaniwayktan uka yatichäwin kunjamsa amuytʼasiwayi ukajj wali muspharkañawa. Nayax amuyasta, mä gráfico de conocimientos uka apnaqañaw wakisi, mä paso ukhamawa, walja fuentenakat yatiyawinak condensañataki ukhamarak mayacht’añataki. Texto ukan entidades ukat relaciones ukanaka apsuñax janiw machaqäkiti. Ukampirus qillqirinakax mä novela (nayatakix mä juk’a) amuyt’aw uñt’ayapxi, ukax gráfico condensado ukan estructura ukat yatiyawinakap wasitat mä texto natural de lengua ukham uñt’ayañataki. Pipeline ukax documentos ukanakat qillqat mantañamp qalltawayi, ukax mä gráfico uñstayañatakiw lurasi. Ukatx gráfico ukax wasitatw natural arut qillqatar jaqukipata, kawkhantix lurat qillqatax entidades específicas jan ukax comunidades de gráficos ukanakat yatiyawinak condensadas ukanakaw utji, ukax nayrax walja qillqatanakan jaljtatawa.
Mä jach’a nivelanxa, GraphRAG pipeline ukar mantañax kunayman yatiyawinakamp phuqhat qillqatanakawa. Qillqatanakax LLM ukampiw lurasi, entidades ukanakax qillqatanakan uñstki ukanakat estructurado yatiyawinak apsuñataki, jupanakan mayacht’asiwinakapamp chika. Ukatxa aka apsutanaka wakicht’ata yatiyawixa mä yatiñ utar uñtawi lurañatakixa apnaqatarakiwa.
Mä gráfico de conocimiento ukan datos uñacht’ayaña apnaqañax askiwa, ukax jank’akiw ukat chiqaparuw walja qillqatanakat jan ukax datos fuentes ukanakat yatiyawinak mayacht’asispa, entidades particulares ukanakat. Kunjamtï sisktanxa, yatiñan gráfico ukax janiw ukakipkakiti, ukampis ukakipkarakiw datos uñacht’ayañax wakisi. Yatiñanak uñacht’ayañ tukuyatatxa, jupanakax algoritmos de gráficos ukat LLM prompting ukanakamp mayacht’ataw apnaqapxi, ukhamat yatiñ uñacht’äwin jikxataski uka entidades ukan ayllunakan resumenes naturales de lenguaje ukanaka lurañataki.
Ukatx uka suma qhanañchäwinakax yatiyawinak condensadas ukanakaw utji, ukax walja datos fuentes ukanakanw jilxati ukatx documentos ukanakax entidades particulares ukat comunidades ukanakatakiw utji.
Uka gasoducto tuqit juk’amp amuyt’añatakix, nayrïr qillqatan uñacht’ayat thakhinak uñakipt’araksnawa.
Pasos en la pipeline — GraphRAG qillqatat uñacht’ayata , CC BY 4.0 ukan licenciat
Akax mä jach’a uñacht’awiwa pipeline ukax apnaqañäniw jupanakan uñakipawip Neo4j ukat LangChain ukanakamp apnaqasa.
Qhanacht’añatakix nayan phuqhawijax janïr jupanakan código ukax utjkipanx lurasiwayi, ukhamax mä juk’a mayjt’awinakax utjaspawa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa, ukax mä juk’a mayjt’awinakaw utjaspa. Nayax uka mayjt’awinak qhanañchañatakiw ch’amachasiskä, kunjamtix sarapkta ukhamarjama.
Uka chimpux GitHub ukan uñt'ayatawa.
Jiwasax Neo4j ukax gráfico almacenamiento subyacente ukham apnaqañäni. Qalltañatakix mä jasak instancia Neo4j Sandbox uka apnaqañawa , ukax Neo4j ukan base de datos ukan cloud ukan instancianakap uñacht’ayi, ukax plugin de Ciencia de Datos de Gráficos ukamp instalatawa. Jan ukax, Neo4j ukan mä local instancia ukar wakicht’añatakix Neo4j Desktop ukan aplicación ukar apkatasa ukat local base de datos ukan instancia ukar uñstayasa. Ukax mä local versión apnaqañapawa, APOC ukat GDS plugins ukanakamp chikancht’asiñax wakisiwa. Luräwinak wakicht’añatakix, payllat, apnaqat AuraDS (Ciencia de Datos) instancia ukax apnaqasispawa, ukax GDS plugin ukaruw churaraki.
Mä Neo4jGraph instancia lurañampiw qalltapxtanxa, ukax conveniencia envoltura ukawa LangChain ukar yapxatatäna:
from langchain_community.graphs import Neo4jGraph os.environ["NEO4J_URI"] = "bolt://44.202.208.177:7687" os.environ["NEO4J_USERNAME"] = "neo4j" os.environ["NEO4J_PASSWORD"] = "mast-codes-trails" graph = Neo4jGraph(refresh_schema=False)
Mä yatiyäw yatiyäw conjunto de datos ukampiw apnaqañäni, ukax mä qawqha pachanak nayraw Diffbot API ukamp lurawayta. Nayax GitHub ukaruw apkatawayta, ukhamat wasitat apnaqañataki:
news = pd.read_csv( "https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/news_articles.csv" ) news["tokens"] = [ num_tokens_from_string(f"{row['title']} {row['text']}") for i, row in news.iterrows() ] news.head()
Nayrïr pä chimpunak uñakipt’añäni, ukax datos ukankiwa.
Jiwasax qillqatanakan p’iqinchawipa ukhamarak qillqatapawa, ukampirus kuna urus uñt’ayasi ukatx token jakthapiwimpiw tiktoken biblioteca apnaqañax utji.
Texto chunking paso ukax wali wakiskiriwa ukatx wali jach’a impacto downstream resultados ukaruw puri. Papel qillqirinakax jisk’a qillqat chimpunak apnaqañax taqpachanx juk’amp entidades ukanakaw apsutäna sasaw jikxatapxatayna.
Jakhuwi entidades extraídas ukanakax qillqat chimpunak jach’a uñt’ayatawa — GraphRAG qillqatat uñacht’ayata , CC BY 4.0 ukan licenciat
Kunjamtï uñjktanxa, 2.400 fichas ukan qillqat chimpunak apnaqañax juk’a entidades extraídas ukanakaruw puriyi, kunapachatix 600 fichas apnaqapkän ukat sipansa. Ukhamarus, LLMs ukax nayrïr t’ijtäwinx janiw taqpach entidades ukanakax apsutäkaspati sasaw uñt’ayapxäna. Ukhamächi ukhaxa, mä heurística uñt’ayapxiwa, walja kuti extracción lurañataki. Jutïr tʼaqanwa uka toqet jukʼamp parltʼañäni.
Ukampirus, kunayman aljasiñanakax utjapuniwa. Jisk’a qillqat chimpunak apnaqañax contexto ukat coreferencias de entidades específicas ukanakan documentos ukan jaljtatanakap chhaqhayaspawa. Amuytʼañataki, mä documentojj “Juan” ukat “jupa” sasin sapa mayni frasenak qellqaspa ukhajja, jiskʼa jiskʼa tʼaqanakar tʼaqanuqtʼasajja, “jupajj” Juanat parlatap jan qhan amuyaspawa. Yaqhip coreferencia jan walt’awinakax mä estrategia de chunking de texto superposición ukampiw askichasispa, ukampis janiw taqpachax askichatäkaspati.
Yatichäwisan qillqatanakasan qhawqha jachʼas uk yatjjatañäni:
sns.histplot(news["tokens"], kde=False) plt.title('Distribution of chunk sizes') plt.xlabel('Token count') plt.ylabel('Frequency') plt.show()
Artículo token jakthapiwinak jaljawipax niya normal ukhamawa, mä pico ukax niya 400 tokens ukhawa. Frecuencia de chunks ukax juk’at juk’atw aka pico ukar puriñkamax jilxati, ukatx simetricamente jisk’achasiwa, ukax jilpach texto chunks ukanakax 400-token marka jak’ankatap uñacht’ayi.
Aka jaljawi utjatapatxa, janiw kuna qillqat chunking ukax aka chiqan lurkañäniti, coreferencia jan walt’awinak jan utjañapataki. Ukhamarjamaxa, GraphRAG proyecto ukax 300 tokens ukjam chunk tamanak apnaqi, 100 tokens de superposición ukampi.
Jutïr amtawix qillqat chimpunakat yatiñanak lurañawa. Aka apnaqawitakix mä LLM ukampiw qillqatanakat nodos ukat relaciones ukham uñt’at yatiyawinak apsuñatakix apnaqapxta. LLM jiskt’awi qillqirinakan qillqatan apnaqata uñakipapxasmawa. Jupanakax LLM mayiwinakaniwa kawkhantix jiwasax nodo ukan etiquetanakap nayraqat uñt’ayaraksnawa, ukampis default ukhamawa, ukax opcional ukhamawa. Ukhamarus, nayrïr qillqatanakan apsut mayacht’asiwinakax janiw chiqpachans mä kastanïkiti, mä qhanañchäwikiw utji. Nayax amuyta kunatix aka ajlliw qhipäxanx LLM ukax juk’amp qamir ukat juk’amp matizado yatiyawinak apsuñataki ukhamarak katxaruñapatakiw jaysañataki, jaqi masimp apasiñanakjama. Ukampis mä q’uma yatiñan gráfico ukaniñax ch’amawa, janiw kuna especificaciones de tipo de relación ukanakas utjkiti (descripciones ukanakax mä propiedad ukar saraspawa).
Jiwasan phuqhawisanx LLMGraphTransformer ukampiw apnaqañäni, ukax LangChain biblioteca ukanw utji. Q’uma ingeniería prompt uka apnaqañat sipansa, kunjamatix qillqat qillqatan phuqhawix luraski ukhama, LLMGraphTransformer ukax lurawi jawsañ yanapt’aw apnaqi, estructurado yatiyawinak apsuñataki (LLMs de salida estructurada en LangChain). Uka sistema ukan jiskt’awip uñakipt’añamawa :
from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_openai import ChatOpenAI llm = ChatOpenAI(temperature=0, model_name="gpt-4o") llm_transformer = LLMGraphTransformer( llm=llm, node_properties=["description"], relationship_properties=["description"] ) def process_text(text: str) -> List[GraphDocument]: doc = Document(page_content=text) return llm_transformer.convert_to_graph_documents([doc])
Aka uñacht’awina, GPT-4o ukampiwa gráfico apsuñataki. Qillqirinakax LLM ukarux entidades ukat relaciones ukat qhanañchäwinakap apsuñatakix chiqaparuw yatichapxi . LangChain phuqhawimpixa, node_properties
ukatxa relationship_properties
uka atributos ukanakampiwa apnaqasispa, kawkiri nodo jan ukaxa relación propiedades ukanaka LLM ukaxa apsuñ munkta uk uñacht’ayañataki.
LLMGraphTransformer phuqhawimp mayjt’awix taqi nodo jan ukax relación propiedades ukax opcional ukhamawa, ukhamax janiw taqpach nodos ukax description
propiedad ukanipkaniti. Jiwasatix munstanxa, mä extracción costumbre ukar uñt’ayaraksnawa, mä propiedad description
obligatoria ukaniñapataki, ukampis ukax aka phuqhawipanx jaytxañäniwa.
Jiwasax mayiwinakarux paralelizañäniwa, ukhamat gráfico extracción ukax juk’amp jank’akiñapataki ukat resultados ukanakax Neo4j ukar imañataki:
MAX_WORKERS = 10 NUM_ARTICLES = 2000 graph_documents = [] with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: # Submitting all tasks and creating a list of future objects futures = [ executor.submit(process_text, f"{row['title']} {row['text']}") for i, row in news.head(NUM_ARTICLES).iterrows() ] for future in tqdm( as_completed(futures), total=len(futures), desc="Processing documents" ): graph_document = future.result() graph_documents.extend(graph_document) graph.add_graph_documents( graph_documents, baseEntityLabel=True, include_source=True )
Aka uñacht’awina, 2.000 qillqatanakat gráfico ukan yatiyawinakap apsusipxta ukatx Neo4j ukar apsutanakax imatäxiwa. Jiwasax niya 13.000 entidades ukat 16.000 relaciones ukanakaw apsuwaytanxa. Akax mä uñacht’äwiwa, mä apsut qillqataw gráfico ukan uñacht’ayata.
Niya 35 (+/- 5) minutos ukjawa apsuña tukuyañatakixa ukatxa niya $30 ukjawa GPT-4o ukampixa.
Aka lurawinxa, qillqirinakaxa heurística uñt’ayapxiwa, ukhamata amtañataki, mä pasaje ukata jila gráfico yatiyawi apsuñataki. Jan chʼamäñapatakixa, mä pasajerukiw lurañäni. Ukampirus walja pasajes lurañ munstan ukhax nayrïr extracción ukanakx historia conversacional ukham uñt’ayaraksnawa ukatx LLM ukarux walja entidades ukanakax chhaqhatapat yatichañakiw wakisispa , ukatx juk’amp apsuñapawa, kunjamatix GraphRAG qillqirinakax lurapki ukhama.
Nayraqatax kunjams texto chunk tamapax wali wakiskiriwa ukat kunjams entidades extraídas ukarux jan walt’ayi ukxatw arsuwayta. Niyakixay jan kuna yaqha qillqat chimpunak lurapkstanxa, apsut entidades ukanakan jaljawipax qillqat chimpunak tamaparjamaw uñakipt’araksna:
entity_dist = graph.query( """ MATCH (d:Document) RETURN d.text AS text, count {(d)-[:MENTIONS]->()} AS entity_count """ ) entity_dist_df = pd.DataFrame.from_records(entity_dist) entity_dist_df["token_count"] = [ num_tokens_from_string(str(el)) for el in entity_dist_df["text"] ] # Scatter plot with regression line sns.lmplot( x="token_count", y="entity_count", data=entity_dist_df, line_kws={"color": "red"} ) plt.title("Entity Count vs Token Count Distribution") plt.xlabel("Token Count") plt.ylabel("Entity Count") plt.show()
Uka ch’iqiyawix uñacht’ayiwa, kunawsatix mä tendencia positiva ukax utjki, wila chimpump uñacht’ayata, ukampirus relación ukax sublineal ukhamawa. Jilapart puntos de datos ukax juk’amp jisk’a entidad jakhüwinakanw cluster, kunawsatix token jakhüwinakax jilxattaski ukhama. Ukax uñacht’ayiwa, kunatix entidades ukanakax apsutäki ukax janiw proporcionalmente uñakipatakiti, ukax qillqat chimpunak jach’anchatawa. Yaqhip outliers ukanakax utjkchispas, patrón general ukax uñacht’ayiwa, juk’amp jach’a token jakthapiwinakax janiw sapa kutix juk’amp jach’a entidad jakthapiwinakarux puriykiti. Ukax qillqirinakan jikxatataparuw chiqancharaki, jisk’a qillqat chimpunakax juk’amp yatiyawinak apsuñapawa.
Ukhamaraki, gráfico lurat ukan nodo grado distribuciones ukanaka uñakipañax wali askïspawa sasaw amuyarakta. Aka chimpuxa nodo grado distribuciones ukanaka apsuñataki ukhamaraki uñacht’ayañataki:
degree_dist = graph.query( """ MATCH (e:__Entity__) RETURN count {(e)-[:!MENTIONS]-()} AS node_degree """ ) degree_dist_df = pd.DataFrame.from_records(degree_dist) # Calculate mean and median mean_degree = np.mean(degree_dist_df['node_degree']) percentiles = np.percentile(degree_dist_df['node_degree'], [25, 50, 75, 90]) # Create a histogram with a logarithmic scale plt.figure(figsize=(12, 6)) sns.histplot(degree_dist_df['node_degree'], bins=50, kde=False, color='blue') # Use a logarithmic scale for the x-axis plt.yscale('log') # Adding labels and title plt.xlabel('Node Degree') plt.ylabel('Count (log scale)') plt.title('Node Degree Distribution') # Add mean, median, and percentile lines plt.axvline(mean_degree, color='red', linestyle='dashed', linewidth=1, label=f'Mean: {mean_degree:.2f}') plt.axvline(percentiles[0], color='purple', linestyle='dashed', linewidth=1, label=f'25th Percentile: {percentiles[0]:.2f}') plt.axvline(percentiles[1], color='orange', linestyle='dashed', linewidth=1, label=f'50th Percentile: {percentiles[1]:.2f}') plt.axvline(percentiles[2], color='yellow', linestyle='dashed', linewidth=1, label=f'75th Percentile: {percentiles[2]:.2f}') plt.axvline(percentiles[3], color='brown', linestyle='dashed', linewidth=1, label=f'90th Percentile: {percentiles[3]:.2f}') # Add legend plt.legend() # Show the plot plt.show()
Nodo grado jaljawixa mä patrón de ley de potencia ukarjamawa, ukaxa uñacht’ayiwa jilpacha nodos ukanakaxa wali juk’a conexiones ukanipxiwa ukatxa mä qawqha nodos ukanakaxa wali conectados ukhamawa. Grado promedio ukax 2,45 ukhawa, ukatx mediana ukax 1,00 ukhawa, ukax chikat jila nodos ukanakax mä conexión ukakiw uñacht’ayasi. Jilapart nodos (75 por ciento) ukax pä jan ukax juk’amp conexiones ukaniwa, ukatx 90 por ciento ukax phisqa jan ukax juk’amp conexiones ukaniwa. Aka jaljawix walja chiqpach pachan redes ukanakan uñt’atawa, kawkhantix mä jisk’a hubs ukanakax walja conexiones ukanipxi, ukatx jilpach nodos ukanakax juk’anikiw utji.
Niyakixay nodo ukat relación ukan qhanañchäwinakapax jan propiedades obligatorias ukhamäkchixa, qawqhas apsutäna uksa uñakipt’arakiñäniwa:
graph.query(""" MATCH (n:`__Entity__`) RETURN "node" AS type, count(*) AS total_count, count(n.description) AS non_null_descriptions UNION ALL MATCH (n)-[r:!MENTIONS]->() RETURN "relationship" AS type, count(*) AS total_count, count(r.description) AS non_null_descriptions """)
Uka yatxatawi phuqhawixa uñacht’ayiwa, 12.994 (45,6 por ciento) ukjatxa 5.926 nodos ukanakawa propiedad descripción ukanipxi. Maysa tuqitxa, 15.921 (sapa patakatxa 35) jaqichasïwinakatxa 5.569 jaqichasiñanakakiw ukham yänakanïpxi.
Qhanacht’añatakix LLMs ukan probabilístico ukham uñt’atätapatxa, jakhunakax kunayman t’ijtäwinakanx mayjt’aspawa ukatx kunayman phuqhat yatiyawinak, LLMs ukat jiskt’äwinakanx mayjt’aspawa.
Resolución de entidad (desduplicación) ukaxa wali wakiskiriwa kunapachatixa lurasixa gráficos de conocimiento kunatixa sapa entidad ukaxa sapa mayniru ukhamaraki chiqapa uñacht’ayañataki, ukaxa jark’iwa duplicados ukatxa mayachaña registros ukaxa pachpa chiqapa pachana uñt’ayata. Aka lurawixa wali wakiskiriwa datos integridad ukhamaraki consistencia ukanaka gráfico ukanxa. Jan entidad ukan resolución jan utjkaspän ukhax gráficos de conocimientos ukanakax fragmentados ukat inconsistentes datos ukanakamp t’aqhisiyataw uñjasispa, ukax pantjasiwinakaruw puriyaspa ukat jan atiniskañ amuyunakaruw purispa.
Aka uñacht’awix kunjams mä sapa chiqpach pachan utjki ukax mä juk’a mayjt’at sutinakampi kunayman qillqatanakan uñstaspa, ukat ukarjamax jiwasan gráfico ukan uñstaspa uk uñacht’ayi.
Ukhamaraki, escasos datos ukax mä jach’a jan walt’awiruw tukuwayi jan entidad resolución ukampi. Kunayman chiqanakat jan phuqhat jan ukax chikat yatiyawinakax ch’iqiyata ukhamarak jan mayacht’at yatiyawinakar puriyaspawa, ukat entidades ukanakat mä mayacht’at ukhamarak taqpach amuyt’äw lurañax ch’amakïspawa. Chiqapa entidad ukana resolución ukaxa askichiwa datos ukanaka mayachañampi, ch’amanchañampi, ukhamaraki sapa entidad ukana mayachata uñjawi lurañampi.
Janïr/qhiparus Senzing entidad resolución uka apnaqañax Consorcio Internacional de Periodistas Investigativos (ICIJ) offshore fugas ukan yatiyawinakap uñt’ayañataki — Paco Nathan ukan uñacht’ayata
Uñacht’ayawix ch’iqa tuqinx mä gráfico escaso ukat jan conectado uñacht’ayi. Ukampirus, kunjamtix ch’iqa tuqin uñacht’ayaski ukhamarjamax ukham gráfico ukax entidad ukan resolución eficiente ukamp sum chikt’atäspawa.
Taqi kuna, entidad resolución ukaxa ch’amancharakiw suma yatiyawinak apsuñataki ukhamaraki mayachañataki, ukaxa mä mayacht’ata uñjawi yatiyawinakxa kunaymana phuqhatanaka taypina. Qhipharux juk’amp aski jiskt’äwinak jaysañatakiw yanapt’i, ukax mä atiniskañ ukhamarak phuqhat yatiñan gráfico ukarjam luratawa.
Ukampirus llakisiñawa, GraphRAG qillqatan qillqirinakax janiw kuna código de resolución de entidad ukanakas repo ukanx uñt’ayapkiti, ukampirus qillqatanx uka tuqitw arsupxi. Mä razón ukax aka código ukar jaytañatakix mä ch’amawa ukat mä resolución de entidad ukar phuqhañax ch’amawa, kuna dominio ukanakatakis. Kunayman nodos ukanakatakix heurísticas personalizadas ukanakax phuqhasispawa, kunawsatix nayraqat uñt’ayat kasta nodos ukanakamp apasiñax utjki ukhaxa (kunawsatix jan nayraqat uñt’atäki ukhax janiw mäkipkiti, empresa, organizacion, negocio, ukat juk’ampinaka). Ukampirus, nodo ukan etiquetanakapax jan ukax tipos ukanakax jan nayratpach uñt’atäkchi ukhax, kunjamatix jiwasanktan ukhama, ukax juk’amp ch’ama jan walt’awiruw tuku. Ukhampachasa, jiwasan proyecto ukanx mä versión de resolución de entidad ukax aka chiqanw phuqhachañäni, texto incrustaciones ukat algoritmos de gráficos ukanakamp arut jayarst’awimp LLMs ukanakamp mayachthapita.
Jiwasana proceso de resolución entidades ukaxa aka lurawinakampiwa lurasi:
Entidades ukan sutipataki ukhamarak qhanañchäwip propiedades ukanakatakix texto incrustaciones ukanakat jakthapisaw qalltapxtanxa. Jiwasax from_existing_graph
uka lurawimp Neo4jVector
ukan mayacht’asiwipanx LangChain ukan apnaqaraksnawa, ukax akham phuqhañataki:
vector = Neo4jVector.from_existing_graph( OpenAIEmbeddings(), node_label='__Entity__', text_node_properties=['id', 'description'], embedding_node_property='embedding' )
Jiwasax uka ch’amanchawinakampiw apnaqaraksna, ukhamat candidatos potenciales ukanakar jikxatañataki, jupanakax uñtasitaw uka ch’amanchawinakan coseno jayankxataparjama. Jiwasax algoritmos gráficos ukanak apnaqañäni, ukax Ciencia de Datos Gráficos (GDS) biblioteca ukan utji ; ukatwa, GDS Python cliente ukax mä Pythonic thakhin jan ch’amäñapatakix apnaqaraksnawa:
from graphdatascience import GraphDataScience gds = GraphDataScience( os.environ["NEO4J_URI"], auth=(os.environ["NEO4J_USERNAME"], os.environ["NEO4J_PASSWORD"]) )
GDS biblioteca ukar jan uñt’ksta ukhax nayraqatax mä gráfico in-memory ukar proyectañaw wakisi janïr kuna algoritmos de gráficos ukar phuqhañkama.
Nayraqatxa, Neo4j ukan imatäki uka gráfico ukax mä gráfico in-memory ukar proyectatawa, ukhamat juk’amp jank’ak lurañataki ukhamarak uñakipañataki. Ukxarusti, mä algoritmo gráfico ukax gráfico in-memory ukaruw phuqhachasi. Munañapaxa, algoritmo ukaxa lurawipaxa Neo4j ukanxa mayampiwa imatäspa. Uka tuqit juk'amp yatxatapxañani documentación ukan .
Gráfico de vecino k-nerest lurañatakix taqi entidades ukanakaruw qillqat uñt’ayatanakapamp chika proyectañäni:
G, result = gds.graph.project( "entities", # Graph name "__Entity__", # Node projection "*", # Relationship projection nodeProperties=["embedding"] # Configuration parameters )
Jichhaxa gráfico ukaxa entities
sutimpi proyectatawa, ukatxa algoritmos de gráficos ukanaka phuqhacharaksnawa. Mä k-jak’a jak’a gráfico lurañampiw qalltañäni . Pä parámetros wali wakiskir ukanakax kunjams escaso jan ukax denso gráfico k-nerest ukax utjani ukx mayjt’ayiwa, ukax similarityCutoff
ukat topK
. topK
ukax sapa nodo ukatakix jak’a jakhunak jikxatañatakiw jakhu, ukax mä jisk’a chimpuniwa 1. similarityCutoff
ukax aka umbral ukarjam uñtasïwimp apasiñanak filtra. Aka chiqanx, mä topK
default 10 ukatx mä relativamente alto similaridad cutoff 0,95 ukampiw apnaqañäni. Mä jach’a uñtasita cutoff apnaqañaxa, kunjamatixa 0,95, ukaxa uñjiwa wali uñtasita parijunakakiwa uñakipata, falso positivos ukanaka jisk’achañataki ukhamaraki chiqapa lurañataki.
Niyakixay jiwasax uka yatxatawinakax proyectado gráfico en memoria ukar kutt’ayañ munstanxa, janiw gráfico de conocimiento ukat sipans imañ munktanti, ukatx algoritmo ukan modalidad mutate
ukampiw apnaqañäni:
similarity_threshold = 0.95 gds.knn.mutate( G, nodeProperties=['embedding'], mutateRelationshipType= 'SIMILAR', mutateProperty= 'score', similarityCutoff=similarity_threshold )
Jutïr amtawix entidades ukan tamanakap uñt’añawa, ukax machaq inferidos relaciones de similaridad ukanakamp chikt’atawa. Nodos conectados ukan tamanak uñt’ayañax red ukan uñakipañanx sapa kutiw lurasi, ukax walja kutiw detección comunitaria jan ukax clustering , ukax nodos densamente conectados ukan jisk’a tamanak jikxatañawa. Aka uñacht’awina, algoritmo de Componentes Débilmente Conectados ukampiw apnaqañäni , ukax mä gráfico ukan chiqanakap jikxatañatakiw yanapt’istu, kawkhantix taqi nodos ukanakax mayacht’atäki, ukampirus conexiones ukanakax kawkir chiqarus jan yäqapkchixa.
Jiwasax algoritmo ukan write
thakhimpiw apnaqapxta, ukax yatxatatanakax wasitatw base de datos ukar imañataki (gráfico almacenado):
gds.wcc.write( G, writeProperty="wcc", relationshipTypes=["SIMILAR"] )
Texto ukan chikancht’asiwipax duplicados potenciales ukanakar jikxatañ yanapt’i, ukampirus entidad resolución proceso ukakipkarakiw. Amuyt’añataki, Google ukat Apple ukax espacio de incrustación ukanx wali jak’ankiwa (0,96 coseno uñtasitaw modelo de incrustación ada-002
apnaqasa). Ukhamarakiw BMW ukat Mercedes Benz (0,97 coseno uñtasita). Altu qillqat uñt’ayañax mä suma qalltawiwa, ukampis jiwasax juk’amp sumaptayaraksnawa. Ukatwa, mä yaqha filtro yapxatañäni, ukax pari arunak kimsa jan ukax juk’amp qillqat jayankañapataki (ukax sañ muniw chimpunakakiw mayjt’ayasispa):
word_edit_distance = 3 potential_duplicate_candidates = graph.query( """MATCH (e:`__Entity__`) WHERE size(e.id) > 3 // longer than 3 characters WITH e.wcc AS community, collect(e) AS nodes, count(*) AS count WHERE count > 1 UNWIND nodes AS node // Add text distance WITH distinct [n IN nodes WHERE apoc.text.distance(toLower(node.id), toLower(n.id)) < $distance OR node.id CONTAINS n.id | n.id] AS intermediate_results WHERE size(intermediate_results) > 1 WITH collect(intermediate_results) AS results // combine groups together if they share elements UNWIND range(0, size(results)-1, 1) as index WITH results, index, results[index] as result WITH apoc.coll.sort(reduce(acc = result, index2 IN range(0, size(results)-1, 1) | CASE WHEN index <> index2 AND size(apoc.coll.intersection(acc, results[index2])) > 0 THEN apoc.coll.union(acc, results[index2]) ELSE acc END )) as combinedResult WITH distinct(combinedResult) as combinedResult // extra filtering WITH collect(combinedResult) as allCombinedResults UNWIND range(0, size(allCombinedResults)-1, 1) as combinedResultIndex WITH allCombinedResults[combinedResultIndex] as combinedResult, combinedResultIndex, allCombinedResults WHERE NOT any(x IN range(0,size(allCombinedResults)-1,1) WHERE x <> combinedResultIndex AND apoc.coll.containsAll(allCombinedResults[x], combinedResult) ) RETURN combinedResult """, params={'distance': word_edit_distance})
Aka Cypher arsuwix mä juk’a juk’ampiw uñt’ayasi, ukatx qhanañchäwipax aka blog tuqin qillqt’atat sipanx juk’ampiwa. Sapa kutiw mä LLM ukarux uka tuqit qhanañchañapatak mayisma.
Ukhamarus, aru jayarst’awix mä jakhüwit sipanx aru largo ukarjam luratawa ukatx phuqhawix juk’amp escalable ukhamawa.
Kunatix wali wakiskirïki ukax entidades potenciales ukanakan tamanakaruw mistu, inas mayacht’asiñ munaraksna. Akax mä lista ukawa, nodos potenciales ukanakax mayacht’asiñatakiwa:
{'combinedResult': ['Sinn Fein', 'Sinn Féin']}, {'combinedResult': ['Government', 'Governments']}, {'combinedResult': ['Unreal Engine', 'Unreal_Engine']}, {'combinedResult': ['March 2016', 'March 2020', 'March 2022', 'March_2023']}, {'combinedResult': ['Humana Inc', 'Humana Inc.']}, {'combinedResult': ['New York Jets', 'New York Mets']}, {'combinedResult': ['Asia Pacific', 'Asia-Pacific', 'Asia_Pacific']}, {'combinedResult': ['Bengaluru', 'Mangaluru']}, {'combinedResult': ['US Securities And Exchange Commission', 'Us Securities And Exchange Commission']}, {'combinedResult': ['Jp Morgan', 'Jpmorgan']}, {'combinedResult': ['Brighton', 'Brixton']},
Kunjamtï uñjktanxa, jiwasan resolución uñakipañax yaqhip nodo tipos ukanakatakix juk’amp sum irnaqt’i, yaqhipanakat sipansa. Mä jank’ak uñakipt’awirjamaxa, jaqinakatakix ukhamarak organizacionanakatakix juk’amp askïkaspas ukhamawa, ukampirus fechas ukanakatakix wali jan waliwa. Jiwasatix nayratpach uñt’at nodo tipos ukanakamp apnaqañäni ukhax kunayman heurísticas ukanakaw kunayman nodo tipos ukanakatakix wakicht’asispa. Aka uñacht’awinakanx janiw etiquetas de nodo predefinidas ukanakax utjkiti, ukatwa mä LLM ukar kutt’añäni, entidades ukanakax mayachatäñapa jan ukax jan mayachatäñapa ukxat qhipa amtäwi lurañataki.
Nayraqatxa, LLM jiskt’awi wakicht’añasawa, ukhamata suma irpañataki ukhamaraki yatiyañataki qhipa amtawi nodos ukanaka mayachasiña tuqita:
system_prompt = """You are a data processing assistant. Your task is to identify duplicate entities in a list and decide which of them should be merged. The entities might be slightly different in format or content, but essentially refer to the same thing. Use your analytical skills to determine duplicates. Here are the rules for identifying duplicates: 1. Entities with minor typographical differences should be considered duplicates. 2. Entities with different formats but the same content should be considered duplicates. 3. Entities that refer to the same real-world object or concept, even if described differently, should be considered duplicates. 4. If it refers to different numbers, dates, or products, do not merge results """ user_template = """ Here is the list of entities to process: {entities} Please identify duplicates, merge them, and provide the merged list. """
Nayax sapa kutiw LangChain ukan with_structured_output
uka thakhi apnaqañ munta, kunawsatix suyt’kta estructurado de datos ukan mistuwipa, jan manualmente mistuwinak uñakipañax wakiskiti.
Aka tuqinxa, mistuwixa mä list of lists
ukham uñt’ayañäni , kawkhantixa sapa manqhana lista ukaxa entidades ukanakaxa mayachatäñapawa. Aka lurawixa apnaqatarakiwa escenarios ukanaka apnaqañataki kawkhantixa, sañäni, mantawixa [Sony, Sony Inc, Google, Google Inc]
ukhamawa. Ukhamächi ukhaxa, “Sony” ukat “Sony Inc” ukanakax “Google” ukat “Google Inc” ukanakat sapa mayniruw mayachthapiñ munasma.
class DuplicateEntities(BaseModel): entities: List[str] = Field( description="Entities that represent the same object or real-world entity and should be merged" ) class Disambiguate(BaseModel): merge_entities: Optional[List[DuplicateEntities]] = Field( description="Lists of entities that represent the same object or real-world entity and should be merged" ) extraction_llm = ChatOpenAI(model_name="gpt-4o").with_structured_output( Disambiguate )
Ukxarusti, LLM jiskt’awix estructurado salida ukampiw mayacht’asi, mä cadena lurañataki, LangChain Expression Language (LCEL) sintaxis apnaqasa ukatx mä función disambiguate
ukan encapsula.
extraction_chain = extraction_prompt | extraction_llm def entity_resolution(entities: List[str]) -> Optional[List[List[str]]]: return [ el.entities for el in extraction_chain.invoke({"entities": entities}).merge_entities ]
Taqi nodos candidatos potenciales ukanak entity_resolution
uka función tuqiw apnaqañasa, ukhamat mayachatäñapa janicha uk amtañataki. Uka lurawi jank’aki lurañatakixa, mayampiwa LLM jawsatanakaruxa paralelizañani:
merged_entities = [] with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: # Submitting all tasks and creating a list of future objects futures = [ executor.submit(entity_resolution, el['combinedResult']) for el in potential_duplicate_candidates ] for future in tqdm( as_completed(futures), total=len(futures), desc="Processing documents" ): to_merge = future.result() if to_merge: merged_entities.extend(to_merge)
Qhipa lurawixa entidad resolución ukaxa entity_resolution
LLM ukata apsutarakiwa ukatxa qillqt’atarakiwa base de datos ukaru mayachañataki nodos especificados ukanakampi:
graph.query(""" UNWIND $data AS candidates CALL { WITH candidates MATCH (e:__Entity__) WHERE e.id IN candidates RETURN collect(e) AS nodes } CALL apoc.refactor.mergeNodes(nodes, {properties: { description:'combine', `.*`: 'discard' }}) YIELD node RETURN count(*) """, params={"data": merged_entities})
Aka entidad resolución ukax janiw perfecto ukhamäkiti, jan ukasti mä qalltawiw churarakistu, ukaruw juk’amp askinak lurañasa. Ukhamaraki, kawkir entidades ukanakas katjatäñapa uk yatiñatakix lógica ukarux juk’amp askinjamaw uñjaraksna.
Jutïr t’aqapanx qillqirinakax mä elemento resumen ukan lurawip lurapxi. Esencial, sapa nodo ukat relación ukax mä entidad resumen prompt tuqiw pasapxi . Qillqirinakax jupanakan amuyupax machaqätapa ukat wali askiwa sasaw qhanañchapxi:
“Taqi kunat sipansa, jiwasan apnaqawix riqueza descriptivo texto nodos homogéneos ukanakatakix mä estructura de gráficos potencialmente ruidosos ukanx LLMs ukan capacidades ukanakamp ukhamarak uraqpachan, jiskt’äwinakar uñt’at resumen ukan munatanakapamp chikancht’atawa. Uka cualidades ukanakax jiwasan índice gráfico ukarux gráficos típicos de conocimientos ukanakat sipanx mayjt’ayaraki, ukax kimsa conciso ukat constante de conocimientos (sujeto, predicado, objeto) ukanakaruw atinisi, razonamiento descendente lurawinakatakixa”.
Uka amuyt’awix wali kusiskañawa. Jiwasax waliw IDs de sujeto ukat objeto jan ukax sutinak qillqatanakat apsusipxta, ukax chiqap entidades ukanakamp apasiñanak uñt’ayañ yanapt’istu, kunapachatix entidades ukanakax walja qillqat chimpunak taypin uñstki ukhas. Ukampirus, maynit maynikam apasiñanakax janiw mä kastarukix jisk’achatäkiti. Ukhamakipansti, tipo de relación ukax chiqpachanx mä texto de forma libre ukawa, ukax juk’amp qamir ukat juk’amp matizado yatiyawinak imañatakiw yanapt’istu.
Ukhamaraki, entidad ukan yatiyawipax mä LLM ukamp mä juk’a qhanañchatawa, ukax juk’amp sumaw aka yatiyawinak ukhamarak entidades ukanakar juk’amp chiqaparu apsuñatakix uñt’ayañataki ukhamarak indexar uñt’ayañataki.
Maynix arsuspawa, aka juk’amp qamir ukat juk’amp matizado yatiyawix katxarurakispawa, yaqha propiedades de nodo ukat relación ukanakamp yapxatasa, inas arbitrariu ukhamächispa. Mä jan walt’awix nodo arbitrario ukat propiedades de relación ukampixa, yatiyawinak sapa kuti apsuñax ch’amakïspawa kunatix LLM ukax kunayman propiedad sutinak apnaqaspawa jan ukax sapa ejecución ukanx kunayman detalles ukar uñt’ayaspawa.
Yaqhipa uka jan walt’awinakaxa askichasispawa nayraqata uñt’ata propiedad sutinakampi yaqha kasta ukhamaraki qhanañchawi yatiyawimpi. Ukhamächi ukhaxa, uka propiedades ukanakar qhanañchañ yanaptʼañatakix mä yatxattʼat materia ukaw munasispa, ukat mä LLM ukarux kuna wakiskir yatiyäwinaksa nayraqat qhanañchat qhanañchäwinakat anqäxan apsuñatakix jukʼa chiqakiw utjañapa.
Mä kusiskañ amtawiwa, juk’amp qamir yatiyäwinak mä yatiñan gráfico ukan uñacht’ayañataki.
Mä jan walt’awix elemento resumen paso ukampix janiw sum escalañapakiti kunatix mä LLM jawsañaw wakisi sapa entidad ukat relación gráfico ukanx. Jiwasan gráfico ukax mä juk’a jisk’akiwa, 13.000 nodos ukatx 16.000 relaciones ukaniwa. Ukham jisk’a gráfico ukatakix 29.000 LLM jawsañaw wakisispa, ukatx sapa jawsañax mä pä patak fichas apnaqañapawa, ukax wali jila qullqiwa ukat pacharakiw munasirakispa. Ukatwa, aka thakhix aka chiqan jan lurkañäniti. Qallta qillqat lurañ pachanx apsutäki uka qhanañchäw propiedades ukanakax wali apnaqaraksnawa.
Qhipa lurawixa gráfico luraña ukhamaraki indexación lurawixa, gráfico ukanxa ayllunakaru uñt’ayañawa. Aka tuqinxa, mä ayllux mä tama nodos ukanakawa, ukax juk’amp densamente maynit maynikam chikt’atawa, mayni gráfico ukanx juk’amp jach’a nivel de interacción jan ukax similaridad uñacht’ayi. Aka uñacht’awix ayllun uñt’ayawip uñacht’ayi.
Mä kutix aka entidad ayllunakax mä algoritmo de agrupación ukamp uñt’ayatäxi ukhax mä LLM ukax sapa ayllun mä suma qhanañchäwip uñstayi, ukax sapa mayni uñacht’awinakapat ukhamarak mayacht’asiwinakapat amuyt’awinak churaraki.
Maysatxa, Ciencia de Datos Gráficos uka biblioteca apnaqapxta. Mä gráfico memoria ukan proyectañampiw qalltapxtanxa. Nayra qillqata chiqaparu arktañatakixa, gráfico de entidades ukarux mä red ponderada no dirigida ukham proyectañäni, kawkhantix red ukax pä entidades ukanakan conexiones ukanakap uñacht’ayi:
G, result = gds.graph.project( "communities", # Graph name "__Entity__", # Node projection { "_ALL_": { "type": "*", "orientation": "UNDIRECTED", "properties": {"weight": {"property": "*", "aggregation": "COUNT"}}, } }, )
Qillqirinakax algoritmo Leiden , mä método de agrupación jerárquica ukampiw irnaqapxäna, ukax gráfico ukan ayllunakar uñt’ayañataki. Mä ventaja ukax algoritmo de detección comunitaria jerárquica uka apnaqañax walja niveles de granularidad ukan ayllunakar uñakipañawa. Qillqirinakax sapa nivel ukan taqi ayllunakar mä juk’a qhanañcht’añ amtapxi, ukax gráfico ukan lurawipat mä jach’a amuyt’awi churañataki.
Nayraqatxa, algoritmo de Componentes Débilmente Conectados (WCC) ukampiw jiwasan gráfico ukan conectividad uñakipañatakix apnaqañäni. Aka algoritmo ukax gráfico ukanx saparst’at t’aqanakaruw uñt’ayi, ukax sañ muniw subconjuntos de nodos jan ukax componentes ukanakax maynit maynikam chikt’ata ukampis janiw gráfico ukan mayninakax uñt’atäkiti. Aka componentes ukanakax red ukan fragmentación ukar amuyañatakiw yanapt’istu, ukatx nodos ukan tamanakap uñt’ayañatakiw yanapt’istu, ukax mayninakat independiente ukhamawa. WCC ukax wali wakiskiriwa, taqpach estructura ukat conectividad uka gráfico ukan uñakipañataki.
wcc = gds.wcc.stats(G) print(f"Component count: {wcc['componentCount']}") print(f"Component distribution: {wcc['componentDistribution']}") # Component count: 1119 # Component distribution: { # "min":1, # "p5":1, # "max":9109, # "p999":43, # "p99":19, # "p1":1, # "p10":1, # "p90":7, # "p50":2, # "p25":1, # "p75":4, # "p95":10, # "mean":11.3 }
Uka algoritmo WCC ukax 1.119 componentes distintos ukanakaw uñt’ayasi. Qhanpachanx jach’a componente ukax 9.109 nodos ukaniwa, chiqpach redes ukanx uñt’atawa kawkhantix mä sapa super componente ukax walja jisk’a componentes aislados ukanakamp chikaw utji. Jisk’a componente ukax mä nodo ukaniwa, ukatx componente promedio ukax niya 11,3 nodos ukhawa.
Ukxarusti, algoritmo Leiden uka apnaqañäni, ukax GDS biblioteca ukan utjarakiwa, ukatx parámetro includeIntermediateCommunities
ukax ayllunakar kutt’ayañataki ukhamarak taqi niveles ukan imañatakiw ch’amanchatäni. Ukhamaraki, mä parámetro relationshipWeightProperty
ukampiw uñakipt’ata, ukax algoritmo Leiden ukan variante ponderada ukar apnaqañataki. Algoritmo ukan write
thakhi apnaqañax mä propiedad nodo ukham uñt’atawa.
gds.leiden.write( G, writeProperty="communities", includeIntermediateCommunities=True, relationshipWeightProperty="weight", )
Algoritmo ukax phisqa niveles de comunidades ukanakaw uñt’ayasi, jilpachax (nivel menor granular ukanx comunidades ukanakax jilpachaw utji) 1.188 ayllunakaw utji (1.119 componentes ukanakat sipansa). Akax Gephi apnaqañ qhipa nivelan ayllunakan uñacht’ayatawa.
1.000 jila ayllunakar uñjañax ch’amawa; sapa maynitak coloranak ajlliñas niyas janiw chʼamäkiti. Ukampirus, jupanakax suma interpretaciones artísticas ukanakaw lurapxi.
Uka tuqitxa, sapa ayllunakatakix mä nodo distinto lurañäni, ukatx estructura jerárquica ukarux mä gráfico interconectado ukham uñacht’ayañäni. Qhipharux, ayllun suma qhanañchäwinakapa ukat yaqha atributos ukanakax propiedades de nodo ukham imatäni.
graph.query(""" MATCH (e:`__Entity__`) UNWIND range(0, size(e.communities) - 1 , 1) AS index CALL { WITH e, index WITH e, index WHERE index = 0 MERGE (c:`__Community__` {id: toString(index) + '-' + toString(e.communities[index])}) ON CREATE SET c.level = index MERGE (e)-[:IN_COMMUNITY]->(c) RETURN count(*) AS count_0 } CALL { WITH e, index WITH e, index WHERE index > 0 MERGE (current:`__Community__` {id: toString(index) + '-' + toString(e.communities[index])}) ON CREATE SET current.level = index MERGE (previous:`__Community__` {id: toString(index - 1) + '-' + toString(e.communities[index - 1])}) ON CREATE SET previous.level = index - 1 MERGE (previous)-[:IN_COMMUNITY]->(current) RETURN count(*) AS count_1 } RETURN count(*) """)
Qillqirinakax mä community rank
uñt’ayapxarakiwa , ukax qhawqha chiqans qillqat chimpunakas utji uk uñacht’ayi, kawkhantix ayllun utjki uka entidades ukanakax uñstapxi:
graph.query(""" MATCH (c:__Community__)<-[:IN_COMMUNITY*]-(:__Entity__)<-[:MENTIONS]-(d:Document) WITH c, count(distinct d) AS rank SET c.community_rank = rank; """)
Jichhax mä muestra estructura jerárquica uñakipt’añäni, walja chika taypinkir ayllunakaw jach’a niveles ukan mayacht’asipxi. Ayllunakax janiw ch’amanchatäkiti, ukax sañ muniw sapa entidad ukax sapa nivel ukanx chiqpachapuniw mä ayllunkiwa.
Uñacht’awix mä estructura jerárquica uñacht’ayi, ukax algoritmo de detección comunitaria de Leiden ukan apsutawa. Morado nodos ukax sapa mayni entidades ukanakaruw uñacht’ayi, ukatx naranja nodos ukax comunidades jerárquicas ukanakaruw uñacht’ayi.
Jerarquía ukaxa uñacht’ayiwa aka entidades ukanakana tantachawipa kunaymana ayllunakaru, jisk’a ayllunakaxa mayachasipxi jach’a ayllunakaru jach’a niveles ukanakana.
Jichhax kunjams jisk’a ayllunakax jach’a niveles ukan mayacht’asipxi uk uñakipt’añäni.
Aka uñacht’awix uñacht’ayiwa, entidades juk’a conectadas ukat ukarjamax jisk’a ayllunakax niveles ukanx juk’a mayjt’awinak uñjapxi. Amuyt’añataki, aka chiqanx comunidadan estructurapax nayrïr pä niveles ukanx mayjt’atawa ukampis qhipa kimsa niveles ukanx pachpakiw qhiparaski. Ukhamatwa, niveles jerárquicos ukax walja kutiw uka entidades ukanakatakix redundantes ukham uñstapxi, kunatix taqpach organizacionax janiw kunayman niveles ukanx sinti mayjt’kiti.
Ayllunakan jakhüwipa ukhamaraki jach’a jach’a tukutapa ukhamaraki kunaymana niveles ukanaka juk’ampi uñakipt’añäni:
community_size = graph.query( """ MATCH (c:__Community__)<-[:IN_COMMUNITY*]-(e:__Entity__) WITH c, count(distinct e) AS entities RETURN split(c.id, '-')[0] AS level, entities """ ) community_size_df = pd.DataFrame.from_records(community_size) percentiles_data = [] for level in community_size_df["level"].unique(): subset = community_size_df[community_size_df["level"] == level]["entities"] num_communities = len(subset) percentiles = np.percentile(subset, [25, 50, 75, 90, 99]) percentiles_data.append( [ level, num_communities, percentiles[0], percentiles[1], percentiles[2], percentiles[3], percentiles[4], max(subset) ] ) # Create a DataFrame with the percentiles percentiles_df = pd.DataFrame( percentiles_data, columns=[ "Level", "Number of communities", "25th Percentile", "50th Percentile", "75th Percentile", "90th Percentile", "99th Percentile", "Max" ], ) percentiles_df
Qalltan phuqhawipanx sapa nivel ukan ayllunakax mä juk’a qhanañcht’atawa. Jiwasanakanx ukax 8.590 ayllunakaw utjaspa ukatx, ukarjamax 8.590 LLM jawsatanakaw utjaspa. Nayax arsuñ muntwa, estructura jerárquica comunitaria ukarjamaxa, janiw sapa nivel ukax mä juk’a qhanañcht’añax wakiskiti. Amuyt’añataki, qhipa nivel ukat jutir nivel ukat qhipa nivel ukanakan mayjt’awipax pusi ayllunakakiwa (1.192 vs 1.188). Ukatwa, walja resumenes redundantes ukanakaw lurasispa. Mä askichawix mä phuqhawi lurañawa, ukax mä sapa suma qhanañcht’awi luraspa ayllunakataki kunayman niveles ukan jan mayjt’ayata; maynix jerarquías comunitarias ukanakar t’unjañawa, ukax janiw mayjt’kiti.
Ukhamaraki, janiw yatiskti mä miembroniki ayllunakar mä juk’a qhanañcht’añ munktanti, kunatix inas jan sinti valoranïkchiti jan ukax yatiyawinak churapkchiti. Aka tuqinxa, 0, 1, 4 niveles ukankir ayllunakarux mä juk’a qhanañcht’añäni, nayraqatax yatiyawinakap apsuñaw wakisi:
community_info = graph.query(""" MATCH (c:`__Community__`)<-[:IN_COMMUNITY*]-(e:__Entity__) WHERE c.level IN [0,1,4] WITH c, collect(e ) AS nodes WHERE size(nodes) > 1 CALL apoc.path.subgraphAll(nodes[0], { whitelistNodes:nodes }) YIELD relationships RETURN c.id AS communityId, [n in nodes | {id: n.id, description: n.description, type: [el in labels(n) WHERE el <> '__Entity__'][0]}] AS nodes, [r in relationships | {start: startNode(r).id, type: type(r), end: endNode(r).id, description: r.description}] AS rels """)
Jichha pachanxa, ayllun yatiyawinakapaxa akhamawa: 1.1.
{'communityId': '0-6014', 'nodes': [{'id': 'Darrell Hughes', 'description': None, type:"Person"}, {'id': 'Chief Pilot', 'description': None, type: "Person"}, ... }], 'rels': [{'start': 'Ryanair Dac', 'description': 'Informed of the change in chief pilot', 'type': 'INFORMED', 'end': 'Irish Aviation Authority'}, {'start': 'Ryanair Dac', 'description': 'Dismissed after internal investigation found unacceptable behaviour', 'type': 'DISMISSED', 'end': 'Aidan Murray'}, ... ]}
Jichhax, mä LLM prompt wakicht’añaw wakisi, ukax mä natural lengua resumen uñstayi, ukax elementos de nuestra comunidad ukanakan yatiyawinakap uñakipt’atawa. Yatxatirinakax apnaqapki uka prompt ukanx mä juk'a inspiración apsuraksnawa .
Qillqirinakax janiw ayllunakat mä juk’a qhanañcht’apkiti jan ukasti sapa mayniruw jikxatawinak uñstayapxaraki. Mä jikxatawixa mä chiqaru jan ukaxa mä yatiyawi tuqita mä jisk’a yatiyawi sañjamawa. Ukham mä uñachtʼäwi:
"summary": "Abila City Park as the central location", "explanation": "Abila City Park is the central entity in this community, serving as the location for the POK rally. This park is the common link between all other entities, suggesting its significance in the community. The park's association with the rally could potentially lead to issues such as public disorder or conflict, depending on the nature of the rally and the reactions it provokes. [records: Entities (5), Relationships (37, 38, 39, 40)]"
Nayan amuyt’awijax uñacht’ayiwa, mä pasaje ukampikiw jikxatawinak apsuñax inas jan kunjamtï munasktan ukhamarjam phuqhañjamäkaspati, kunjamatix entidades ukat relaciones ukanakar apsuñax ukhama.
Ukhamarus, janiw kuna referencias jan ukax uñacht’äwinakas jupanakan apnaqawipatx código ukanx local jan ukax mundial de búsqueda retrievers ukanakan jikxatkti. Ukhamatwa, aka uñacht’äwin jikxatatanak apsuñat jithiqtañäni. Jan ukax kunjamtï yatxatirinakax sapki ukhama: Aka ejerciciox ullart’iriruw jaytatawa. Ukhamarus, reclamaciones jan ukax extracción de información covariables , ukax nayrïr uñtawinx jikxatatanakar uñtasitawa.
Ayllun suma qhanañchäwinakap lurañatakix kuna prompt ukampiw apnaqasini, ukax mä juk’a chiqapawa:
community_template = """Based on the provided nodes and relationships that belong to the same graph community, generate a natural language summary of the provided information: {community_info} Summary:""" # noqa: E501 community_prompt = ChatPromptTemplate.from_messages( [ ( "system", "Given an input triples, generate the information summary. No pre-amble.", ), ("human", community_template), ] ) community_chain = community_prompt | llm | StrOutputParser()
Ukax mäkiw qhiparxi, ayllun uñacht’awinakaparux cadenas ukar tukuyañawa, ukhamat tokens ukar jisk’achañataki, JSON token overhead ukar jan yäqasa ukat cadena ukar mä función ukham envolver:
def prepare_string(data): nodes_str = "Nodes are:\n" for node in data['nodes']: node_id = node['id'] node_type = node['type'] if 'description' in node and node['description']: node_description = f", description: {node['description']}" else: node_description = "" nodes_str += f"id: {node_id}, type: {node_type}{node_description}\n" rels_str = "Relationships are:\n" for rel in data['rels']: start = rel['start'] end = rel['end'] rel_type = rel['type'] if 'description' in rel and rel['description']: description = f", description: {rel['description']}" else: description = "" rels_str += f"({start})-[:{rel_type}]->({end}){description}\n" return nodes_str + "\n" + rels_str def process_community(community): stringify_info = prepare_string(community) summary = community_chain.invoke({'community_info': stringify_info}) return {"community": community['communityId'], "summary": summary}
Jichhax ajllit niveles ukanakatakix comunidadan resumenes ukanakaw lurasispa. Maysatxa, juk’amp jank’ak phuqhañatak jawsatanakarux paralelizapxtwa:
summaries = [] with ThreadPoolExecutor() as executor: futures = {executor.submit(process_community, community): community for community in community_info} for future in tqdm(as_completed(futures), total=len(futures), desc="Processing communities"): summaries.append(future.result())
Mä aspecto jan arsuwayktxa, qillqirinakax comunidadan yatiyawinakap uñt’ayañkamax contexto tamapat sipanx juk’amp jan walt’awinak utjatapatw uñakipapxaraki. Kunjamatix gráficos ukanakax jilxattaski ukhamarjamaw ayllunakax wali jach’a jilxattaspa ukhamaraki. Jiwasanakanx jach’a ayllunx 545 jaqinakaw utjäna. GPT-4o ukax 100.000 tokens ukjat jila contexto ukaniwa, ukatw aka thakhix jaytañ amtapxta.
Jiwasan qhipa amtäwisax ayllun suma qhanañchäwinakap wasitatw yatiyaw uñt’ayañ utar imañäni:
graph.query(""" UNWIND $data AS row MERGE (c:__Community__ {id:row.community}) SET c.summary = row.summary """, params={"data": summaries})
Qhipa uñacht’awix akhamawa:
Jichhax gráfico ukanx nayrïr qillqatanaka, entidades extraídas ukat relaciones ukanakaw utji, ukhamarak estructura jerárquica comunitaria ukat resumen ukanakas utjarakiwa.
“De Local a Global” qillqat qillqirinakax mä jach’a lurawiw GraphRAG ukan machaq uñakipäw uñacht’ayapxäna. Jupanakax kunjams kunayman qillqatanakat yatiyawinak mayacht’añasa, mä juk’a uñakipt’añasa mä estructura de gráfico de conocimientos jerárquicos ukar uñacht’ayi.
Mä kunaw jan qhan arsutäkiti, ukax mä gráfico ukanx estructurados fuentes de datos ukanakamp mayachthapiraksnawa; mantawix janiw jan wakicht’at qillqatanakarukix utjañapäkiti.
Kuntix nayatakix wali askiwa jupanakan extracción uñakipawipatxa, jupanakax nodos ukat relaciones ukanakatakix qhanañchäwinak katjapxi. Qhanancht’awinakax LLM ukax juk’amp yatiyawinak imañapatakiw jayti, taqi kunas IDs de nodo ukat tipos de relación ukanak jisk’achañat sipansa.
Ukhamaraki, uñacht’ayapxiwa mä sapa extracción pasaje ukaxa qillqatxa janiwa taqpacha wakiskir yatiyawinakxa katjkaspati ukatxa lógica uñt’ayatarakiwa walja pasajes lurañataki wakisispa ukhaxa. Qillqirinakax mä suma amuyt’aw uñacht’ayapxaraki, gráficos comunidades ukan suma qhanañchäwinak lurañataki, ukax walja datos fuentes ukan yatiyawinak tópicos condensados ukar uñt’ayañatakiw ukat indexañatakiw yanapt’istu.
Jutïr blog tuqinx, local ukhamarak mundial de búsqueda retriever ukan phuqhawinakapatw sarañäni ukatx yaqha amtawinakatw arsuñäni, ukax estructura de gráficos ukarjam phuqhasispawa.
Kunjamatix nayrax, uka chimpux GitHub ukan uñt’ayatawa.
Jichha kutix, nayax base de datos ukan dump ukarux apkatawayaraktwa ukhamat jumanakax ukanak uñakipt’apxañamataki ukat kunayman retriever amtanakamp yant’apxañamataki.
Ukhamarakiw aka dump ukax mä wiñayatak jan qullqini Neo4j AuraDB instancia ukar apkatasispa , ukax apsuñ thakhinak apnaqaraksnawa kunatix janiw ukatakix algoritmos de Ciencia de Datos de Gráficos ukax munaskiti — ukakipkarakiw gráfico patrón ukar uñtasita, vector ukat índices de texto completo.
Neo4j ukan mayacht’asiwinakapat juk’amp yatxatañatakix taqi marcos GenAI ukat algoritmos prácticos de gráficos ukanakamp “Algoritmos de gráficos para Ciencia de Datos” librojan.
Aka tuqit juk’amp yatxatañatakix NODES 2024 ukan 7 uru noviembre phaxsitx nanakamp chikt’asipxam, ukax conferencia de desarrolladores virtuales gratuitos ukanw inteligente apps, gráficos de conocimientos ukat AI ukanakat uñt’ayasi. Jichhax qillqt'asipxam !