paint-brush
ዲቃላ RAG ወኪል በNeo4j Graphs እና Milvus Vector ፍለጋ መገንባት@neo4j
507 ንባቦች
507 ንባቦች

ዲቃላ RAG ወኪል በNeo4j Graphs እና Milvus Vector ፍለጋ መገንባት

Neo4j8m2024/11/05
Read on Terminal Reader

በጣም ረጅም፤ ማንበብ

ይህ መመሪያ ሁለቱንም የግራፍ እና የቬክተር ዳታቤዞችን ለመጠቀም Neo4j እና Milvusን በመጠቀም የተዳቀለ የ RAG ወኪል መገንባትን ይዳስሳል፣ የምላሽ ትክክለኛነትን እና ተዛማጅነትን በተጣመሩ የፍለጋ ዘዴዎች እና ራስን የማረም ዘዴዎች።
featured image - ዲቃላ RAG ወኪል በNeo4j Graphs እና Milvus Vector ፍለጋ መገንባት
Neo4j HackerNoon profile picture
0-item
1-item


ይህ የብሎግ ልጥፍ የNeo4j ግራፍ ዳታቤዝ እና ሚልቪስ ቬክተር ዳታቤዝ በመጠቀም የግራፍRAG ወኪል እንዴት እንደሚገነባ በዝርዝር ይገልጻል። ይህ ወኪል ለተጠቃሚ ጥያቄዎች ትክክለኛ እና ተዛማጅ መልሶችን ለመስጠት የግራፍ ዳታቤዝ እና የቬክተር ፍለጋ ሃይልን ያጣምራል። በዚህ ምሳሌ፣ LangGraph፣ Llama 3.1 8B ከኦላማ እና GPT-4o ጋር እንጠቀማለን።


የባህላዊ መልሶ ማግኛ የተሻሻለ ትውልድ ( RAG ) ሲስተሞች የሚመሰረቱት በ ላይ ብቻ ነው። የቬክተር ዳታቤዝ ተዛማጅ ሰነዶችን ለማውጣት. የኛ አካሄዳችን በይበልጥ የሚሄደው ኒዮ4ጄን በማካተት በህጋዊ አካላት እና በፅንሰ-ሀሳቦች መካከል ያለውን ግንኙነት ለመያዝ፣ የመረጃውን የበለጠ ግንዛቤን በመስጠት ነው። እነዚህን ሁለት ቴክኒኮች በማጣመር የበለጠ ጠንካራ እና መረጃ ሰጪ RAG ስርዓት መፍጠር እንፈልጋለን።

የ RAG ወኪል መገንባት

ወኪላችን ሶስት ቁልፍ ፅንሰ-ሀሳቦችን ይከተላል፡ ማዘዋወር፣ መመለሻ ዘዴዎች እና ራስን ማስተካከል። እነዚህ መርሆዎች በተከታታይ LangGraph ክፍሎች ይተገበራሉ፡


  • ማዘዋወር - የተወሰነ የማዞሪያ ዘዴ በጥያቄው ላይ በመመስረት የቬክተር ዳታቤዝ፣ የእውቀት ግራፍ ወይም የሁለቱም ጥምረት ለመጠቀም ይወስናል።
  • መውደቅ - የመነሻ መልሶ ማግኘቱ በቂ ባልሆነበት ሁኔታ ወኪሉ Tavilyን በመጠቀም ወደ ድር ፍለጋ ይመለሳል።
  • እራስን ማረም - ወኪሉ የራሱን መልሶች ይገመግማል እና ቅዠቶችን ወይም ስህተቶችን ለማስተካከል ይሞክራል.


እንደሚከተሉት ያሉ ሌሎች አካላት አሉን ።


  • መልሶ ማግኘት – ሚልቩስን የምንጠቀመው ክፍት ምንጭ እና ከፍተኛ አፈጻጸም ያለው የቬክተር ዳታቤዝ፣ የሰነድ ቁርጥራጮችን ለማከማቸት እና ለማውጣት ከተጠቃሚው ጥያቄ ጋር በፍቺ ተመሳሳይነት ላይ ነው።
  • የግራፍ ማሻሻያ - Neo4j ከተገኙት ሰነዶች የእውቀት ግራፍ ለመገንባት ጥቅም ላይ ይውላል, አውድ በግንኙነቶች እና አካላት ያበለጽጋል.
  • LLMs ውህደት – Llama 3.1 8B፣ የአገር ውስጥ LLM፣ መልሶችን ለማመንጨት እና የተገኘውን መረጃ አግባብነት እና ትክክለኛነት ለመገምገም የሚያገለግል ሲሆን GPT-4o ደግሞ በNeo4j የሚጠቀመውን የሳይፈር ቋንቋ ለመፍጠር ይጠቅማል።

የ GraphRAG አርክቴክቸር

የግራፍRAG ወኪላችን አርክቴክቸር እንደ የስራ ፍሰት ከብዙ ተያያዥ አንጓዎች ጋር ሊታይ ይችላል፡


  • የጥያቄ ማዘዋወር - ተወካዩ ከሁሉ የተሻለውን የመልሶ ማግኛ ስልት (የቬክተር ፍለጋ፣ የግራፍ ፍለጋ ወይም ሁለቱንም) ለመወሰን በመጀመሪያ ጥያቄውን ይመረምራል።
  • መልሶ ማግኘት - በማዞሪያው ውሳኔ ላይ በመመስረት, ተዛማጅ ሰነዶች ከ Milvus ተሰርስረዋል, ወይም መረጃ ከ Neo4j ግራፍ ይወጣል.
  • ትውልድ - LLM የተገኘውን አውድ በመጠቀም መልስ ያመነጫል።
  • ግምገማ - ተወካዩ የመነጨውን መልስ ለተዛማጅነት፣ ትክክለኛነት እና እምቅ ቅዠቶች ይገመግማል።
  • ማሻሻያ (አስፈላጊ ከሆነ) - መልሱ አጥጋቢ አይደለም ተብሎ ከታሰበ ተወካዩ ፍለጋውን ሊያሻሽል ወይም ስህተቶችን ለማስተካከል ሊሞክር ይችላል።

የኤጀንቶች ምሳሌዎች

የኤልኤልኤም ወኪሎቻችንን አቅም ለማሳየት ወደ ሁለት የተለያዩ ክፍሎች እንይ Graph Generation እና Composite Agent

ሙሉው ኮድ በዚህ ልጥፍ ግርጌ ላይ የሚገኝ ቢሆንም፣ እነዚህ ቅንጥቦች እነዚህ ወኪሎች በ LangChain ማዕቀፍ ውስጥ እንዴት እንደሚሠሩ የተሻለ ግንዛቤን ይሰጣሉ።

ግራፍ ማመንጨት

ይህ አካል የተነደፈው የNeo4jን አቅም በመጠቀም የጥያቄ-መልስ ሂደቱን ለማሻሻል ነው። በNeo4j ግራፍ ዳታቤዝ ውስጥ የተካተተውን እውቀት በመጠቀም ጥያቄዎችን ይመልሳል። እንዴት እንደሚሰራ እነሆ፡-


  1. GraphCypherQAChain - LLM ከNeo4j ግራፍ ዳታቤዝ ጋር መስተጋብር ለመፍጠር ይፈቅዳል። LLMን በሁለት መንገዶች ይጠቀማል።

    • cypher_llm - ይህ የኤልኤልኤም ምሳሌ በተጠቃሚው ጥያቄ መሰረት ተዛማጅ መረጃዎችን ከግራፉ ለማውጣት የCypher መጠይቆችን የማመንጨት ሃላፊነት አለበት።

    • ማረጋገጫ - የሳይፈር መጠይቆች በአገባብ ትክክል መሆናቸውን ለማረጋገጥ መረጋገጡን ያረጋግጣል።


  2. አውድ ሰርስሮ ማውጣት - አስፈላጊውን አውድ ለማውጣት የተረጋገጡ መጠይቆች በNeo4j ግራፍ ላይ ይፈጸማሉ።


  3. መልስ ማመንጨት – የቋንቋው ሞዴል ለተጠቃሚው ጥያቄ መልስ ለማመንጨት የተገኘውን አውድ ይጠቀማል።


 ### Generate Cypher Query llm = ChatOllama(model=local_llm, temperature=0) # Chain graph_rag_chain = GraphCypherQAChain.from_llm( cypher_llm=llm, qa_llm=llm, validate_cypher=True, graph=graph, verbose=True, return_intermediate_steps=True, return_direct=True, ) # Run question = "agent memory" generation = graph_rag_chain.invoke({"query": question})


ይህ አካል የ RAG ስርዓት ወደ Neo4j እንዲገባ ያስችለዋል፣ ይህም የበለጠ አጠቃላይ እና ትክክለኛ መልሶችን ለመስጠት ይረዳል።

የተዋሃደ ወኪል፣ ግራፍ እና ቬክተር 🪄

አስማት የሚሆነው እዚህ ላይ ነው፡ ወኪላችን ሚልቩስ እና ኒዮ 4ጅ ውጤቶችን በማጣመር መረጃውን በተሻለ ሁኔታ ለመረዳት እና ይበልጥ ትክክለኛ እና ግልጽ የሆኑ መልሶችን ለማግኘት ያስችላል። እንዴት እንደሚሰራ እነሆ፡-


  1. መጠየቂያዎች - ጥያቄውን ለመመለስ LLM ከሁለቱም Milvus እና Neo4j አውድ እንዲጠቀም የሚያስተምር ጥያቄን እንገልፃለን።
  2. መልሶ ማግኘት - ወኪሉ ተዛማጅ መረጃዎችን ከ ሚልቩስ (የቬክተር ፍለጋን በመጠቀም) እና Neo4j (ግራፍ ማመንጨትን በመጠቀም) ያወጣል።
  3. መልስ ማመንጨት -ላማ 3.1 8ቢ ጥያቄውን በማካሄድ አጭር መልስ ያመነጫል፣ ከቬክተር እና ከግራፍ ዳታቤዝ የተገኘውን ጥምር እውቀት በተቀነባበረ ሰንሰለት በመጠቀም።


 ### Composite Vector + Graph Generations cypher_prompt = PromptTemplate( template="""You are an expert at generating Cypher queries for Neo4j. Use the following schema to generate a Cypher query that answers the given question. Make the query flexible by using case-insensitive matching and partial string matching where appropriate. Focus on searching paper titles as they contain the most relevant information. Schema: {schema} Question: {question} Cypher Query:""", input_variables=["schema", "question"], )



 # QA prompt qa_prompt = PromptTemplate( template="""You are an assistant for question-answering tasks. Use the following Cypher query results to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise. If topic information is not available, focus on the paper titles. Question: {question} Cypher Query: {query} Query Results: {context} Answer:""", input_variables=["question", "query", "context"], ) llm = ChatOpenAI(model="gpt-4o", temperature=0)


 # Chain graph_rag_chain = GraphCypherQAChain.from_llm( cypher_llm=llm, qa_llm=llm, validate_cypher=True, graph=graph, verbose=True, return_intermediate_steps=True, return_direct=True, cypher_prompt=cypher_prompt, qa_prompt=qa_prompt, )


የጥናት ወረቀት ግኝታችንን ለማሳደግ የግራፍ እና የቬክተር ዳታቤዝ ጥንካሬዎችን በማጣመር የፍለጋ ውጤቱን እንይ።


Neo4jን በመጠቀም በግራፍ ፍለጋ እንጀምራለን-


 # Example input data question = "What paper talks about Multi-Agent?" generation = graph_rag_chain.invoke({"query": question}) print(generation)


 > Entering new GraphCypherQAChain chain... Generated Cypher: cypher MATCH (p:Paper) WHERE toLower(p.title) CONTAINS toLower("Multi-Agent") RETURN p.title AS PaperTitle, p.summary AS Summary, p.url AS URL


 > Finished chain. {'query': 'What paper talks about Multi-Agent?', 'result': [{'PaperTitle': 'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary': 'In this work, we aim to push the upper bound of the reasoning capability of LLMs by proposing a collaborative multi-agent, multi-reasoning-path (CoMM) prompting framework. Specifically, we prompt LLMs to play different roles in a problem-solving team, and encourage different role-play agents to collaboratively solve the target task. In particular, we discover that applying different reasoning paths for different roles is an effective strategy to implement few-shot prompting approaches in the multi-agent scenarios. Empirical results demonstrate the effectiveness of the proposed methods on two college-level science problems over competitive baselines. Our further analysis shows the necessity of prompting LLMs to play different roles or experts independently.', 'URL': 'https://github.com/amazon-science/comm-prompt'}]


የግራፍ ፍለጋ ግንኙነቶችን እና ዲበ ውሂብን በማግኘት የላቀ ነው። በአርእስቶች፣ ደራሲያን ወይም አስቀድሞ የተገለጹ ምድቦች ላይ ተመስርተው ወረቀቶችን በፍጥነት መለየት ይችላል፣ ይህም የመረጃውን የተዋቀረ እይታ ያቀርባል።


በመቀጠል፣ ለተለየ እይታ ወደ ቬክተር ፍለጋ እንሸጋገራለን፡


 # Example input data question = "What paper talks about Multi-Agent?" # Get vector + graph answers docs = retriever.invoke(question) vector_context = rag_chain.invoke({"context": docs, "question": question})


 > The paper discusses "Adaptive In-conversation Team Building for Language Model Agents" and talks about Multi-Agent. It presents a new adaptive team-building paradigm that offers a flexible solution for building teams of LLM agents to solve complex tasks effectively. The approach, called Captain Agent, dynamically forms and manages teams for each step of the task-solving process, utilizing nested group conversations and reflection to ensure diverse expertise and prevent stereotypical outputs.


የቬክተር ፍለጋ አውድ እና የትርጉም መመሳሰልን በመረዳት ረገድ ጥሩ ነው። ከጥያቄው ጋር በፅንሰ-ሀሳብ የተገናኙ ወረቀቶችን ሊገልጥ ይችላል፣ ምንም እንኳን የፍለጋ ቃላቶቹን በግልፅ ባይይዙም።


በመጨረሻም ሁለቱንም የፍለጋ ዘዴዎች አጣምረናል፡-


ይህ የ RAG ወኪላችን ወሳኝ አካል ነው፣ ይህም ሁለቱንም የቬክተር እና የግራፍ ዳታቤዝ መጠቀም ያስችላል።


 composite_chain = prompt | llm | StrOutputParser() answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context}) print(answer)


 > The paper "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework" talks about Multi-Agent. It proposes a framework that prompts LLMs to play different roles in a problem-solving team and encourages different role-play agents to collaboratively solve the target task. The paper presents empirical results demonstrating the effectiveness of the proposed methods on two college-level science problems.


የግራፍ እና የቬክተር ፍለጋዎችን በማዋሃድ የሁለቱም አቀራረቦችን ጥንካሬዎች እንጠቀማለን። የግራፍ ፍለጋው ትክክለኛነትን ያቀርባል እና የተዋቀሩ ግንኙነቶችን ይዳስሳል, የቬክተር ፍለጋ ደግሞ በፍቺ ግንዛቤ ውስጥ ጥልቀት ይጨምራል.


ይህ የተዋሃደ ዘዴ በርካታ ጥቅሞችን ይሰጣል-


  1. የተሻሻለ ማስታወስ ፡ በሁለቱም ዘዴዎች ብቻ ሊያመልጡ የሚችሉ ተዛማጅ ወረቀቶችን ያገኛል።
  2. የተሻሻለ ዐውደ -ጽሑፍ፡ ወረቀቶች እርስ በርስ እንዴት እንደሚዛመዱ የበለጠ ግልጽ የሆነ ግንዛቤን ይሰጣል።
  3. ተለዋዋጭነት ፡ ከተወሰኑ የቁልፍ ቃል ፍለጋዎች እስከ ሰፊ ፅንሰ-ሃሳባዊ ዳሰሳዎች ከተለያዩ የጥያቄ አይነቶች ጋር መላመድ ይችላል።

ማጠቃለል

በዚህ ብሎግ ልኡክ ጽሁፍ ኒዮ4ጅ እና ሚልቩስን በመጠቀም የግራፍRAG ወኪል እንዴት እንደሚገነባ አሳይተናል። የግራፍ ዳታቤዝ እና የቬክተር ፍለጋ ጥንካሬዎችን በማጣመር ይህ ወኪል ለተጠቃሚ ጥያቄዎች ትክክለኛ እና ተገቢ መልሶችን ይሰጣል።


የRAG ወኪላችን አርክቴክቸር፣ የራሱ የሆነ የማዘዋወር፣ የመውደቅ ስልቶች እና ራስን የማረም ችሎታዎች ያለው፣ ጠንካራ እና አስተማማኝ ያደርገዋል። የግራፍ ጄኔሬሽን እና የተዋሃዱ ወኪል ክፍሎች ምሳሌዎች ይህ ወኪል አጠቃላይ እና የተወሳሰቡ መልሶችን ለመስጠት ሁለቱንም የቬክተር እና የግራፍ ዳታቤዝ ውስጥ እንዴት ማግኘት እንደሚችል ያሳያሉ።


ይህ መመሪያ አጋዥ እንደሆነ ተስፋ እናደርጋለን እና በራስዎ ፕሮጀክቶች ውስጥ የግራፍ ዳታቤዝ እና የቬክተር ፍለጋን የማጣመር እድሎችን እንዲመለከቱ ያነሳሳዎታል።


የአሁኑ ኮድ በ GitHub ላይ ይገኛል።


ስለዚህ ርዕስ የበለጠ ለማወቅ፣ በኖቬምበር 7 በNODES 2024 ይቀላቀሉን፣ በማሰብ ችሎታ መተግበሪያዎች፣ የእውቀት ግራፎች እና AI ላይ ያለን ነፃ ምናባዊ ገንቢ ኮንፈረንስ። አሁን ይመዝገቡ!