paint-brush
ምህናጽ ፍልጠት ግራፍ ንRAG: ምድህሳስ GraphRAG ብ Neo4jን LangChainን።@neo4j
1,311 ንባባት
1,311 ንባባት

ምህናጽ ፍልጠት ግራፍ ንRAG: ምድህሳስ GraphRAG ብ Neo4jን LangChainን።

Neo4j32m2024/10/22
Read on Terminal Reader

ኣዝዩ ነዊሕ፤ ንምንባብ

እዚ ጽሑፍ እዚ Neo4jን LangChainን ብምጥቃም ኣተገባብራ "ካብ ከባብያዊ ናብ ዓለማዊ" GraphRAG ሻምብቆ ዝድህስስ እዩ። ካብ ጽሑፍ ናይ ፍልጠት ግራፍ ምህናጽ፡ ዓበይቲ ቋንቋ ሞዴላት (LLMs) ብምጥቃም ማሕበረሰባት ኣካላት ምጽማቕ፡ ከምኡ’ውን ግራፍ ኣልጎሪዝም ምስ LLM ዝተመርኮሰ ምድማር ብምውህሃድ ትኽክለኛነት ሪትሪቫል-ኣግመንትድ ጀነሬሽን (RAG) ምዕባይ ዝሽፍን እዩ። እቲ ኣገባብ ካብ ብዙሓት ምንጭታት ዝመጽእ ሓበሬታ ናብ ዝተዋደደ ግራፍ ብምሕጻር ጽማቕ ተፈጥሮኣዊ ቋንቋታት ብምፍጣር ንዝተሓላለኸ ሓበሬታ ንምርካብ ውጽኢታዊ ኣገባብ የቕርብ።
featured image - ምህናጽ ፍልጠት ግራፍ ንRAG: ምድህሳስ GraphRAG ብ Neo4jን LangChainን።
Neo4j HackerNoon profile picture
0-item
1-item


ኩሉ ግዜ ሓደስቲ ኣገባባት ምትግባር ሪትሪቫል-ኣግመንትድ ጀነሬሽን (RAG) ኣብ ልዕሊ ግራፍ፡ መብዛሕትኡ ግዜ GraphRAG ይበሃል። ይኹን እምበር ኩሉ ሰብ GraphRAG ዝብል ቃል ክሰምዕ ከሎ ዝተፈላለየ ኣተገባብራ ኣብ ኣእምሮኡ ዘለዎ ይመስል። ኣብዚ ጽሑፍ ብሎግ፡ ኣብቲ “ ካብ ከባብያዊ ናብ ዓለማዊ GraphRAG ” ዝብል ጽሑፍን ኣተገባብራን ተመራመርቲ ማይክሮሶፍት ብዕምቆት ክንጥሕል ኢና። ነቲ ናይ ፍልጠት ግራፍ ህንጸትን ምጽማቕን ክፋል ክንሽፍን ኢና፡ ነቶም ሪትሪቨርስ ድማ ንዝቕጽል ጽሑፍ ብሎግ ክንገድፎም ኢና። እቶም ተመራመርቲ ኣዝዮም ሕያዎት ብምንባሮም ነቲ ናይ ኮድ መኽዘን ኣቕሪቦምልና፣ ናይ ፕሮጀክት ገጽ እውን ኣለዎም።


ኣብዚ ኣብ ላዕሊ ዝተጠቕሰ ጽሑፍ ዝተወስደ ኣገባብ ኣዝዩ መሳጢ እዩ። ኣነ ከም ዝተረዳእክዎ፡ ካብ ብዙሓት ምንጭታት ዝመጽእ ሓበሬታ ንምጽማቕን ንምውህሃድን፡ ግራፍ ፍልጠት ከም ሓደ ስጉምቲ ኣብ መስመር ምጥቃም ዘጠቓልል እዩ። ካብ ጽሑፍ ኣካላትን ዝምድናታትን ምውጻእ ሓድሽ ነገር ኣይኮነን። ይኹን እምበር፡ እቶም ጸሓፍቲ፡ ንዝተሓጽረ ኣቃውማ ግራፍን ሓበሬታን ዳግማይ ከም ተፈጥሮኣዊ ጽሑፍ ቋንቋ ንምድማር ዘጠቓልል ልብወለዳዊ (ብውሑዱ ንዓይ) ሓሳብ የተኣታቱ። እቲ ሻምብቆ ካብ ሰነዳት ብዝመጽእ ጽሑፍ ይጅምር፣ እዚ ድማ ግራፍ ንምፍጣር ይስራሕ። ብድሕሪኡ እቲ ግራፍ ተመሊሱ ናብ ተፈጥሮኣዊ ቋንቋ ጽሑፍ ይቕየር፣ ኣብኡ እቲ ዝፍጠር ጽሑፍ ብዛዕባ ፍሉያት ኣካላት ወይ ቅድሚ ሕጂ ኣብ ብዙሓት ሰነዳት ዝተዘርግሑ ማሕበረሰባት ግራፍ ዝተሓጽረ ሓበሬታ ዝሓዘ እዩ።


ላዕለዋይ ደረጃ ኢንዴክስ ሻምብቆ ከምቲ ኣብቲ GraphRAG ወረቐት ብማይክሮሶፍት ዝተተግበረ — ምስሊ ብደራሲ


ብኣዝዩ ልዑል ደረጃ ናብ ሻምብቆ ግራፍራግ ዝኣትዉ ዝተፈላለዩ ሓበሬታታት ዝሓዙ ምንጪ ሰነዳት እዮም። እቶም ሰነዳት ብዛዕባ ኣብቲ ወረቓቕቲ ዝቐርቡ ኣካላት ምስ ዝምድናታቶም ዝተዋደደ ሓበሬታ ንምውጻእ LLM ተጠቒሞም እዮም ዝስርሑ። እዚ ዝተቐድሐ ቅርጻዊ ሓበሬታ ብድሕሪኡ ናይ ፍልጠት ግራፍ ንምህናጽ ይጥቀመሉ።


ናይ ፍልጠት ግራፍ ውክልና ዳታ ምጥቃም ዘለዎ ብልጫ፡ ካብ ብዙሓት ሰነዳት ወይ ምንጪ ዳታ ብዛዕባ ፍሉያት ኣካላት ዝመጽእ ሓበሬታ ብቕልጡፍን ብቐጥታን ከወሃህድ ይኽእል። ከምቲ ዝተጠቕሰ ግን እቲ ናይ ፍልጠት ግራፍ እቲ እንኮ ውክልና ዳታ ኣይኮነን። እቲ ናይ ፍልጠት ግራፍ ምስ ተሃንጸ፡ ውህደት ግራፍ ኣልጎሪዝምን LLM promptingን ተጠቒሞም፡ ኣብቲ ናይ ፍልጠት ግራፍ ዝተረኽቡ ማሕበረሰባት ኣካላት ተፈጥሮኣዊ ቋንቋ ጽማቕ ይፈጥሩ።


ድሕሪኡ እዞም ጽማቝ ሓበሬታታት ኣብ ብዙሓት ምንጪታት ዳታን ንፍሉያት ኣካላትን ማሕበረሰባትን ዝምልከት ሰነዳትን ዝዝርጋሕ ጽዑቕ ሓበሬታ ዝሓዙ እዮም።


ንዝያዳ ዝርዝር ርድኢት ናይቲ ሻምብቆ፡ ኣብቲ መበቆላዊ ጽሑፍ ዝተዋህበ ደረጃ ብደረጃ መግለጺ ክንውከስ ንኽእል።


ስጉምትታት ኣብ መስመር — ምስሊ ካብ GraphRAG ወረቐት , ፍቓድ ኣብ ትሕቲ CC BY 4.0


እዚ ዝስዕብ ልዑል ደረጃ ጽማቕ ናይቲ Neo4jን LangChainን ተጠቒምና ኣገባቦም ንምብዛሕ ክንጥቀመሉ ዝግበኣና ሻምብቆ እዩ።

ኢንዴክስ — ምፍጣር ግራፍ

  • ምንጪ ሰነዳት ናብ ቁንጣሮ ጽሑፍ : ምንጪ ሰነዳት ንመስርሕ ኣብ ንኣሽቱ ቁንጣሮ ጽሑፍ ይምቀሉ።
  • Text Chunks to Element Instances : ነፍሲ ወከፍ ጽሑፍ ቁንጣሮ ኣካላትን ዝምድናታትን ንምውጻእ ይትንተን፣ ነዞም ባእታታት ዝውክሉ ዝርዝር ቱፕላት የፍሪ።
  • Element Instances to Element Summaries : ዝተቐድሑ ኣካላትን ዝምድናታትን ብLLM ናብ ገላጺ ጽሑፍ ብሎክ ንነፍሲ ወከፍ ባእታ ይድምደሙ።
  • ጽማቕ ባእታታት ናብ ማሕበረሰባት ግራፍ : እዞም ጽማቕ ኣካላት ግራፍ ይፈጥሩ፣ ድሕሪኡ ከም ላይደን ዝኣመሰሉ ኣልጎሪዝማት ንመሰረታዊ ኣቃውማ ተጠቒሞም ናብ ማሕበረሰባት ይምቀሉ።
  • ግራፍ ማሕበረሰባት ናብ ማሕበረሰብ ጽማቕ : ጽማቕ ናይ ነፍሲ ወከፍ ማሕበረሰብ ምስ LLM ይፍጠር ነቲ ዳታሴት ዓለማዊ እዋናዊ ኣቃውማን ትርጉሙን ንምርዳእ እዩ።

ምውሳድ — ምምላስ

  • ጽማቕ ማሕበረሰብ ናብ ዓለማዊ መልስታት : ጽማቕ ማሕበረሰብ ንሓደ ናይ ተጠቃሚ ሕቶ ንምምላስ ማእከላይ መልስታት ብምፍጣር ይጥቀሙ፣ ድሕሪኡ ናብ ናይ መወዳእታ ዓለማዊ መልሲ ይእከቡ።


ኣስተውዕል ኣተገባብራይ ቅድሚ ኮዶም ምህላዉ ዝተገብረ እዩ፣ ስለዚ ኣብቲ መሰረታዊ ኣገባብ ወይ ኣብ ጥቕሚ ዝውዕል ናይ LLM ምልክታት ቁሩብ ፍልልያት ክህሉ ይኽእል እዩ። ነቶም ፍልልያት እናኸድና ክገልጾም ክፍትን እየ።


እቲ ኮድ ኣብ GitHub ይርከብ።

ምድላው ናይ Neo4j ሃዋህው

Neo4j ከም መሰረታዊ ግራፍ ስቶር ክንጥቀመሉ ኢና። እቲ ዝቐለለ መንገዲ ንምጅማር ነጻ ምሳሌ ናይ Neo4j Sandbox ምጥቃም እዩ፣ እዚ ድማ ናይ Neo4j ዳታቤዝ ናይ ደበና ምሳሌታት ምስ ግራፍ ዳታ ሳይንስ ፕላግ-ኢን ተተኺሉ የቕርብ። ከም ኣማራጺ፡ ነቲ Neo4j Desktop መተግበሪ ብምውራድን ሎካል ዳታቤዝ ኢንስታንስ ብምፍጣርን፡ ናይ Neo4j ዳታቤዝ ሎካል ኢንስታንስ ከተቕውም ትኽእል። ሎካል ቨርዥን ትጥቀም እንተኾንካ፡ ክልቲኦም APOCን GDSን ፕላጊናት ምጽዓንካ ኣረጋግጽ። ንናይ ምፍራይ ኣወዳድባታት፡ ነቲ ዝኽፈል፡ ዝመሓደር AuraDS (Data Science) instance ክትጥቀም ትኽእል ኢኻ፡ እዚ ድማ ነቲ GDS ፕላግ-ኢን ይህብ።


Neo4jGraph instance ብምፍጣር ኢና ንጅምር፣ እዚ ድማ ኣብ LangChain ዝወሰኽናዮ ምቹእነት መጠቕለሊ እዩ፤


 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)

ዳታሴት።

ቅድሚ ገለ ግዜ ናይ ዲፍቦት ኤፒኣይ ተጠቒመ ዝፈጠርክዎ ናይ ዜና ጽሑፍ ዳታሴት ክንጥቀም ኢና። ንቐሊል ዳግመ-ምጥቃም ኣብ GitHub ሰቒለዮ ኣለኹ፤


 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()


ካብቲ ዳታሴት ነተን ቀዳሞት ክልተ መስመራት ንመርምር።


ካብቲ ዳታሴት ናሙና መስመራት።


ኣርእስትን ጽሑፍን ናይቶም ጽሑፋት፡ ምስ ዕለተ ምሕታሞምን ቁጽሪ ቶከንን ብናይ tiktoken library ተጠቒምና ኣለና።

ጽሑፍ ምጭብባጥ

እቲ ናይ ጽሑፍ ምክፍፋል ስጉምቲ ወሳኒ ኮይኑ፡ ንውጽኢት ንታሕቲ ዝወርድ ውጽኢት ብዓቢኡ ጽልዋ ኣለዎ። እቶም ጸሓፍቲ ናይቲ ጽሑፍ፡ ንኣሽቱ ቁንጣሮ ጽሑፋት ምጥቃም፡ ብሓፈሻ ዝያዳ ኣካላት ምውጻእ ከም ዘምጽእ ረኺቦም።


ብዝሒ ናይ ቅብኣ ኣካላት ብዓቐን ናይ ጽሑፍ ቁንጣሮ ተዋሂቡ — ምስሊ ካብ GraphRAG ወረቐት , ፍቓድ ኣብ ትሕቲ CC BY 4.0


ከምቲ ትርእይዎ ዘለኹም፡ 2,400 ቶከናት ዝሓዘ ናይ ጽሑፍ ቁንጣሮ ምጥቃም፡ ካብቲ 600 ቶከናት ዝጥቀሙሉ ዝነበሩ እዋን ዝወሓደ ዝተቐድሑ ኣካላት የስዕብ። ብተወሳኺ፡ LLMs ኣብ ቀዳማይ ጉያ ንኹሎም ኣካላት ከየውጽኡ ከም ዝኽእሉ ኣለልዮም። ኣብ ከምኡ ኩነታት፡ ነቲ ምውጻእ ብተደጋጋሚ ንምፍጻም (heuristics) የተኣታቱ። ብዛዕባ እዚ ኣብ ዝቕጽል ክፋል ብዝያዳ ክንዛረብ ኢና።


ይኹን እምበር፡ ኩሉ ግዜ ምትሕውዋስ ኣሎ። ንኣሽቱ ቁንጣሮ ጽሑፍ ምጥቃም፡ ኣብ መላእ ሰነዳት ዝተዘርግሑ ፍሉያት ኣካላት ዓውድን ሓባራዊ መወከሲታትን ምጥፋእ ከስዕብ ይኽእል። ንኣብነት፡ ሓደ ሰነድ “ዮሃንስ”ን “ንሱ”ን በበይኑ ሓረጋት እንተ ጠቒሱ፡ ነቲ ጽሑፍ ኣብ ንኣሽቱ ቝርጽራጽ ምብታኽ፡ “ንሱ” ንዮሃንስ ከም ዜመልክት ንጹር ኪገብሮ ይኽእል እዩ። ገለ ካብቶም ናይ ሓባር መወከሲ ጉዳያት ብናይ ምድብላቕ ጽሑፍ ምክፍፋል ስትራተጂ ተጠቒምካ ክፍታሕ ይከኣል እዩ፣ ኩሎም ግን ኣይኮኑን።


ንዓቐን ጽሑፋት ጽሑፋትና ንመርምር፤


 sns.histplot(news["tokens"], kde=False) plt.title('Distribution of chunk sizes') plt.xlabel('Token count') plt.ylabel('Frequency') plt.show() 



ዝርገሐ ቁጽሪ ቶከናት ጽሑፍ ብግምት ንቡር ኮይኑ፡ ዝለዓለ ጥርዙ ከባቢ 400 ቶከናት ኣለዎ። ድግግሞሽ ናይ ቁንጣሮ ቁንጣሮ በብቑሩብ ክሳብ እዚ ጫፍ ይውስኽ፣ ድሕሪኡ ብሲሜትሪክ ይንኪ፣ እዚ ድማ መብዛሕትኦም ናይ ጽሑፍ ቁንጣሮ ኣብ ጥቓ እቲ 400-ቶከን ምልክት ከምዘለዉ የመልክት።


ብሰንኪ እዚ ዝርገሐ እዚ፡ ኣብዚ ዝኾነ ናይ ጽሑፍ ምጭብባጥ ኣይንፍጽምን ኢና፡ ምእንቲ ናይ ሓባር መወከሲ ጉዳያት ንኸይፍጠር። ብነባሪ መልክዑ፡ ፕሮጀክት GraphRAG 300 ቶከናት ዝኾኑ ቻንክ ሳይዝ ምስ 100 ቶከናት ናይ ምድብላቕ ይጥቀም።

ምውጻእ ኖድታትን ዝምድናታትን

እቲ ዝቕጽል ስጉምቲ ካብ ቁንጣሮ ጽሑፋት ፍልጠት ምህናጽ እዩ። ነዚ ናይ ኣጠቓቕማ ጉዳይ፡ ካብቲ ጽሑፍ ብመልክዕ መስመራትን ዝምድናታትን ዝተዋደደ ሓበሬታ ንምውጻእ LLM ንጥቀም። ኣብቲ ወረቐት ዝተጠቕሙ ጸሓፍቲ ነቲ ናይ LLM ምልክት ክትምርምሮ ትኽእል ኢኻ። ኣድላዪ እንተኾይኑ ንናይ መስመር ስያመታት ኣቐዲምና ክንገልጸሉ እንኽእል LLM ምልክታት ኣለዎም፣ ግን ብነባሪ፣ እዚ ኣማራጺ እዩ። ብተወሳኺ ኣብቲ መበቆላዊ ሰነድ ዝተቐድሑ ዝምድናታት ብሓቂ ዓይነት የብሎምን መግለጺ ጥራይ። ናይዚ ምርጫ ምኽንያት፡ LLM ዝሃብተመን ዝያዳ ንኡስ ሓበሬታ ከም ዝምድናታት ከውጽእን ክዕቅብን ምፍቃድ ምዃኑ እግምት። ግን ጽሩይ ናይ ፍልጠት ግራፍ ምስ ዝኾነ ዝምድና-ዓይነት ስፔሲፊኬሽን ክህልወካ ኣጸጋሚ እዩ (እቶም መግለጺታት ናብ ሓደ ንብረት ክኣትዉ ይኽእሉ እዮም)።


ኣብ ኣተገባብራና፡ ኣብ ቤተ-መጻሕፍቲ LangChain ዝርከብ LLMGraphTransformer ክንጥቀም ኢና። ኣብ ክንዲ ጽሩይ ፕሮምፕት ምህንድስና ምጥቃም፡ ከምቲ ኣብቲ ጽሑፍ ጽሑፍ ዘሎ ኣተገባብራ ዝገብሮ፡ LLMGraphTransformer ነቲ ኣብ ውሽጡ ዘሎ ናይ ፋንክሽን ጻውዒት ደገፍ ተጠቒሙ ዝተዋደደ ሓበሬታ (ቅርጻዊ ውጽኢት LLMs ኣብ LangChain) ንምውጻእ ይጥቀመሉ። ነቲ ናይ ስርዓት ምልክት ክትፍትሽዎ ትኽእሉ ኢኹም :


 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])


ኣብዚ ኣብነት ንግራፍ ምውጻእ GPT-4o ንጥቀም። እቶም ጸሓፍቲ ብፍላይ ንኤልኤልኤም ኣካላትን ዝምድናታትን መግለጺታቶምን ከውጽእ መምርሒ ይህቡ ። ምስ ኣተገባብራ LangChain፡ እቶም node_propertiesrelationship_properties ባህርያትን ተጠቒምካ፡ ኣየኖት ናይ መስመር ወይ ዝምድና ባህርያት LLM ከውጽእ ከም እትደሊ ክትገልጽ ትኽእል።


እቲ ፍልልይ ምስ ኣተገባብራ LLMGraphTransformer ኩሎም ናይ መስመር ወይ ዝምድና ባህርያት ኣማራጺ ስለዝኾኑ ኩሎም መስመራት ናይቲ description ባህሪ ኣይክህልዎምን እዩ። እንተደሊና ግዴታዊ description ንብረት ንኽህልዎ ብሕታዊ ምውጻእ ክንገልጾ ንኽእል ኢና፡ ኣብዚ ኣተገባብራ ግን ነዚ ክንዝልፎ ኢና።


ነቲ ግራፍ ምውጻእ ዝቐልጠፈ ንምግባርን ውጽኢት ናብ Neo4j ንምኽዛንን ዝቐረቡ ሕቶታት ማዕረ ክንገብሮም ኢና፤


 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 )


ኣብዚ ኣብነት ካብ 2000 ጽሑፋት ግራፍ ሓበሬታ ኣውጺእና ውጽኢት ናብ Neo4j ንዕቅቦ። ኣስታት 13 ሽሕ ኣካላትን 16 ሽሕ ዝምድናታትን ኣውጺእና ኣለና። ኣብዚ ኣብነት ናይ ሓደ ዝተቐድሐ ሰነድ ኣብቲ ግራፍ ኣሎ።


እቲ ሰነድ (ሰማያዊ) ናብ ዝተቐድሑ ኣካላትን ዝምድናታትን የመልክት።


ምውጻእ ንምዝዛም ኣስታት 35 (+/- 5) ደቓይቕ ዝወስድ ኮይኑ ምስ GPT-4o ኣስታት $30 ይኸውን።


ኣብዚ ስጉምቲ እዚ እቶም ጸሓፍቲ ካብ ሓደ ንላዕሊ ምሕላፍ ሓበሬታ ግራፍ ንምውጻእ ድዩ ኣይኮነን ንምውሳን ሂውሪስቲክስ የተኣታቱ። ንቐሊልነት ክንብል ሓንቲ ምሕላፍ ጥራይ ኢና ክንገብር። ይኹን እምበር፡ ብዙሕ ምሕላፍ ክንገብር እንተደሊና፡ ነቲ ናይ መጀመርታ ውጽኢት ምውጻእ ከም ናይ ዕላል ታሪኽ ኣቐሚጥና፡ ብቐሊሉ ን LLM ብዙሓት ኣካላት ከም ዝጎደሉ ክንህቦ ንኽእል ኢና ፡ ከምኡ’ውን ከምቲ ጸሓፍቲ GraphRAG ዝገብርዎ ዝያዳ ከውጽእ ኣለዎ።


ቅድሚ ሕጂ፡ ዓቐን ጽሑፍ ቁንጣሮ ክሳብ ክንደይ ኣገዳሲ ምዃኑን ንብዝሒ ዝተቐድሑ ኣካላት ብኸመይ ከም ዝጸልዎን ጠቒሰ ነይረ። ዝኾነ ተወሳኺ ናይ ጽሑፍ ምክፍፋል ስለዘይገበርና፡ ዝርገሐ ናይ ዝተቐድሑ ኣካላት ብመሰረት ዓቐን ጽሑፍ ክንመዝኖ ንኽእል ኢና፤


 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() 




እቲ ፋሕፋሕ ፕሎት ከምዘርእዮ፡ ብቐይሕ መስመር ዝሕበር ኣወንታዊ ዝንባለ እኳ እንተሃለወ፡ እቲ ዝምድና ግን ትሕተ-መስመራዊ እዩ። መብዛሕትኦም ነጥብታት ዳታ ኣብ ዝተሓተ ቁጽሪ ኣካላት ይእከቡ፣ ዋላ ቁጽሪ ቶከን እናወሰኸ ምስ ከደ። እዚ ድማ ቁጽሪ ናይቶም ዝተቐድሑ ኣካላት ምስ ዓቐን ናይቶም ጽሑፋት ቁንጣሮ ብተመጣጣኒ ከምዘይመጣጠን ዘመልክት እዩ። ገለ ኣውትላይርስ እኳ እንተሃለዉ፡ እቲ ሓፈሻዊ ቅዲ ዝለዓለ ቁጽሪ ቶከናት ብቐጻሊ ናብ ዝለዓለ ቁጽሪ ኣካላት ከምዘይመርሕ ይሕብር። እዚ ድማ ንዝተሓተ ዓቐን ጽሑፍ ቁንጣሮ ዝያዳ ሓበሬታ ከም ዘውጽእ ዝረኸብዎ ርኽበት ጸሓፍቲ የረጋግጽ።


ናይቲ ዝተሃንጸ ግራፍ ናይ መስመር ዲግሪ ምክፍፋላት ምፍታሽ እውን መሳጢ ክኸውን እዩ ኢለ ሓሲበ። እዚ ዝስዕብ ኮድ ንናይ መስመር ዲግሪ ምክፍፋላት ይወስድን ይስእልን፤


 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() 



ምክፍፋል ዲግሪ መስመር መስመር ሓይሊ-ሕጊ ቅዲ ዝኽተል ኮይኑ፡ መብዛሕትኦም መስመራት ኣዝዩ ውሑድ ምትእስሳር ክህልዎም እንከሎ ውሑዳት መስመራት ድማ ኣዝዮም ዝተኣሳሰሩ ምዃኖም የመልክት። ማእከላይ ደረጃ 2.45፡ ማእከላይ ደረጃ ድማ 1.00 ኮይኑ፡ ልዕሊ ፍርቂ መስመራት ሓደ ምትእስሳር ጥራይ ከም ዘለዎም ዘርኢ እዩ። መብዛሕትኦም ኖድስ (75 ሚእታዊት) ክልተ ወይ ትሕቲኡ ምትእስሳር ዘለዎም ክኾኑ ከለዉ፡ 90 ሚእታዊት ድማ ሓሙሽተ ወይ ትሕቲኡ እዮም። እዚ ዝርገሐ እዚ ንብዙሓት ናይ ሓቂ ዓለም መርበባት ልሙድ እዩ፣ ውሑዳት ቁጽሪ ዘለዎም ሃብታት ብዙሕ ምትእስሳር ዘለዎም፣ መብዛሕትኦም ኖድታት ድማ ውሑዳት ኣለዎም።


ክልቲኦም መግለጺታት መስመርን ዝምድናን ግዴታዊ ባህርያት ስለዘይኮኑ፡ ክንደይ ከምዝተቐድሑ እውን ክንምርምር ኢና፤


 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 """)



እቲ ውፅኢት ከምዘመልክቶ ካብ 12,994 (45.6 ሚኢታዊ) እቶም 5,926 ኖድታት ናይ መግለፂ ባህሪ ኣለዎም። ብኻልእ ወገን ድማ ካብ 15,921 (35 ሚእታዊት) ዝምድናታት 5,569 ጥራይ ከምዚ ዓይነት ንብረት ኣለዎም።


ኣስተውዕል ብሰንኪ ናይ LLMs ተኽእሎኣዊ ባህሪ፡ እቶም ቁጽርታት ኣብ ዝተፈላለየ ጉያታትን ዝተፈላለየ ምንጪ ዳታ፡ LLMsን ምልዕዓልን ክፈላለዩ ይኽእሉ።

ውሳነ ኣካል

ምፍታሕ ኣካል (de-duplication) ናይ ፍልጠት ግራፍ ኣብ ዝህነጸሉ እዋን ወሳኒ እዩ ምኽንያቱ ነፍሲ ወከፍ ኣካል ብፍሉይን ብትኽክልን ከምዝውከል ስለዘረጋግጽ፣ ንሓደ ዓይነት ናይ ሓቂ ዓለም ኣካል ዝውክሉ መዛግብቲ ምድግጋምን ምውህሃድን ይከላኸል። እዚ መስርሕ እዚ ኣብ ውሽጢ ግራፍ ምሉእነትን ቅኑዕነትን ዳታ ንምዕቃብ ኣገዳሲ እዩ። ብዘይ ናይ ኣካል ፍታሕ፡ ግራፍ ፍልጠት ብዝተበታተነን ዘይተሰማማዕን ዳታ ምተሳቐየ፡ እዚ ድማ ናብ ጌጋታትን ዘይተኣማመን ርድኢታትን ምመርሐ።


ክኸውን ዝኽእል ኣካል ድፕሊኬት


እዚ ምስሊ እዚ፡ ሓደ ሓደ ናይ ሓቂ ዓለም ኣካል ኣብ ዝተፈላለዩ ሰነዳት፡ ከም ሳዕቤኑ ድማ ኣብ ግራፍና ብቑሩብ ዝተፈላለየ ኣስማት ክቐርብ ከም ዝኽእል ዘርኢ እዩ።


ካብዚ ሓሊፉ ስፍሕ ዝበለ መረዳእታ ብዘይ ናይ ኣካል ፍታሕ ትርጉም ዘለዎ ጉዳይ ይኸውን። ካብ ዝተፈላለዩ ምንጭታት ዝመጽእ ዘይምሉእ ወይ ከፊላዊ ዳታ ፋሕፋሕን ዝተቛረጸን ሓበሬታ ከስዕብ ስለ ዝኽእል፡ ብዛዕባ ኣካላት ውሁድን ኩለመዳያውን ርድኢት ንምፍጣር ኣጸጋሚ ይገብሮ። ቅኑዕ ፍታሕ ኣካል ነዚ ዝፈትሖ ዳታ ብምድማር፣ ክፍተታት ብምምላእን ንነፍሲ ወከፍ ኣካል ውሁድ ኣረኣእያ ብምፍጣርን እዩ።


ቅድሚ/ድሕሪ ምጥቃም ሴንዚንግ ኣካል ውሳነ ንኣህጉራዊ ኮንሶርትየም መርማሪ ጋዜጠኛታት (ICIJ) ኣብ ባሕሪ ምፍሳስ ዳታ ንምትእስሳር — ምስሊ ካብ ፓኮ ናታን


ጸጋማይ ክፋል ናይቲ ምስሊ ስሕት ዝበለን ዘይተኣሳሰርን ግራፍ የቕርብ። ይኹን እምበር ከምቲ ብየማናይ ሸነኽ ዝርአ ከምዚ ዓይነት ግራፍ ምስ ስሉጥ ውሳነ ኣካል ጽቡቕ ምትእስሳር ክህልዎ ይኽእል።


ብሓፈሻ፡ ፍታሕ ኣካል ንብቕዓት ምእካብን ምውህሃድን ዳታ ብምዕባይ፡ ኣብ ዝተፈላለዩ ምንጭታት ንዝህሉ ሓበሬታ ውሁድ ኣረኣእያ ይህብ። ኣብ መወዳእታ ኣብ ዘተኣማምንን ምሉእን ናይ ፍልጠት ግራፍ ዝተመርኮሰ ዝያዳ ውጽኢታዊ ዝኾነ ሕቶ-ምምላስ የኽእል።


እቲ ዘሕዝን ግን ጸሓፍቲ ናይቲ GraphRAG ወረቐት ዋላ እኳ ኣብ ጽሑፎም እንተጠቐስዎ ኣብ ሪፖኦም ዝኾነ ናይ ኣካል ፍታሕ ኮድ ኣየእተዉን። ሓደ ምኽንያት ነዚ ኮድ ምግዳፍ ንዝኾነ ዝተዋህበ ዓውዲ ድልዱልን ጽቡቕ ኣፈጻጽማ ዘለዎን ናይ ኣካል ውሳነ ምትግባር ከቢድ ስለዝኾነ ክኸውን ይኽእል። ምስ ኣቐዲሞም ዝተነጸሩ ዓይነታት ኖድታት ክትራኸብ ከለኻ ንዝተፈላለዩ ኖድስ ብሕታዊ ሂውሪስቲክስ ከተተግብር ትኽእል ኢኻ (ኣቐዲሞም ዝተነጸሩ ኣብ ዘይኮኑሉ እዋን እኹል ቅኑዕ ኣይኮኑን፣ ከም ኩባንያ፣ ትካል፣ ቢዝነስ ወዘተ)። እንተኾነ ግን ከምቲ ኣብ ጉዳይና ዘሎ ናይ መስመር ስያመታት ወይ ዓይነታት ኣቐዲሞም እንተዘይተፈልጠ እዚ ዝያዳ ዝኸበደ ጸገም ይኸውን። እዚ ከምዚ ኢሉ እናሃለወ፡ ኣብዚ ኣብ ፕሮጀክትና ስሪት ናይ ኣካል ውሳነ ክንተግብር ኢና፡ ጽሑፍ ምትእትታውን ግራፍ ኣልጎሪዝምን ምስ ርሕቀት ቃላትን LLMsን ኣወሃሂድና።


ዋሕዚ ፍታሕ ኣካል


መስርሕ ፍታሕ ኣካልና እዞም ዝስዕቡ ስጉምትታት ዘጠቓልል እዩ፤


  1. ኣብ ግራፍ ዘለዉ ኣካላት — ካብ ኩሎም ኣብ ውሽጢ ግራፍ ዘለዉ ኣካላት ጀምር።
  2. K-nearest graph — ኣብ ጽሑፍ ምትእትታው ተመርኲስካ ተመሳሰልቲ ኣካላት ብምትእስሳር፡ k-nearest neighbor graph ምህናጽ።
  3. ድኹም ምትእስሳር ዘለዎም ኣካላት — ኣብቲ k-ዝቐረበ ግራፍ ድኹም ምትእስሳር ዘለዎም ኣካላት ምልላይ፣ ተመሳሳሊ ክኾኑ ዝኽእሉ ኣካላት ምጉጅጃል። እዞም ባእታታት ምስ ተለለዩ ናይ ቃላት ርሕቀት ምፍታሕ ስጉምቲ ወስኹ።
  4. LLM ገምጋም — ነዞም ኣካላት ንምግምጋምን ኣብ ውሽጢ ነፍሲ ወከፍ ክፍሊ ዝርከቡ ኣካላት ክውሃሃዱ ኣለዎም ድዩ ኣይግባእን ንምውሳን LLM ተጠቐም፣ ውጽኢቱ ድማ ናይ መወዳእታ ውሳነ ኣብ ፍታሕ ኣካላት (ንኣብነት 'ሲሊኮን ቫሊ ባንክ'ን 'ሲሊኮን_ቫሊ_ባንክ'ን ምውህሃድ ንዝተፈላለዩ ምውህሃድ እናነጸግካ ከም 'መስከረም 16, 2023'ን 'መስከረም 2, 2023'ን ዝኣመሰሉ ዕለታት)።


ንናይ ኣካላት ስምን መግለጺ ባህርያትን ናይ ጽሑፍ ምትእትታው ብምሕሳብ ኢና ንጅምር። ነዚ ንምዕዋት ኣብ LangChain ኣብ ዘሎ Neo4jVector integration from_existing_graph ሜላ ክንጥቀም ንኽእል ኢና፤


 vector = Neo4jVector.from_existing_graph( OpenAIEmbeddings(), node_label='__Entity__', text_node_properties=['id', 'description'], embedding_node_property='embedding' )


ነዞም ምትእትታዋት ተጠቒምና ኣብ ርሕቀት ኮሳይን ናይዞም ምትእትታዋት ተመርኲስና ተመሳሳሊ ክኾኑ ዝኽእሉ ሕጹያት ክንረክብ ንኽእል። ኣብ ቤተ መጻሕፍቲ ግራፍ ዳታ ሳይንስ (GDS) ዝርከቡ ግራፍ ኣልጎሪዝም ክንጥቀም ኢና ; ስለዚ ንቐሊል ኣጠቓቕማ ብፓይቶኒክ መንገዲ GDS Python client ክንጥቀመሉ ንኽእል ኢና፤


 from graphdatascience import GraphDataScience gds = GraphDataScience( os.environ["NEO4J_URI"], auth=(os.environ["NEO4J_USERNAME"], os.environ["NEO4J_PASSWORD"]) )


ምስ ቤተ-መጻሕፍቲ GDS ዘይትፋለጡ እንተኾይንኩም፡ ቅድሚ ዝኾነ ናይ ግራፍ ኣልጎሪዝም ምፍጻምና፡ መጀመርታ ኣብ ውሽጢ ዝኽሪ ዝርከብ ግራፍ ክንፕሮጀክት ኣለና።


ግራፍ ዳታ ሳይንስ ኣልጎሪዝም ምፍጻም ዋሕዚ ስራሕ


ቀዳማይ፡ እቲ ኣብ Neo4j ዝተዓቀበ ግራፍ፡ ንዝቐልጠፈ መስርሕን ትንተናን ናብ ኣብ ውሽጢ ዝኽሪ ዝርከብ ግራፍ ፕሮጀክት ይግበር። ቀጺሉ ኣብቲ ኣብ ውሽጢ ዝኽሪ ዘሎ ግራፍ ግራፍ ኣልጎሪዝም ይፍጸም። ከም ኣማራጺ ውጽኢት ናይቲ ኣልጎሪዝም ተመሊሱ ናብ Neo4j ዳታቤዝ ክኽዘን ይኽእል። ብዛዕባኡ ኣብቲ ሰነድ ዝያዳ ፍለጥ ።


k-nearest neighbor graph ንምፍጣር፡ ንኹሎም ኣካላት ምስ ናይ ጽሑፍ ምትእትታዎም ፕሮጀክት ክንገብሮም ኢና፤


 G, result = gds.graph.project( "entities", # Graph name "__Entity__", # Node projection "*", # Relationship projection nodeProperties=["embedding"] # Configuration parameters )


ሕጂ እቲ ግራፍ ኣብ ትሕቲ ስም entities ፕሮጀክት ስለዝኾነ፡ ኣልጎሪዝም ግራፍ ክንፍጽም ንኽእል። k-nearest graph ብምህናጽ ክንጅምር ኢና። እቶም ክልተ ኣገደስቲ መለክዒታት እቲ k-ዝቐረበ ግራፍ ክሳብ ክንደይ ስፍሕ ዝበለ ወይ ጽዑቕ ከም ዝኸውን ዝጸልዉ similarityCutofftopK ን እዮም። እቲ topK ንነፍሲ ወከፍ መስመር ክትረኽቦም ዘለካ ብዝሒ ጎረባብቲ ኮይኑ፡ ዝተሓተ ዋጋ 1. እቲ similarityCutoff ትሕቲ እዚ ደረት ተመሳሳልነት ዘለዎም ዝምድናታት ይፍልፍል። ኣብዚ፡ ነባሪ topK 10ን ብተዛማዲ ልዑል ተመሳሳልነት ምቁራጽ 0.95ን ክንጥቀም ኢና። ከም 0.95 ዝኣመሰለ ልዑል ተመሳሳልነት ዘለዎ ምቁራጽ ምጥቃም፡ ኣዝዮም ተመሳሰልቲ ጽምዲ ጥራይ ከም ምትእስሳር ከም ዝቑጸሩ የረጋግጽ፡ ናይ ሓሶት ኣወንታዊ ነገራት የጉድልን ልክዕነት የመሓይሽን።


k-nearest graph ምህናጽን ኣብ ፕሮጀክት ግራፍ ሓደስቲ ዝምድናታት ምኽዛን።


ነቲ ውጽኢት ኣብ ክንዲ ናይቲ ናይ ፍልጠት ግራፍ ናብቲ ዝተተንበየ ኣብ ውሽጢ ዝኽሪ ዘሎ ግራፍ ክንመልሶ ስለ እንደሊ፡ ናይቲ ኣልጎሪዝም mutate ሞድ ክንጥቀም ኢና፤


 similarity_threshold = 0.95 gds.knn.mutate( G, nodeProperties=['embedding'], mutateRelationshipType= 'SIMILAR', mutateProperty= 'score', similarityCutoff=similarity_threshold )


እቲ ዝቕጽል ስጉምቲ ምስቲ ሓደስቲ ዝተገመቱ ናይ ተመሳሳልነት ዝምድናታት ዝተኣሳሰሩ ጉጅለታት ኣካላት ምልላይ እዩ። ምልላይ ጉጅለታት ዝተኣሳሰሩ መስመራት ኣብ ትንተና መርበብ ብተደጋጋሚ ዝካየድ መስርሕ ኮይኑ፡ መብዛሕትኡ ግዜ ምፍላጥ ማሕበረሰብ ወይ ምትእኽኻብ ይበሃል፣ እዚ ድማ ንኡሳን ጉጅለታት ጽዑቕ ዝተኣሳሰሩ መስመራት ምርካብ ዘጠቓልል እዩ። ኣብዚ ኣብነት እዚ፡ ዋላ ኣንፈት ናይቶም ምትእስሳራት ዕሽሽ እንተበልና፡ ኩሎም ኖድታት ዝተኣሳሰሩሉ ክፋላት ናይ ሓደ ግራፍ ንምርካብ ዝሕግዘና ፡ Weakly Connected Components algorithm ክንጥቀም ኢና።


ውጽኢት WCC ናብ ዳታቤዝ ምምላስ


ነቲ ውጽኢት ናብቲ ዳታቤዝ ንምምላስ (ዝተዓቀበ ግራፍ) ናይቲ ኣልጎሪዝም write ሞድ ንጥቀም፤


 gds.wcc.write( G, writeProperty="wcc", relationshipTypes=["SIMILAR"] )


ንጽጽር ምትእትታው ጽሑፍ ክደግሙ ዝኽእሉ ንምርካብ ይሕግዝ፣ ግን ኣካል ናይቲ መስርሕ ምፍታሕ ኣካል ጥራይ እዩ። ንኣብነት ጉግልን ኣፕልን ኣብ ምትእትታው ቦታ ኣዝዮም ቅርበት ኣለዎም (0.96 cosine similarity using the ada-002 embedding model)። ን BMWን Mercedes Benzን እውን ከምኡ (0.97 ኮሳይን ተመሳሳልነት)። ልዑል ናይ ጽሑፍ ምትእትታው ተመሳሳልነት ጽቡቕ ጅማሮ እዩ፡ ግን ከነመሓይሾ ንኽእል ኢና። ስለዚ፡ ሰለስተ ወይ ትሕቲኡ ናይ ጽሑፍ ርሕቀት ዘለዎም ጽምዲ ቃላት ጥራይ ዘፍቅድ ተወሳኺ ፍልተር ክንውስኽ ኢና (እቶም ፊደላት ጥራይ ክቕየሩ ይኽእሉ ማለት እዩ)፤


 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})


እዚ ናይ ሳይፈር መግለጺ ቁሩብ ዝያዳ ተሳትፎ ዘለዎ ኮይኑ፡ ትርጉሙ ድማ ካብ ስፍሓት ናይዚ ጽሑፍ ብሎግ ወጻኢ እዩ። ኩሉ ግዜ ንሓደ LLM ክትርጉሞ ክትሓትት ትኽእል ኢኻ።


ኣንትሮፒክ ክላውድ ሶኔት 3.5 — ምግላጽ ናይቲ ተደጋጋሚ ኣካል ውሳነ መግለጺ


ብተወሳኺ እቲ ናይ ቃል ርሕቀት ምቁራጽ ኣብ ክንዲ ሓደ ቁጽሪ ናይ ንውሓት ናይቲ ቃል ተግባር ክኸውን ይኽእልን እቲ ኣተገባብራ ድማ ዝያዳ ምዕባይ ክኸውን ይኽእል እዩ።


እቲ ኣገዳሲ ነገር፡ ክንወሃሃድ ንደሊ ንኸውን ናይ ክኾኑ ዝኽእሉ ኣካላት ጉጅለታት ዘውጽእ ምዃኑ እዩ። ዝርዝር ናይቶም ክውሃሃዱ ዝኽእሉ ኖድታት ኣብዚ ኣሎ፤


 {'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']},


ከምቲ ትርእይዎ ዘለኹም ኣገባብ ፍታሕ ንገለ ዓይነታት መስመር ካብ ካልኦት ዝሓሸ ይሰርሕ። ቅልጡፍ መርመራ መሰረት ብምግባር ንሰባትን ትካላትን ዝሓሸ ዝሰርሕ ይመስል፡ ንዕለታት ግን ቁሩብ ሕማቕ እዩ። ኣቐዲሞም ዝተነጸሩ ዓይነታት መስመር እንተንጥቀም ንዝተፈላለዩ ዓይነታት መስመር ዝተፈላለዩ ሂውሪስቲክስ ከነዳሉ ንኽእል ኢና። ኣብዚ ኣብነት ኣቐዲሞም ዝተነጸሩ ናይ መስመር ስያመታት ስለዘይብልና፡ ኣካላት ክውሃሃዱ ኣለዎም ድዩ ኣይግባእን ዝብል ናይ መወዳእታ ውሳነ ንምሃብ ናብ LLM ክንጥምት ኢና።


መጀመርታ፡ ንውህደት ናይቶም ኖድስ ብዝምልከት ነቲ ናይ መወዳእታ ውሳነ ብኣድማዒ መንገዲ ንምምራሕን ንምሕባርን LLM prompt ክንሕንጽጽ ኣለና፤


 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. """


ኣነ ኩሉ ግዜ ኣብ LangChain with_structured_output ሜላ ክጥቀም ደስ ይብለኒ structured data output ክጽበ ከለኹ ነቶም ውጽኢታት ብኢድካ ምትንታን ከይግደድ።


ኣብዚ፡ ነቲ ውጽኢት ከም list of lists ክንገልጾ ኢና ፣ ኣብዚ ነፍሲ ወከፍ ውሽጣዊ ዝርዝር ክውሃሃዱ ዝግበኦም ኣካላት ዝሓዘ እዩ። እዚ ኣቃውማ እዚ ንኣብነት እቲ እታው [Sony, Sony Inc, Google, Google Inc] ክኸውን ዝኽእል ስናርዮታት ንምሕላው ይጥቀመሉ። ኣብ ከምዚ ዝኣመሰለ ኩነታት፡ “ሶኒ”ን “ሶኒ ኢንክ”ን ካብ “ጉግል”ን “ጉግል ኢንክ”ን ተፈልዮም ክትወሃሃድ ምደለኻ።


 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 )


ቀጺልና፡ ነቲ LLM ፕሮምፕት ምስቲ ዝተሃንጸ ውጽኢት ብምውህሃድ፡ LangChain Expression Language (LCEL) syntax ተጠቒምና ሰንሰለት ንፈጥርን ኣብ ውሽጢ disambiguate function ንዓጽዎን።


 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 ]


ኩሎም ክኾኑ ዝኽእሉ ሕጹያት ኖድስ ብመንገዲ entity_resolution function ከነካይዶም ኣለና እሞ ክውሃሃዱ ኣለዎም ድዩ ኣይግባእን ክንውስን። ነቲ መስርሕ ንምቅልጣፍ፡ እንደገና ነቶም ናይ LLM ጻውዒታት ማዕረ ክንገብሮም ኢና፤


 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)


ናይ መወዳእታ ስጉምቲ ናይ entity resolution ውጽኢት ካብ entity_resolution LLM ወሲድካ ነቶም ዝተገልጹ ኖድታት ብምውህሃድ ናብቲ ዳታቤዝ ምምላስ የጠቓልል፤


 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})


እዚ ናይ ኣካል ውሳነ ፍጹም ኣይኮነን፣ ግን ከኣ ክንመሓየሸሉ እንኽእል መበገሲ ይህበና። ብተወሳኺ ኣየኖት ኣካላት ክዕቀቡ ከም ዘለዎም ንምውሳን ዝሕግዝ ስነ-መጎት ከነመሓይሽ ንኽእል ኢና።

ጽማቕ ባእታታት

ኣብ ዝቕጽል ስጉምቲ እቶም ጸሓፍቲ ናይ ባእታ ምድማር ስጉምቲ ይፍጽሙ። ብመሰረቱ ነፍሲ ወከፍ መስመርን ዝምድናን ብናይ ኣካል ምድማር ምልክት ይሓልፍ ። እቶም ጸሓፍቲ ንሓድሽነትን ተገዳስነትን ኣቀራርባኦም የስተብህሉ፤


“ብሓፈሻ፡ ሃብታም ገላጺ ጽሑፍ ንሓደ ዓይነት መስመራት ኣብ ሓደ ጫውጫው ክፈጥር ዝኽእል ኣቃውማ ግራፍ ምጥቃምና ምስ ክልቲኡ ዓቕሚ LLMsን ድሌታት ዓለማዊ፡ ሕቶ ዘተኮረ ምጽማቕን ዝሰማማዕ እዩ። እዞም ባህርያት እዚኣቶም፡ ንመዐቀኒ ግራፍና ካብቶም ልሙዳት ግራፍ ፍልጠት እውን ይፈልይዎ እዮም፣ እዚ ግራፍ እዚ ንታሕቲ ንዝግበር ናይ ምምዝዛን ዕማማት ኣብ ጽፉፍን ቅኑዕን ስሉስ ፍልጠት (ርእሰ-ሓሳብ፡ ምልክት፡ ኣቕሓ) ይምርኰስ።”


እቲ ሓሳብ ባህ ዘብል እዩ። ሕጂ’ውን ካብ ጽሑፍ ናይ ርእሰ-ጉዳይን ነገራትን መለለዪ ወይ ኣስማት ነውጽእ፣ እዚ ድማ ዋላ’ውን ኣካላት ኣብ ልዕሊ ብዙሓት ቁንጣሮ ጽሑፍ ክረኣዩ ከለዉ ዝምድናታት ምስ ቅኑዓት ኣካላት ከነተሓሕዞም የኽእለና። እንተኾነ ግን እቶም ዝምድናታት ኣብ ሓደ ዓይነት ኣይወርዱን እዮም። ኣብ ክንድኡስ፡ እቲ ዓይነት ዝምድና ብሓቂ ዝሃብተመን ዝያዳ ንኡስ ሓበሬታ ክንዕቅብ ዘኽእለና ነጻ ቅርጺ ዘለዎ ጽሑፍ እዩ።


ብተወሳኺ እቲ ናይ ኣካል ሓበሬታ ብኤልኤልኤም ተጠቒምካ ተጠቓሊሉ ስለዝቐርብ ነዚ ሓበሬታን ኣካላትን ብዝያዳ ትኽክለኛ ምውሳድ ብዝበለፀ ስሉጥ መንገዲ ክንሰኩዖምን ክንምልከቶምን የኽእለና።


ሓደ ሰብ እዚ ዝሃብተመን ዝያዳ ንኡስ ሓበሬታ ተወሳኺ፡ ምናልባት’ውን ፍቓደኛ ዝኾነ፡ ናይ መስመርን ዝምድናን ባህርያት ብምውሳኽ’ውን ክዕቀብ ይኽእል’ዩ ክብል ይኽእል። ሓደ ጉዳይ ምስ ፍቓደኛ ኖድን ዝምድናዊ ባህርያትን፡ LLM ዝተፈላለየ ኣስማት ንብረት ክጥቀም ወይ ኣብ ነፍሲ ወከፍ ምፍጻም ኣብ ዝተፈላለየ ዝርዝራት ከተኩር ስለ ዝኽእል፡ ነቲ ሓበሬታ ብቐጻሊ ንምውጻእ ከቢድ ክኸውን ይኽእል እዩ።


ገለ ካብዞም ጸገማት እዚኣቶም ኣቐዲሞም ዝተነጸሩ ኣስማት ንብረት ምስ ተወሳኺ ዓይነትን መግለጺን ሓበሬታ ብምጥቃም ክፍታሕ ይኽእል ነይሩ። ኣብ ከምኡ ኩነታት፡ ነቶም ንብረታት ንምግላጽ ዝሕግዝ ክኢላ ርእሰ-ጉዳይ ምደለኻ፡ እዚ ድማ ሓደ LLM ካብቲ ኣቐዲሙ ዝተነጸረ መግለጺታት ወጻኢ ዝኾነ ኣገዳሲ ሓበሬታ ንኸውጽእ ውሑድ ቦታ ምተረፈ።


ዝሃብተመ ሓበሬታ ኣብ ግራፍ ፍልጠት ንምውካል ዘሐጉስ ኣገባብ እዩ።


ሓደ ካብቲ ናይ ባእታ ምድማር ስጉምቲ ክህሉ ዝኽእል ጉዳይ፡ ንነፍሲ ወከፍ ኣብቲ ግራፍ ዘሎ ኣካልን ዝምድናን LLM ጻውዒት ስለዘድልዮ ጽቡቕ ስኬል ዘይምግባር እዩ። ግራፍና ብተዛማዲ ንእሽቶ ኮይኑ 13,000 ኖድስን 16,000 ዝምድናታትን ኣለዎ። ዋላ ንኸምዚ ዝበለ ንእሽቶ ግራፍ 29,000 LLM ጻውዒታት ምደለና፣ ነፍሲ ወከፍ ጻውዒት ድማ ሓደ ክልተ ሚእቲ ቶከናት ምተጠቐመት፣ እዚ ድማ ኣዝዩ ክቡርን ግዜ ዝወስድን ይገብሮ። ስለዚ ኣብዚ ስጉምቲ እዚ ክንርሕቕ ኢና። ሕጂ’ውን ኣብ እዋን ናይ መጀመርታ መስርሕ ጽሑፍ ዝተቐድሑ ናይ መግለጺ ባህርያት ክንጥቀመሎም ንኽእል ኢና።

ምህናጽን ምጽማቕን ማሕበረሰባት

ኣብ መስርሕ ህንፀትን ኢንዴክስን ግራፍ ናይ መወዳእታ ስጉምቲ ኣብ ውሽጢ እቲ ግራፍ ዝርከቡ ማሕበረሰባት ምልላይ ዘጠቓልል እዩ። ኣብዚ ጽሑፍ እዚ፡ ማሕበረሰብ ካብቲ ዝተረፈ ግራፍ ንላዕሊ ኣብ ነንሕድሕዶም ብዝያዳ ጽዑቕ ምትእስሳር ዘለዎም ጉጅለ ኖድታት ኮይኑ፡ ዝለዓለ ደረጃ ምትእስሳር ወይ ተመሳሳልነት ከምዘለዎ ዘመልክት እዩ። እዚ ዝስዕብ ስእላዊ ስእሊ ኣብነት ውጽኢት ምልላይ ማሕበረሰብ ዘርኢ እዩ።


ሃገራት ካብቲ ዝምልከተን ማሕበረሰብ መሰረት ብምግባር ሕብሪ ይወሃበን።


እዞም ናይ ኣካል ማሕበረሰባት ብክላስተሪንግ ኣልጎሪዝም ምስተለለዩ፡ ሓደ LLM ንነፍሲ ወከፍ ማሕበረሰብ ጽማቕ ብምፍጣር፡ ብዛዕባ ውልቃዊ ባህርያቶምን ዝምድናታቶምን ርድኢት ይህብ።


ሕጂ ውን ግራፍ ዳታ ሳይንስ ላይብረሪ ንጥቀም። ኣብ ውሽጢ ዝኽሪ ዝርከብ ግራፍ ብፕሮጀክት ኢና ንጅምር። ነቲ መበቆላዊ ጽሑፍ ብትኽክል ንምክትታል፡ ነቲ ግራፍ ኣካላት ከም ኣንፈት ዘይብሉ ሚዛናዊ መርበብ ክንፕሮጀክት ኢና፡ ኣብዚ እቲ መርበብ ንብዝሒ ምትእስሳር ኣብ መንጎ ክልተ ኣካላት ዝውክል እዩ፤


 G, result = gds.graph.project( "communities", # Graph name "__Entity__", # Node projection { "_ALL_": { "type": "*", "orientation": "UNDIRECTED", "properties": {"weight": {"property": "*", "aggregation": "COUNT"}}, } }, )



እቶም ጸሓፍቲ፡ ኣብ ውሽጢ እቲ ግራፍ ዝርከቡ ማሕበረሰባት ንምልላይ ፡ Leiden algorithm , ዝበሃል ስርዓተ-መሰረት ዘለዎ ምትእኽኻብ ኣገባብ ተጠቒሞም። ሓደ ብልጫ ናይ ስርዓተ-መሰረት ዘለዎ ማሕበረሰብ ምልላይ ኣልጎሪዝም ምጥቃም ኣብ ብዙሕ ደረጃታት ግራኑላሪቲ ማሕበረሰባት ናይ ምምርማር ዓቕሚ እዩ። እቶም ጸሓፍቲ፡ ኣብ ነፍሲ ወከፍ ደረጃ ዝርከቡ ኩሎም ማሕበረሰባት ብሓጺሩ ክቐርቡ፡ ብዛዕባ ኣቃውማ ናይቲ ግራፍ ሰፊሕ ርድኢት ክህቡ ይመኽሩ።


ፈለማ ምትእስሳር ግራፍና ንምግምጋም ድኹም ምትእስሳር ዘለዎም ኣካላት (WCC) ኣልጎሪዝም ክንጥቀም ኢና። እዚ ኣልጎሪዝም ኣብ ውሽጢ እቲ ግራፍ ዝተነጸሉ ክፍልታት የለልይ፣ እዚ ማለት ድማ ኣብ ነንሕድሕዶም ዝተኣሳሰሩ ግን ከኣ ምስ ዝተረፈ ግራፍ ዘይተኣሳሰሩ ንኡሳን ስብስባት ኖድስ ወይ ኣካላት ይፈልጥ። እዞም ባእታታት እዚኦም ኣብ ውሽጢ እቲ መርበብ ዘሎ ምብትታን ንምርዳእን ካብ ካልኦት ነጻ ዝኾኑ ጉጅለታት ኖድታት ንምልላይን ይሕግዙና። WCC ንሓፈሻዊ ኣቃውማን ምትእስሳርን ናይቲ ግራፍ ንምትንታን ኣዝዩ ኣገዳሲ እዩ።


 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 }


ውጽኢት ኣልጎሪዝም WCC 1,119 ፍሉያት ባእታታት ኣለልዩ። ብፍላይ እቲ ዝዓበየ ክፋል 9,109 ኖድስ ዝሓቖፈ ኮይኑ፡ ኣብ ሓቀኛ ዓለም መርበባት ልሙድ ኮይኑ፡ ሓደ ሱፐር ባእታ ምስ ብዙሓት ንኣሽቱ ዝተነጸሉ ኣካላት ብሓባር ዝነብር እዩ። እቲ ዝነኣሰ ክፍሊ ሓደ መስመር ኣለዎ፣ ማእከላይ መጠን ክፍሊ ድማ ኣስታት 11.3 መስመር እዩ።


ቀጺልና፡ ኣብ ቤተ-መጻሕፍቲ GDS እውን ዝርከብ ናይ ላይደን ኣልጎሪዝም ከነካይዶ ኢና፡ ነቲ includeIntermediateCommunities ዝብል መለክዒ ድማ ኣብ ኩሉ ደረጃታት ማሕበረሰባት ክምለስን ክዕቅብን ከነኽእሎ ኢና። ብተወሳኺ ነቲ ዝተመዝነ ፍልልይ ናይ ላይደን ኣልጎሪዝም ንምስራሕ relationshipWeightProperty ዝብል መለክዒ ኣካቲትና ኣለና። ናይቲ ኣልጎሪዝም write ሞድ ምጥቃም ነቲ ውጽኢት ከም ናይ መስመር ንብረት ይዕቅቦ።


 gds.leiden.write( G, writeProperty="communities", includeIntermediateCommunities=True, relationshipWeightProperty="weight", )


እቲ ኣልጎሪዝም ሓሙሽተ ደረጃታት ማሕበረሰባት ኣለልዩ፣ እቲ ዝለዓለ (ማሕበረሰባት ዝዓበዩሉ ዝነኣሰ ግራኑላር ደረጃ) 1,188 ማሕበረሰባት (ኣንጻር 1,119 ባእታታት) ዘለዎ እዩ። ኣብዚ ንገፊ ተጠቒምካ ኣብ መወዳእታ ደረጃ ዝርከቡ ማሕበረሰባት ስእላዊ ስእሊ ኣሎ።


ማሕበረሰባዊ ቅርጺ ምስሊ ኣብ ጌፊ


ልዕሊ 1000 ማሕበረሰባት ኣብ ኣእምሮኻ ምርኣይ ከቢድ እዩ፤ ንነፍሲ ወከፍ ሕብርታት ምምራጽ እውን ከይተረፈ ዳርጋ ዘይከኣል እዩ። ይኹን እምበር ጽቡቕ ስነ-ጥበባዊ ኣቀራርባ ይገብሩ።


ካብዚ ብምብጋስ ንነፍሲ ወከፍ ማሕበረሰብ ፍሉይ መስመር ክንፈጥርን ስርዓተ-መሰረት ኣቃውሞኦም ከም ንሓድሕዱ ዝተኣሳሰር ግራፍ ክንውክልን ኢና። ድሒርና ውን ጽማቕ ማሕበረሰብን ካልኦት ባህርያትን ከም ንብረት መስመር ክንዕቅቦም ኢና።


 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(*) """)


እቶም ጸሓፍቲ ብተወሳኺ community rank የተኣታቱ ፣ እዚ ድማ ኣብ ውሽጢ እቲ ማሕበረሰብ ዝርከቡ ኣካላት ዝረኣዩሉ ብዝሒ ፍሉያት ቁንጣሮ ጽሑፍ ዘመልክት እዩ፤


 graph.query(""" MATCH (c:__Community__)<-[:IN_COMMUNITY*]-(:__Entity__)<-[:MENTIONS]-(d:Document) WITH c, count(distinct d) AS rank SET c.community_rank = rank; """)


ሕጂ ብዙሓት መንጎኛታት ማሕበረሰባት ኣብ ዝለዓለ ደረጃታት ዝወሃሃዱ ናሙና ስርዓተ-መሰረት ንመርምር። እቶም ማሕበረሰባት ዘይተደራረቡ እዮም፣ እዚ ማለት ነፍሲ ወከፍ ኣካል ኣብ ነፍሲ ወከፍ ደረጃ ብልክዕ ናይ ሓደ ማሕበረሰብ እዩ።


ስርዓተ-መሰረት ዘለዎ ኣቃውማ ማሕበረሰብ፤ ማሕበረሰባት ኣራንሺ፡ ኣካላት ድማ ሐምላይ እዮም።


እቲ ምስሊ ካብ ኣልጎሪዝም ምልላይ ማሕበረሰብ ላይደን ዝመጸ ስርዓተ-መሰረት ዘለዎ ኣቃውማ ይውክል። እቶም ሐምላይ መስመራት ንውልቃዊ ኣካላት ክውክሉ እንከለዉ፡ እቶም ኣራንሺ መስመራት ድማ ንመሰረታዊ ማሕበረሰባት ይውክሉ።


እቲ ስርዓተ-መሰረት፡ ውደባ ናይዞም ኣካላት ናብ ዝተፈላለዩ ማሕበረሰባት ዘርኢ ኮይኑ፡ ንኣሽቱ ማሕበረሰባት ኣብ ዝለዓለ ደረጃታት ናብ ዝዓበዩ ማሕበረሰባት ይወሃሃዱ።


ሕጂ ንኣሽቱ ማሕበረሰባት ኣብ ዝለዓለ ደረጃታት ብኸመይ ከም ዝወሃሃዱ ንመርምር።


ስርዓተ-መሰረት ዘለዎ ኣቃውማ ማሕበረሰብ


እዚ ምስሊ እዚ ውሑድ ምትእስሳር ዘለዎም ኣካላትን ብሰንኪ እዚ ድማ ንኣሽቱ ማሕበረሰባትን ኣብ ደረጃታት ውሑድ ለውጢ ከምዘጋጥሞም ዘርኢ እዩ። ንኣብነት ኣብዚ ዘሎ ኣቃውማ ማሕበረሰብ ኣብተን ቀዳሞት ክልተ ደረጃታት ጥራይ ዝቕየር ኮይኑ ኣብተን ዝሓለፋ ሰለስተ ደረጃታት ግን ሓደ ዓይነት ኮይኑ ይቕጽል። ከም ሳዕቤኑ ድማ፡ እቲ ሓፈሻዊ ውዳበ ኣብ ዝተፈላለየ ደረጃታት ርኡይ ለውጢ ስለዘይገብር፡ እቶም ደረጃታት ስርዓተ-መሰረት መብዛሕትኡ ግዜ ነዞም ኣካላት ተደራራቢ ኮይኖም ይረኣዩ።


ብዝሒ ማሕበረሰባትን ዓቐኖምን ዝተፈላለየ ደረጃታቶምን ብሰፊሑ ንመርምር፤


 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 


ምክፍፋል ስፍሓት ማሕበረሰብ ብደረጃታት


ኣብቲ መበገሲ ኣተገባብራ ኣብ ነፍሲ ወከፍ ደረጃ ዝርከቡ ማሕበረሰባት ተጠቓሊሎም እዮም። ኣብ ጉዳይና፡ እዚ 8,590 ማሕበረሰባት፡ ከም ሳዕቤኑ ድማ 8,590 ጻውዒታት ኤልኤልኤም ምኾነ። ከከም ስርዓተ-መሰረት ዘለዎ ኣቃውማ ማሕበረሰብ ኩሉ ደረጃታት ምጽማቕ ኣየድልዮን እዩ ኢለ ምተማጎትኩ። ንኣብነት ኣብ መንጎ ናይ መወዳእታን ቀጻሊ ናብ መወዳእታን ደረጃ ዘሎ ፍልልይ ኣርባዕተ ማሕበረሰባት ጥራይ እዩ (1,192 ኣንጻር 1,188)። ስለዚ ብዙሕ ተደራራቢ ጽማቕ ምፈጠርና ነይርና። ሓደ መፍትሒ ንዝተፈላለዩ ደረጃታት ንዘለዉ ማሕበረሰባት ዘይልወጡ ሓደ ፅማቕ ክገብር ዝኽእል ኣተገባብራ ምፍጣር እዩ፤ ካልእ ድማ ዘይቅየር ማሕበረሰባዊ ስርዓተ-መሰረት ምፍራስ ምኾነ።


ከምኡ’ውን፡ ሓደ ኣባል ጥራይ ዘለዎም ማሕበረሰባት ብዙሕ ዋጋ ወይ ሓበሬታ ከይህቡ ስለ ዝኽእሉ፡ ብሓጺሩ ክንገልጾም ንደሊ እንተኾይንና ርግጸኛ ኣይኮንኩን። ኣብዚ፡ ኣብ ደረጃ 0፣ 1ን 4ን ዝርከቡ ማሕበረሰባት ብሓጺሩ ክንገልጾም ኢና።መጀመርታ ሓበሬታኦም ካብቲ ዳታቤዝ ክንወስድ ኣለና፤


 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 """)


ኣብዚ ሕዚ እዋን እቲ ናይ ሕብረተሰብ ሓበሬታ ከምዚ ዝስዕብ ኣቃውማ ኣለዎ፤


 {'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'}, ... ]}


ሕጂ፡ ብባእታታት ሕብረተሰብና ብዝወሃብ ሓበሬታ መሰረት፡ ተፈጥሮኣዊ ቋንቋ ምድማር ዘመንጩ ናይ LLM ምልክት ከነዳሉ ኣለና። ካብቲ እቶም ተመራመርቲ ዝተጠቕሙሉ ምልዕዓል ገለ ምትብባዕ ክንወስድ ንኽእል ኢና።


እቶም ጸሓፍቲ ንማሕበረሰባት ኣጠቓሊሎም ጥራይ ዘይኮነስ ንነፍሲ ወከፎም ርኽበታት ኣፍርዮም። ርኽበት ንሓደ ፍሉይ ፍጻመ ወይ ንሓበሬታ ዝምልከት ጽፉፍ ሓበሬታ ተባሂሉ ክግለጽ ይከኣል። ሓደ ካብዚ ኣብነት፤


 "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)]"


ብሓንቲ ምሕላፍ ጥራይ ርኽበታት ምውጻእ ልክዕ ከምቲ ኣካላትን ዝምድናታትን ምውጻእ ከምቲ ዘድልየና ኩለመዳያዊ ክኸውን ከምዘይክእል ናተይ ስነ-ኣእምሮኣዊ ምልከት ይሕብር።


ካብዚ ሓሊፉ ኣብ ኮዶም ኣብ ውሽጢ ዓዲ ይኹን ዓለማዊ ፍተሻ ሪትሪቨርስ ዝኾነ መወከሲ ወይ ኣብነት ኣጠቓቕማኦም ኣይረኸብኩን። ከም ውጽኢቱ ድማ ኣብዚ ኣጋጣሚ ርኽበታት ካብ ምውጻእ ክንቁጠብ ኢና። ወይ ድማ ከምቲ መብዛሕትኡ ግዜ ምሁራት ዝብልዎ: እዚ ልምምድ እዚ ንኣንባቢ እዩ ዝግደፍ። ብተወሳኺ፡ ነቲ ክሲ ወይ covariate information extraction ውን ዘሊልናዮ ኣለና፡ እዚ ድማ ንመጀመርታ ግዜ ምስ ርኽበታት ዝመሳሰል ይመስል።


እቲ ንሕብረተሰብ ጽማቕ ንምፍራይ እንጥቀመሉ ምልክት ብመጠኑ ቀጥታዊ እዩ፤


 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()


እቲ ዝተረፈ ነገር እንተሃልዩ ንውክልናታት ማሕበረሰብ ናብ ሕብረ-ቁጽሪ ምቕያር ጥራይ እዩ ንብዝሒ ቶከናት ንምንካይ ካብ JSON token overhead ብምውጋድን ነቲ ሰንሰለት ከም ፋንክሽን ምጥቕላልን እዩ፤


 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}


ሕጂ ንዝተመርጹ ደረጃታት ዝኸውን ጽማቕ ማሕበረሰብ ክንፈጥር ንኽእል ኢና። ሕጂ’ውን ንዝቐልጠፈ ምፍጻም ዝቐርቡ ጻውዒታት ንማዕረ ንገብሮ፤


 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())


ሓደ ዘይጠቐስክዎ መዳይ፡ እቶም ጸሓፍቲ፡ ሓበሬታ ማሕበረሰብ ኣብ ዘእትዉሉ እዋን፡ ልዕሊ ዓቐን ዓውደ-ጽሑፍ (context size) ምሕላፍ ክህሉ ዝኽእል ጉዳይ’ውን ይምልከቱ። ግራፍ እናሰፍሐ ምስ ከደ፡ እቶም ማሕበረሰባት እውን ብዓቢኡ ክዓብዩ ይኽእሉ። ኣብ ጉዳይና እቲ ዝዓበየ ማሕበረሰብ 545 ኣባላት ዝሓቖፈ እዩ። GPT-4o ልዕሊ 100,000 ቶከናት ዝዓቐኑ ዓውደ-ጽሑፍ ከም ዘለዎ ኣብ ግምት ብምእታው፡ ነዚ ስጉምቲ ክንዝልፎ ወሲንና።


ከም ናይ መወዳእታ ስጉምትና፡ እቶም ጽማቕ ሕብረተሰብ ናብቲ ዳታቤዝ ክንመልሶም ኢና፤


 graph.query(""" UNWIND $data AS row MERGE (c:__Community__ {id:row.community}) SET c.summary = row.summary """, params={"data": summaries})


ናይ መወዳእታ ኣቃውማ ግራፍ፤


ሕጂ እቲ ግራፍ እቶም መበቆላውያን ሰነዳት፡ ዝተቐድሑ ኣካላትን ዝምድናታትን፡ ከምኡ’ውን ስርዓተ-መሰረት ዘለዎ ኣቃውማ ማሕበረሰብን ጽማቕን ዝሓዘ እዩ።

መጠቃለሊ

ጸሓፍቲ ናይቲ “ካብ ከባብያዊ ናብ ዓለማዊ” ዝብል ጽሑፍ፡ ሓድሽ ኣገባብ ግራፍራግ ኣብ ምርኣይ ዓቢ ስራሕ ሰሪሖም እዮም። ካብ ዝተፈላለዩ ሰነዳት ዝረኸብናዮ ሓበሬታ ከመይ ጌርና ናብ ሓደ ስርዓተ-መሰረት ዘለዎ ናይ ፍልጠት ግራፍ ኣቃውማ ክንጥርንፍን ከነጠቓልልን ከም እንኽእል ዘርእዩ እዮም።


ሓደ ብግልፂ ዘይተጠቕሰ ነገር እንተሃልዩ ኣብ ግራፍ ዝተዋደደ ምንጪ መረዳእታ እውን ከነዋሃህዶ ንኽእል ኢና፤ እቲ ምእታው ግድን ኣብ ዘይተሃንጸ ጽሑፍ ጥራይ ክድረት የብሉን።


ብፍላይ ብዛዕባ ናይ ምውጻእ ኣገባቦም ዘድንቖ ነገር እንተሃልዩ፡ ንኽልቲኡ መስመራትን ዝምድናታትን መግለጺታት ምሓዞም እዩ። መግለጺታት ንLLM ንኹሉ ናብ ኖድ መለለዪታትን ዓይነታት ዝምድናታትን ጥራይ ካብ ምንካይ ዝያዳ ሓበሬታ ክዕቅብ የኽእሎ።


ብተወሳኺ፡ ኣብ ልዕሊ እቲ ጽሑፍ ሓደ ምውጻእ ምሕላፍ ንኹሉ ኣገዳሲ ሓበሬታ ከይሕዝ ከም ዝኽእልን ኣድላዪ እንተኾይኑ ድማ ብዙሕ ምሕላፍ ንምፍጻም ስነ-መጐት ከም ዘተኣታቱን የረድኡ። እቶም ጸሓፍቲ ብተወሳኺ ኣብ ልዕሊ ማሕበረሰባት ግራፍ ጽማቕ ንምፍጻም መሳጢ ሓሳብ የቕርቡ፣ እዚ ድማ ኣብ ብዙሓት ምንጪታት ዳታ ዝተሓጽረ እዋናዊ ሓበሬታ ክንሰፍርን ኢንዴክስ ክንገብርን የኽእለና።


ኣብ ዝቕጽል ጽሑፍ ብሎግ፡ ኣብ ውሽጢ ዓድን ዓለማውን ኣተገባብራታት ሰርች ሪትሪቨር ክንከይድ ኢና፡ ብዛዕባ ካልኦት ኣብቲ ዝተዋህበ ኣቃውማ ግራፍ ተመርኲስና ክንትግብሮ እንኽእል ኣገባባት ክንዛረብ ኢና።


ከም ወትሩ እቲ ኮድ ኣብ GitHub ይርከብ።


ኣብዚ ግዜ እዚ፡ ውጽኢት ክትድህስሱን ዝተፈላለዩ ናይ ሪትሪቨር ኣማራጺታት ክትፍትኑን ምእንቲ፡ ነቲ ዳታቤዝ ዳምፕ እውን ሰቒለዮ ኣለኹ።


ነዚ ዳምፕ ናብ ንዘልኣለም ነጻ ዝኾነ Neo4j AuraDB instance ውን ከተእትዎ ትኽእል ኢኻ , እዚ ድማ ነቶም ናይ ግራፍ ዳታ ሳይንስ ኣልጎሪዝም ስለዘየድልየና ንናይ ምምላስ ዳህሳስ ክንጥቀመሉ ንኽእል ኢና — ግራፍ ፓተርን ምትእስሳር ጥራይ፣ ቬክተር፣ ከምኡ’ውን ምሉእ-ጽሑፍ ኢንዴክስ።


ብዛዕባ ውህደት Neo4j ምስ ኩሎም GenAI frameworks ን ግብራዊ ግራፍ ኣልጎሪዝምን ኣብ መጽሓፈይ “Graph Algorithms for Data Science” ዝያዳ ፍለጥ።


ብዛዕባ እዚ ኣርእስቲ ዝያዳ ንምፍላጥ፡ ኣብቲ ንዕለት 7 ሕዳር ዝካየድ NODES 2024 ተጸንበሩና፡ እዚ ድማ ብዛዕባ በሊሕ ኣፕስ፡ ፍልጠት ግራፍን AIን ዝምልከት ነጻ ቨርቹዋል ዲቨሎፐር ዋዕላና እዩ። ሕጂ ተመዝገቡ !