mirror of
https://github.com/hwchase17/langchain
synced 2024-10-31 15:20:26 +00:00
87e502c6bc
Co-authored-by: jacoblee93 <jacoblee93@gmail.com> Co-authored-by: Harrison Chase <hw.chase.17@gmail.com>
401 lines
10 KiB
Plaintext
401 lines
10 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c94240f5",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Graph DB QA chain\n",
|
|
"\n",
|
|
"This notebook shows how to use LLMs to provide a natural language interface to a graph database you can query with the Cypher query language."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "dbc0ee68",
|
|
"metadata": {},
|
|
"source": [
|
|
"You will need to have a running Neo4j instance. One option is to create a [free Neo4j database instance in their Aura cloud service](https://neo4j.com/cloud/platform/aura-graph-database/). You can also run the database locally using the [Neo4j Desktop application](https://neo4j.com/download/), or running a docker container.\n",
|
|
"You can run a local docker container by running the executing the following script:\n",
|
|
"\n",
|
|
"```\n",
|
|
"docker run \\\n",
|
|
" --name neo4j \\\n",
|
|
" -p 7474:7474 -p 7687:7687 \\\n",
|
|
" -d \\\n",
|
|
" -e NEO4J_AUTH=neo4j/pleaseletmein \\\n",
|
|
" -e NEO4J_PLUGINS=\\[\\\"apoc\\\"\\] \\\n",
|
|
" neo4j:latest\n",
|
|
"```\n",
|
|
"\n",
|
|
"If you are using the docker container, you need to wait a couple of second for the database to start."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "62812aad",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langchain.chat_models import ChatOpenAI\n",
|
|
"from langchain.chains import GraphCypherQAChain\n",
|
|
"from langchain.graphs import Neo4jGraph"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "0928915d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"graph = Neo4jGraph(\n",
|
|
" url=\"bolt://localhost:7687\", username=\"neo4j\", password=\"pleaseletmein\"\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "995ea9b9",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Seeding the database\n",
|
|
"\n",
|
|
"Assuming your database is empty, you can populate it using Cypher query language. The following Cypher statement is idempotent, which means the database information will be the same if you run it one or multiple times."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "fedd26b9",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[]"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"graph.query(\n",
|
|
" \"\"\"\n",
|
|
"MERGE (m:Movie {name:\"Top Gun\"})\n",
|
|
"WITH m\n",
|
|
"UNWIND [\"Tom Cruise\", \"Val Kilmer\", \"Anthony Edwards\", \"Meg Ryan\"] AS actor\n",
|
|
"MERGE (a:Actor {name:actor})\n",
|
|
"MERGE (a)-[:ACTED_IN]->(m)\n",
|
|
"\"\"\"\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "58c1a8ea",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Refresh graph schema information\n",
|
|
"If the schema of database changes, you can refresh the schema information needed to generate Cypher statements."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "4e3de44f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"graph.refresh_schema()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "1fe76ccd",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
" Node properties are the following:\n",
|
|
" [{'properties': [{'property': 'name', 'type': 'STRING'}], 'labels': 'Movie'}, {'properties': [{'property': 'name', 'type': 'STRING'}], 'labels': 'Actor'}]\n",
|
|
" Relationship properties are the following:\n",
|
|
" []\n",
|
|
" The relationships are the following:\n",
|
|
" ['(:Actor)-[:ACTED_IN]->(:Movie)']\n",
|
|
" \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(graph.get_schema)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "68a3c677",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Querying the graph\n",
|
|
"\n",
|
|
"We can now use the graph cypher QA chain to ask question of the graph"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "7476ce98",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"chain = GraphCypherQAChain.from_llm(\n",
|
|
" ChatOpenAI(temperature=0), graph=graph, verbose=True\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "ef8ee27b",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n",
|
|
"Generated Cypher:\n",
|
|
"\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n",
|
|
"RETURN a.name\u001b[0m\n",
|
|
"Full Context:\n",
|
|
"\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]\u001b[0m\n",
|
|
"\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'Val Kilmer, Anthony Edwards, Meg Ryan, and Tom Cruise played in Top Gun.'"
|
|
]
|
|
},
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"chain.run(\"Who played in Top Gun?\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2d28c4df",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Limit the number of results\n",
|
|
"You can limit the number of results from the Cypher QA Chain using the `top_k` parameter.\n",
|
|
"The default is 10."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "df230946",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"chain = GraphCypherQAChain.from_llm(\n",
|
|
" ChatOpenAI(temperature=0), graph=graph, verbose=True, top_k=2\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "3f1600ee",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n",
|
|
"Generated Cypher:\n",
|
|
"\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n",
|
|
"RETURN a.name\u001b[0m\n",
|
|
"Full Context:\n",
|
|
"\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}]\u001b[0m\n",
|
|
"\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'Val Kilmer and Anthony Edwards played in Top Gun.'"
|
|
]
|
|
},
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"chain.run(\"Who played in Top Gun?\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "88c16206",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Return intermediate results\n",
|
|
"You can return intermediate steps from the Cypher QA Chain using the `return_intermediate_steps` parameter"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "e412f36b",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"chain = GraphCypherQAChain.from_llm(\n",
|
|
" ChatOpenAI(temperature=0), graph=graph, verbose=True, return_intermediate_steps=True\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "4f4699dc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n",
|
|
"Generated Cypher:\n",
|
|
"\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n",
|
|
"RETURN a.name\u001b[0m\n",
|
|
"Full Context:\n",
|
|
"\u001b[32;1m\u001b[1;3m[{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]\u001b[0m\n",
|
|
"\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
|
"Intermediate steps: [{'query': \"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\\nRETURN a.name\"}, {'context': [{'a.name': 'Val Kilmer'}, {'a.name': 'Anthony Edwards'}, {'a.name': 'Meg Ryan'}, {'a.name': 'Tom Cruise'}]}]\n",
|
|
"Final answer: Val Kilmer, Anthony Edwards, Meg Ryan, and Tom Cruise played in Top Gun.\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"result = chain(\"Who played in Top Gun?\")\n",
|
|
"print(f\"Intermediate steps: {result['intermediate_steps']}\")\n",
|
|
"print(f\"Final answer: {result['result']}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d6e1b054",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Return direct results\n",
|
|
"You can return direct results from the Cypher QA Chain using the `return_direct` parameter"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "2d3acf10",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"chain = GraphCypherQAChain.from_llm(\n",
|
|
" ChatOpenAI(temperature=0), graph=graph, verbose=True, return_direct=True\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "b0a9d143",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\n",
|
|
"Generated Cypher:\n",
|
|
"\u001b[32;1m\u001b[1;3mMATCH (a:Actor)-[:ACTED_IN]->(m:Movie {name: 'Top Gun'})\n",
|
|
"RETURN a.name\u001b[0m\n",
|
|
"\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[{'a.name': 'Val Kilmer'},\n",
|
|
" {'a.name': 'Anthony Edwards'},\n",
|
|
" {'a.name': 'Meg Ryan'},\n",
|
|
" {'a.name': 'Tom Cruise'}]"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"chain.run(\"Who played in Top Gun?\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "74d0a36f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.8.8"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|