Added dynamic graph creation
This commit is contained in:
parent
b7cf9a69b2
commit
749689f588
2 changed files with 69 additions and 31 deletions
26
README.md
26
README.md
|
|
@ -124,6 +124,30 @@ Blog post: [Link](https://topoteretes.notion.site/Going-beyond-Langchain-Weaviat
|
||||||
- API
|
- API
|
||||||
- Superset to visualize the results
|
- Superset to visualize the results
|
||||||
|
|
||||||
|
#### Level 4 - Dynamic Graph Memory Manager + DB + Rag Test Manager
|
||||||
|
Scope: Use Neo4j to map the user queries into a knowledge graph based on cognitive architecture
|
||||||
|
Blog post: Soon!
|
||||||
|
- Dynamic Memory Manager -> store the data in N hierarchical stores
|
||||||
|
- Dynamic Graph -> map the user queries into a knowledge graph
|
||||||
|
- Postgres DB to store metadata - soon
|
||||||
|
- Docker
|
||||||
|
- API - soon
|
||||||
|
|
||||||
|
### Run the level 4
|
||||||
|
|
||||||
|
Make sure you have Docker, Poetry, and Python 3.11 installed and postgres installed.
|
||||||
|
|
||||||
|
Copy the .env.example to .env and fill in the variables
|
||||||
|
|
||||||
|
``` poetry shell ```
|
||||||
|
|
||||||
|
```docker compose up ```
|
||||||
|
|
||||||
|
Run
|
||||||
|
|
||||||
|
``` python main.py ```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Run the level 3
|
### Run the level 3
|
||||||
|
|
||||||
|
|
@ -140,6 +164,8 @@ Copy the .env.template to .env and fill in the variables
|
||||||
Specify the environment variable in the .env file to "docker"
|
Specify the environment variable in the .env file to "docker"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Launch the docker image:
|
Launch the docker image:
|
||||||
|
|
||||||
```docker compose up promethai_mem ```
|
```docker compose up promethai_mem ```
|
||||||
|
|
|
||||||
|
|
@ -86,26 +86,38 @@ def generate_graph(input) -> KnowledgeGraph:
|
||||||
"content": f"""Use the given format to extract information from the following input: {input}. """,
|
"content": f"""Use the given format to extract information from the following input: {input}. """,
|
||||||
|
|
||||||
},
|
},
|
||||||
{ "role":"system", "content": """You are a top-tier algorithm designed for extracting information in structured formats to build a knowledge graph.
|
{ "role":"system", "content": """You are a top-tier algorithm
|
||||||
|
designed for extracting information in structured formats to build a knowledge graph.
|
||||||
- **Nodes** represent entities and concepts. They're akin to Wikipedia nodes.
|
- **Nodes** represent entities and concepts. They're akin to Wikipedia nodes.
|
||||||
- The aim is to achieve simplicity and clarity in the knowledge graph, making it accessible for a vast audience.
|
- The aim is to achieve simplicity and clarity in the
|
||||||
|
knowledge graph, making it accessible for a vast audience.
|
||||||
## 2. Labeling Nodes
|
## 2. Labeling Nodes
|
||||||
- **Consistency**: Ensure you use basic or elementary types for node labels.
|
- **Consistency**: Ensure you use basic or elementary types for node labels.
|
||||||
- For example, when you identify an entity representing a person, always label it as **"person"**. Avoid using more specific terms like "mathematician" or "scientist".
|
- For example, when you identify an entity representing a person,
|
||||||
|
always label it as **"person"**.
|
||||||
|
Avoid using more specific terms like "mathematician" or "scientist".
|
||||||
- Include event, entity, time, or action nodes to the category.
|
- Include event, entity, time, or action nodes to the category.
|
||||||
- Classify the memory type as episodic or semantic.
|
- Classify the memory type as episodic or semantic.
|
||||||
- **Node IDs**: Never utilize integers as node IDs. Node IDs should be names or human-readable identifiers found in the text.
|
- **Node IDs**: Never utilize integers as node IDs.
|
||||||
|
Node IDs should be names or human-readable identifiers found in the text.
|
||||||
## 3. Handling Numerical Data and Dates
|
## 3. Handling Numerical Data and Dates
|
||||||
- Numerical data, like age or other related information, should be incorporated as attributes or properties of the respective nodes.
|
- Numerical data, like age or other related information,
|
||||||
- **No Separate Nodes for Dates/Numbers**: Do not create separate nodes for dates or numerical values. Always attach them as attributes or properties of nodes.
|
should be incorporated as attributes or properties of the respective nodes.
|
||||||
|
- **No Separate Nodes for Dates/Numbers**:
|
||||||
|
Do not create separate nodes for dates or numerical values.
|
||||||
|
Always attach them as attributes or properties of nodes.
|
||||||
- **Property Format**: Properties must be in a key-value format.
|
- **Property Format**: Properties must be in a key-value format.
|
||||||
- **Quotation Marks**: Never use escaped single or double quotes within property values.
|
- **Quotation Marks**: Never use escaped single or double quotes within property values.
|
||||||
- **Naming Convention**: Use camelCase for property keys, e.g., `birthDate`.
|
- **Naming Convention**: Use camelCase for property keys, e.g., `birthDate`.
|
||||||
## 4. Coreference Resolution
|
## 4. Coreference Resolution
|
||||||
- **Maintain Entity Consistency**: When extracting entities, it's vital to ensure consistency.
|
- **Maintain Entity Consistency**:
|
||||||
If an entity, such as "John Doe", is mentioned multiple times in the text but is referred to by different names or pronouns (e.g., "Joe", "he"),
|
When extracting entities, it's vital to ensure consistency.
|
||||||
always use the most complete identifier for that entity throughout the knowledge graph. In this example, use "John Doe" as the entity ID.
|
If an entity, such as "John Doe", is mentioned multiple times
|
||||||
Remember, the knowledge graph should be coherent and easily understandable, so maintaining consistency in entity references is crucial.
|
in the text but is referred to by different names or pronouns (e.g., "Joe", "he"),
|
||||||
|
always use the most complete identifier for that entity throughout the knowledge graph.
|
||||||
|
In this example, use "John Doe" as the entity ID.
|
||||||
|
Remember, the knowledge graph should be coherent and easily understandable,
|
||||||
|
so maintaining consistency in entity references is crucial.
|
||||||
## 5. Strict Compliance
|
## 5. Strict Compliance
|
||||||
Adhere to the rules strictly. Non-compliance will result in termination."""}
|
Adhere to the rules strictly. Non-compliance will result in termination."""}
|
||||||
],
|
],
|
||||||
|
|
@ -331,27 +343,27 @@ if __name__ == "__main__":
|
||||||
# out = knowledge_graph.dict()
|
# out = knowledge_graph.dict()
|
||||||
# print(out)
|
# print(out)
|
||||||
#
|
#
|
||||||
# graph: KnowledgeGraph = generate_graph("I walked in the forest yesterday and added to my list I need to buy some milk in the store")
|
graph: KnowledgeGraph = generate_graph("I walked in the forest yesterday and added to my list I need to buy some milk in the store")
|
||||||
# graph_dic = graph.dict()
|
graph_dic = graph.dict()
|
||||||
#
|
|
||||||
# node_variable_mapping = create_node_variable_mapping(graph_dic['nodes'])
|
node_variable_mapping = create_node_variable_mapping(graph_dic['nodes'])
|
||||||
# edge_variable_mapping = create_edge_variable_mapping(graph_dic['edges'])
|
edge_variable_mapping = create_edge_variable_mapping(graph_dic['edges'])
|
||||||
# # Create unique variable names for each node
|
# Create unique variable names for each node
|
||||||
# unique_node_variable_mapping = append_uuid_to_variable_names(node_variable_mapping)
|
unique_node_variable_mapping = append_uuid_to_variable_names(node_variable_mapping)
|
||||||
# unique_edge_variable_mapping = append_uuid_to_variable_names(edge_variable_mapping)
|
unique_edge_variable_mapping = append_uuid_to_variable_names(edge_variable_mapping)
|
||||||
# create_nodes_statements = generate_create_statements_for_nodes_with_uuid(graph_dic['nodes'], unique_node_variable_mapping)
|
create_nodes_statements = generate_create_statements_for_nodes_with_uuid(graph_dic['nodes'], unique_node_variable_mapping)
|
||||||
# create_edges_statements = generate_create_statements_for_edges_with_uuid(graph_dic['edges'], unique_node_variable_mapping)
|
create_edges_statements = generate_create_statements_for_edges_with_uuid(graph_dic['edges'], unique_node_variable_mapping)
|
||||||
#
|
|
||||||
# memory_type_statements_with_uuid_and_time_context = generate_memory_type_relationships_with_uuid_and_time_context(
|
memory_type_statements_with_uuid_and_time_context = generate_memory_type_relationships_with_uuid_and_time_context(
|
||||||
# graph_dic['nodes'], unique_node_variable_mapping)
|
graph_dic['nodes'], unique_node_variable_mapping)
|
||||||
#
|
|
||||||
# # # Combine all statements
|
# # Combine all statements
|
||||||
# cypher_statements = [create_base_queries_from_user(user_id)] + create_nodes_statements + create_edges_statements + memory_type_statements_with_uuid_and_time_context
|
cypher_statements = [create_base_queries_from_user(user_id)] + create_nodes_statements + create_edges_statements + memory_type_statements_with_uuid_and_time_context
|
||||||
# cypher_statements_joined = "\n".join(cypher_statements)
|
cypher_statements_joined = "\n".join(cypher_statements)
|
||||||
#
|
|
||||||
# print(cypher_statements_joined)
|
|
||||||
#
|
|
||||||
# execute_cypher_query(cypher_statements_joined)
|
execute_cypher_query(cypher_statements_joined)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue