|
@@ -75,15 +75,6 @@ llm = ChatOllama(model=local_llm, temperature=0)
|
|
|
# llm = Ollama(model = "llama3-groq-tool-use:latest", num_gpu=1)
|
|
|
def get_examples():
|
|
|
examples = [
|
|
|
- {
|
|
|
- "input": "建準去年的固定燃燒總排放量是多少?",
|
|
|
- "query": """SELECT SUM("排放量(公噸CO2e)") AS "固定燃燒總排放量"
|
|
|
- FROM "104_112碳排放公開及建準資料"
|
|
|
- WHERE "事業名稱" like '%建準%'
|
|
|
- AND "排放源" = '固定燃燒'
|
|
|
- AND "盤查標準" = 'GHG'
|
|
|
- AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
- },
|
|
|
{
|
|
|
"input": "建準廣興廠去年的類別1總排放量是多少?",
|
|
|
"query": """SELECT SUM("排放量(公噸CO2e)") AS "類別1總排放量"
|
|
@@ -104,6 +95,15 @@ def get_examples():
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = 2022;""",
|
|
|
},
|
|
|
+ {
|
|
|
+ "input": "建準去年的固定燃燒總排放量是多少?",
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "固定燃燒總排放量"
|
|
|
+ FROM "104_112碳排放公開及建準資料"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND "排放源" = '固定燃燒'
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
+ },
|
|
|
{
|
|
|
"input": "台積電2022年的類別1總排放量是多少?",
|
|
|
"query": """SELECT SUM("排放量(公噸CO2e)") AS "台積電2022年類別1總排放量"
|
|
@@ -120,10 +120,12 @@ def get_examples():
|
|
|
|
|
|
def table_description():
|
|
|
database_description = (
|
|
|
- "The database consists of following tables: `2022 清冊數據(ISO)`, `2023 清冊數據(ISO)`, `2022 清冊數據(GHG)`, `2023 清冊數據(GHG)`, `水電使用量(ISO)` and `水電使用量(GHG)`. "
|
|
|
+ "The database consists of following table: `104_112碳排放公開及建準資料`, `水電使用量(ISO)` and `水電使用量(GHG)`. "
|
|
|
"This is a PostgreSQL database, so you need to use postgres-related queries.\n\n"
|
|
|
- "The `2022 清冊數據(ISO)`, `2023 清冊數據(ISO)`, `2022 清冊數據(GHG)` and `2023 清冊數據(GHG)` table 描述了不同廠房分別在 ISO 14064-1:2018 與 GHG Protocol 標準下的溫室氣體排放量,並依類別1至類別6劃分。"
|
|
|
+ "The `104_112碳排放公開及建準資料` table 描述了不同事業單位或廠房分別在 ISO 14064-1:2018 與 GHG Protocol 標準下的溫室氣體排放量,並依類別1至類別6劃分。"
|
|
|
"It includes the following columns:\n"
|
|
|
+
|
|
|
+ "- `年度`: 盤查年度\n"
|
|
|
"- `類別`: 溫室氣體的排放類別,包含以下:\n"
|
|
|
" \t*類別1-直接排放\n"
|
|
|
" \t*類別2-能源間接排放\n"
|
|
@@ -132,15 +134,9 @@ def table_description():
|
|
|
" \t*類別5-使用來自組織產品間接排放\n"
|
|
|
" \t*類別6\n"
|
|
|
"- `排放源`: `類別`欄位進一步劃分的細項\n"
|
|
|
- "- `高雄總部&運通廠`: 位於台灣的廠房據點\n"
|
|
|
- "- `台北辦公室`: 位於台灣的廠房據點\n"
|
|
|
- "- `北海建準廠`: 位於中國的廠房據點\n"
|
|
|
- "- `北海立準廠`: 位於中國的廠房據點\n"
|
|
|
- "- `昆山廣興廠`: 位於中國的廠房據點\n"
|
|
|
- "- `菲律賓建準廠`: 位於菲律賓的廠房據點\n"
|
|
|
- "- `India`: 位於印度的廠房據點\n"
|
|
|
- "- `INC`: 位於美國的廠房據點\n"
|
|
|
- "- `SAS`: 位於法國的廠房據點\n\n"
|
|
|
+ "- `排放量(公噸CO2e)`: 溫室氣體排放量\n"
|
|
|
+ "- `盤查標準`: ISO or GHG\n"
|
|
|
+
|
|
|
|
|
|
"The `水電使用量(ISO)` and `水電使用量(GHG)` table 描述了不同廠房分別在 ISO 14064-1:2018 與 GHG Protocol 標準下的水電使用量,包含'外購電力 度數 (kwh)'與'自來水 度數 (立方公尺 m³)'。"
|
|
|
"The `public.departments_table` table contains information about the various departments in the company. It includes:\n"
|
|
@@ -196,7 +192,7 @@ def write_query_chain(db, llm):
|
|
|
input_variables=["input", "top_k", "table_info"],
|
|
|
)
|
|
|
|
|
|
- # llm = Ollama(model = "mannix/defog-llama3-sqlcoder-8b", num_gpu=1)
|
|
|
+ # llm = Ollama(model = "sqlcoder", num_gpu=1)
|
|
|
# llm = HuggingFacePipeline(pipeline=pipe)
|
|
|
|
|
|
|
|
@@ -214,19 +210,9 @@ def sql_to_nl_chain(llm):
|
|
|
<|begin_of_text|>
|
|
|
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
|
|
|
Given the following user question, corresponding SQL query, and SQL result, answer the user question.
|
|
|
- 給定以下使用者問題、對應的 SQL 查詢和 SQL 結果,以繁體中文回答使用者問題。
|
|
|
+ 根據使用者的問題、對應的 SQL 查詢和 SQL 結果,以繁體中文回答使用者問題。
|
|
|
|
|
|
- For example
|
|
|
- Question: 建準廣興廠去年的類別總排放量是多少?
|
|
|
- SQL Query: SELECT SUM("排放量(公噸CO2e)") AS "類別1總排放量"
|
|
|
- FROM "104_112碳排放公開及建準資料"
|
|
|
- WHERE "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%廣興廠%'
|
|
|
- AND "類別" = '類別1-直接排放'
|
|
|
- AND "盤查標準" = 'GHG'
|
|
|
- AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;
|
|
|
- SQL Result: [(1102.3712,)]
|
|
|
- Answer: 建準廣興廠去年的類別1總排放量是1102.3712
|
|
|
+
|
|
|
<|eot_id|>
|
|
|
|
|
|
<|begin_of_text|><|start_header_id|>user<|end_header_id|>
|
|
@@ -241,14 +227,35 @@ def sql_to_nl_chain(llm):
|
|
|
"""
|
|
|
)
|
|
|
|
|
|
+ # llm = Ollama(model = "llama3-groq-tool-use:latest", num_gpu=1)
|
|
|
chain = answer_prompt | llm | StrOutputParser()
|
|
|
|
|
|
return chain
|
|
|
|
|
|
+def get_query(db, question, selected_table, llm):
|
|
|
+ write_query = write_query_chain(db, llm)
|
|
|
+ query = write_query.invoke({"question": question, 'table_names_to_use': selected_table, "top_k": 1000, "table_info":context["table_info"], "database_description": table_description()})
|
|
|
+
|
|
|
+ query = re.split('SQL query: ', query)[-1]
|
|
|
+ query = query.replace("104_112碰排放公開及建準資料","104_112碳排放公開及建準資料")
|
|
|
+ print(query)
|
|
|
+
|
|
|
+ return query
|
|
|
+
|
|
|
+def query_to_nl(db, question, query, llm):
|
|
|
+ execute_query = QuerySQLDataBaseTool(db=db)
|
|
|
+ result = execute_query.invoke(query)
|
|
|
+ print(result)
|
|
|
+
|
|
|
+ chain = sql_to_nl_chain(llm)
|
|
|
+ answer = chain.invoke({"question": question, "query": query, "result": result})
|
|
|
+
|
|
|
+ return answer
|
|
|
+
|
|
|
def run(db, question, selected_table, llm):
|
|
|
|
|
|
write_query = write_query_chain(db, llm)
|
|
|
- query = write_query.invoke({"question": question, 'table_names_to_use': selected_table, "top_k": 1000, "table_info":context["table_info"], "database_description": "foo"})
|
|
|
+ query = write_query.invoke({"question": question, 'table_names_to_use': selected_table, "top_k": 1000, "table_info":context["table_info"], "database_description": table_description()})
|
|
|
|
|
|
query = re.split('SQL query: ', query)[-1]
|
|
|
query = query.replace("104_112碰排放公開及建準資料","104_112碳排放公開及建準資料")
|