forked from Archives/langchain
Compare commits
1 Commits
main
...
harrison/s
Author | SHA1 | Date | |
---|---|---|---|
|
3665c98158 |
@ -21,7 +21,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 1,
|
"execution_count": 8,
|
||||||
"id": "ac561cc4",
|
"id": "ac561cc4",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@ -32,7 +32,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 2,
|
"execution_count": 9,
|
||||||
"id": "07e96d99",
|
"id": "07e96d99",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@ -43,16 +43,16 @@
|
|||||||
"db = SQLDatabase.from_uri(\"sqlite:///../../../notebooks/Chinook.db\")\n",
|
"db = SQLDatabase.from_uri(\"sqlite:///../../../notebooks/Chinook.db\")\n",
|
||||||
"db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)\n",
|
"db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)\n",
|
||||||
"tools = [\n",
|
"tools = [\n",
|
||||||
" Tool(\n",
|
"# Tool(\n",
|
||||||
" name = \"Search\",\n",
|
"# name = \"Search\",\n",
|
||||||
" func=search.run,\n",
|
"# func=search.run,\n",
|
||||||
" description=\"useful for when you need to answer questions about current events\"\n",
|
"# description=\"useful for when you need to answer questions about current events\"\n",
|
||||||
" ),\n",
|
"# ),\n",
|
||||||
" Tool(\n",
|
"# Tool(\n",
|
||||||
" name=\"Calculator\",\n",
|
"# name=\"Calculator\",\n",
|
||||||
" func=llm_math_chain.run,\n",
|
"# func=llm_math_chain.run,\n",
|
||||||
" description=\"useful for when you need to answer questions about math\"\n",
|
"# description=\"useful for when you need to answer questions about math\"\n",
|
||||||
" ),\n",
|
"# ),\n",
|
||||||
" Tool(\n",
|
" Tool(\n",
|
||||||
" name=\"FooBar DB\",\n",
|
" name=\"FooBar DB\",\n",
|
||||||
" func=db_chain.run,\n",
|
" func=db_chain.run,\n",
|
||||||
@ -63,7 +63,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 3,
|
"execution_count": 10,
|
||||||
"id": "a069c4b6",
|
"id": "a069c4b6",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@ -71,6 +71,153 @@
|
|||||||
"mrkl = initialize_agent(tools, llm, agent=\"zero-shot-react-description\", verbose=True)"
|
"mrkl = initialize_agent(tools, llm, agent=\"zero-shot-react-description\", verbose=True)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "356a1396",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
||||||
|
"What was our total number of sales and total revenue in 2013?\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find out how many sales and how much revenue we had in 2013\n",
|
||||||
|
"Action: FooBar DB\n",
|
||||||
|
"Action Input: sales 2013\u001b[0m\n",
|
||||||
|
"\n",
|
||||||
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
||||||
|
"sales 2013\n",
|
||||||
|
"SQLQuery:\u001b[32;1m\u001b[1;3m SELECT SUM(Total) FROM Invoice WHERE InvoiceDate BETWEEN '2013-01-01' AND '2013-12-31'\u001b[0m\n",
|
||||||
|
"SQLResult: \u001b[33;1m\u001b[1;3m[(450.58000000000027,)]\u001b[0m\n",
|
||||||
|
"Answer:\u001b[32;1m\u001b[1;3m 450.58\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||||||
|
"\n",
|
||||||
|
"Observation: \u001b[36;1m\u001b[1;3m 450.58\u001b[0m\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find out how many sales and how much revenue we had in 2013\n",
|
||||||
|
"Action: FooBar DB\n",
|
||||||
|
"Action Input: revenue 2013\u001b[0m\n",
|
||||||
|
"\n",
|
||||||
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
||||||
|
"revenue 2013\n",
|
||||||
|
"SQLQuery:\u001b[32;1m\u001b[1;3m SELECT SUM(Total) FROM Invoice WHERE strftime('%Y', InvoiceDate) = '2013'\u001b[0m\n",
|
||||||
|
"SQLResult: \u001b[33;1m\u001b[1;3m[(450.58000000000027,)]\u001b[0m\n",
|
||||||
|
"Answer:\u001b[32;1m\u001b[1;3m 450.58\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||||||
|
"\n",
|
||||||
|
"Observation: \u001b[36;1m\u001b[1;3m 450.58\u001b[0m\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
||||||
|
"Final Answer: We had 450.58 sales and 450.58 revenue in 2013\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"'We had 450.58 sales and 450.58 revenue in 2013'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"mrkl.run(\"What was our total number of sales and total revenue in 2013?\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 18,
|
||||||
|
"id": "4e9c9b23",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"from langchain.agents import ZeroShotAgent\n",
|
||||||
|
"from langchain import PromptTemplate\n",
|
||||||
|
"from langchain import LLMChain\n",
|
||||||
|
"TEMPLATE = \"\"\"You are a data engineer answering questions using a SQL database.\n",
|
||||||
|
"\n",
|
||||||
|
"Given an input question, first create a syntactically correct {dialect} query to run, then look at the results of the query and return the answer. If a previous query produced an error, do NOT try it again.\n",
|
||||||
|
"\n",
|
||||||
|
"Only use the following tables:\n",
|
||||||
|
"\n",
|
||||||
|
"{table_info}\n",
|
||||||
|
"\n",
|
||||||
|
"Use the following format:\n",
|
||||||
|
"\n",
|
||||||
|
"Question: the input question you must answer\n",
|
||||||
|
"Thought: you should always think about what to do\n",
|
||||||
|
"Action: SQLDB\n",
|
||||||
|
"Action Input: the query to run against the SQL database\n",
|
||||||
|
"Observation: the result of the action\n",
|
||||||
|
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
|
||||||
|
"Thought: I now know the final answer\n",
|
||||||
|
"Final Answer: the final answer to the original input question\n",
|
||||||
|
"\n",
|
||||||
|
"Begin!\n",
|
||||||
|
"\n",
|
||||||
|
"Question: {{input}}\"\"\".format(**{\n",
|
||||||
|
" \"dialect\": db.dialect,\n",
|
||||||
|
" \"table_info\": db.table_info})\n",
|
||||||
|
"prompt = PromptTemplate(template=TEMPLATE, input_variables=[\"input\"])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 19,
|
||||||
|
"id": "a6fb1b4f",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"llm_chain = LLMChain(llm=llm, prompt=prompt)\n",
|
||||||
|
"tools = [\n",
|
||||||
|
" Tool(\"SQLDB\", db.run, \"foo\")\n",
|
||||||
|
"]\n",
|
||||||
|
"agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 20,
|
||||||
|
"id": "64578802",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
||||||
|
"What was our total number of sales and total revenue in 2013?\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find the total number of sales and total revenue\n",
|
||||||
|
"Action: SQLDB\n",
|
||||||
|
"Action Input: SELECT SUM(Total) AS \"Total Sales\", SUM(Total) AS \"Total Revenue\" FROM Invoice WHERE InvoiceDate LIKE '2013%'\u001b[0m\n",
|
||||||
|
"Observation: \u001b[36;1m\u001b[1;3m[(450.58000000000027, 450.58000000000027)]\u001b[0m\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
||||||
|
"Final Answer: 450.58\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"'450.58'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 20,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"agent.run(\"What was our total number of sales and total revenue in 2013?\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 4,
|
"execution_count": 4,
|
||||||
|
22
langchain/agents/sql_agent.py
Normal file
22
langchain/agents/sql_agent.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
TEMPLATE = """You are a data engineer answering questions using a SQL database.
|
||||||
|
|
||||||
|
Given an input question, first create a syntactically correct {dialect} query to run, then look at the results of the query and return the answer.
|
||||||
|
|
||||||
|
Only use the following tables:
|
||||||
|
|
||||||
|
{table_info}
|
||||||
|
|
||||||
|
Use the following format:
|
||||||
|
|
||||||
|
Question: the input question you must answer
|
||||||
|
Thought: you should always think about what to do
|
||||||
|
Action: SQLDB
|
||||||
|
Action Input: the query to run against the SQL database
|
||||||
|
Observation: the result of the action
|
||||||
|
... (this Thought/Action/Action Input/Observation can repeat N times)
|
||||||
|
Thought: I now know the final answer
|
||||||
|
Final Answer: the final answer to the original input question
|
||||||
|
|
||||||
|
Begin!
|
||||||
|
|
||||||
|
Question: {input}"""
|
@ -64,7 +64,10 @@ class SQLDatabaseChain(Chain, BaseModel):
|
|||||||
}
|
}
|
||||||
sql_cmd = llm_chain.predict(**llm_inputs)
|
sql_cmd = llm_chain.predict(**llm_inputs)
|
||||||
chained_input.add(sql_cmd, color="green")
|
chained_input.add(sql_cmd, color="green")
|
||||||
result = self.database.run(sql_cmd)
|
try:
|
||||||
|
result = self.database.run(sql_cmd)
|
||||||
|
except Exception as e:
|
||||||
|
result = str(e)
|
||||||
chained_input.add("\nSQLResult: ")
|
chained_input.add("\nSQLResult: ")
|
||||||
chained_input.add(result, color="yellow")
|
chained_input.add(result, color="yellow")
|
||||||
chained_input.add("\nAnswer:")
|
chained_input.add("\nAnswer:")
|
||||||
|
@ -67,5 +67,8 @@ class SQLDatabase:
|
|||||||
|
|
||||||
def run(self, command: str) -> str:
|
def run(self, command: str) -> str:
|
||||||
"""Execute a SQL command and return a string of the results."""
|
"""Execute a SQL command and return a string of the results."""
|
||||||
result = self._engine.execute(command).fetchall()
|
try:
|
||||||
|
result = self._engine.execute(command).fetchall()
|
||||||
|
except Exception as e:
|
||||||
|
result = e
|
||||||
return str(result)
|
return str(result)
|
||||||
|
Loading…
Reference in New Issue
Block a user