|
@@ -46,8 +46,10 @@ from transformers import AutoTokenizer, AutoModelForCausalLM
|
|
|
##########################################################################################
|
|
|
from langchain_community.chat_models import ChatOllama
|
|
|
# local_llm = "llama3-groq-tool-use:latest"
|
|
|
-local_llm = "llama3-groq-tool-use:latest"
|
|
|
-llm = ChatOllama(model=local_llm, temperature=0)
|
|
|
+# local_llm = "llama3-groq-tool-use:latest"
|
|
|
+# local_llm = "sqlcoder:latest"
|
|
|
+# local_llm = "llama3.1:8b-instruct-q2_K"
|
|
|
+# llm = ChatOllama(model=local_llm, temperature=0)
|
|
|
##########################################################################################
|
|
|
# model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct"
|
|
|
# tokenizer = AutoTokenizer.from_pretrained(model_id)
|
|
@@ -73,57 +75,110 @@ llm = ChatOllama(model=local_llm, temperature=0)
|
|
|
# llm = HuggingFacePipeline(pipeline=pipe)
|
|
|
|
|
|
# llm = Ollama(model = "llama3-groq-tool-use:latest", num_gpu=1)
|
|
|
+from langchain_openai import ChatOpenAI
|
|
|
+llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)
|
|
|
+
|
|
|
def get_examples():
|
|
|
examples = [
|
|
|
{
|
|
|
- "input": "建準廣興廠去年的自產電力的綠電使用量是多少?",
|
|
|
+ "input": "建準去年固定燃燒總排放量",
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "固定燃燒總排放量"
|
|
|
+ FROM "建準碳排放清冊數據new"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND ("類別項目" like '%固定燃燒%' OR "排放源" like '%固定燃燒%')
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "input": "廣興廠去年的固定燃燒排放量是多少?",
|
|
|
+ "query": """FROM "建準碳排放清冊數據new"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND "據點" = '昆山廣興廠'
|
|
|
+ AND ("類別項目" like '%固定燃燒%' OR "排放源" like '%固定燃燒%')
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "input": "建準廣興廠去年自產電力的綠電使用量是多少?",
|
|
|
"query": """SELECT SUM("用電度數(kwh)") AS "綠電使用量"
|
|
|
FROM "用電度數"
|
|
|
WHERE "項目" like '%綠電%'
|
|
|
AND "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%廣興廠%'
|
|
|
+ AND "據點" = '昆山廣興廠'
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
},
|
|
|
{
|
|
|
- "input": "建準北海廠去年的類別1總排放量是多少?",
|
|
|
+ "input": "建準北海廠去年的類別1總排放量",
|
|
|
"query": """SELECT SUM("排放量(公噸CO2e)") AS "類別1總排放量"
|
|
|
FROM "建準碳排放清冊數據new"
|
|
|
WHERE "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%北海%'
|
|
|
+ AND "據點" in ('北海建準廠', '北海立準廠')
|
|
|
AND "類別" = '類別1'
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
},
|
|
|
{
|
|
|
"input": "建準廣興廠去年的直接排放總排放量是多少?",
|
|
|
- "query": """SELECT SUM("排放量(公噸CO2e)") AS "類別1總排放量"
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "直接排放總排放量"
|
|
|
FROM "建準碳排放清冊數據new"
|
|
|
WHERE "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%廣興%'
|
|
|
+ AND "據點" = '昆山廣興廠'
|
|
|
AND ("類別項目" like '%直接排放%' OR "排放源" like '%直接排放%')
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
},
|
|
|
{
|
|
|
"input": "建準台北辦事處2022年的類別2總排放量是多少?",
|
|
|
- "query": """SELECT SUM("排放量(公噸CO2e)") AS "直接排放總排放量"
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "類別2總排放量"
|
|
|
FROM "建準碳排放清冊數據new"
|
|
|
WHERE "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%台北%'
|
|
|
+ AND "據點" = '台北辦事處'
|
|
|
AND "類別" = '類別2'
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = 2022;""",
|
|
|
},
|
|
|
{
|
|
|
- "input": "建準去年的固定燃燒總排放量是多少?",
|
|
|
- "query": """SELECT SUM("排放量(公噸CO2e)") AS "固定燃燒總排放量"
|
|
|
+ "input": "建準法國廠2022年的類別2總排放量",
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "類別2總排放量"
|
|
|
FROM "建準碳排放清冊數據new"
|
|
|
WHERE "事業名稱" like '%建準%'
|
|
|
- AND ("類別項目" like '%固定燃燒%' OR "排放源" like '%固定燃燒%')
|
|
|
+ AND "國家" = '法國'
|
|
|
+ AND "類別" = '類別2'
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
- AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;""",
|
|
|
+ AND "年度" = 2022;""",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "input": "建準北海2022的外購電力是多少",
|
|
|
+ "query": """SELECT SUM("用電度數(kwh)") AS "外購電力"
|
|
|
+ FROM "用電度數"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND "據點" in ('北海建準廠', '北海立準廠')
|
|
|
+ AND "項目" like '%外購電力%'
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = 2022;""",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "input": "2023建準印度的其他間接排放是多少",
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "其他間接排放總量"
|
|
|
+ FROM "建準碳排放清冊數據new"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND "國家" = '印度'
|
|
|
+ AND ("類別項目" like '%其他間接排放%' OR "排放源" like '%其他間接排放%')
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = 2023;""",
|
|
|
},
|
|
|
+ {
|
|
|
+ "input": "建準台北前年的產品使用碳排放量是多少",
|
|
|
+ "query": """SELECT SUM("排放量(公噸CO2e)") AS "產品使用總量"
|
|
|
+ FROM "建準碳排放清冊數據new"
|
|
|
+ WHERE "事業名稱" like '%建準%'
|
|
|
+ AND "據點" = '台北辦事處'
|
|
|
+ AND ("類別項目" like '%產品使用%' OR "排放源" like '%產品使用%')
|
|
|
+ AND "盤查標準" = 'GHG'
|
|
|
+ AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-2;""",
|
|
|
+ },
|
|
|
+
|
|
|
|
|
|
|
|
|
]
|
|
@@ -137,7 +192,8 @@ def table_description():
|
|
|
"The `建準碳排放清冊數據new` table 描述了建準電機工業股份有限公司不同據點分別在 ISO 14064-1:2018 與 GHG Protocol 標準下的溫室氣體排放量,並依類別1至類別6劃分。"
|
|
|
"It includes the following columns:\n"
|
|
|
"- `年度`: 盤查年度\n"
|
|
|
- "- `事業名稱`: 建準據點"
|
|
|
+ "- `事業名稱`: 公司名稱"
|
|
|
+ "- `據點`: 建準廠房據點 include '高雄總部及運通廠', '台北辦事處', '昆山廣興廠', '北海建準廠', '北海立準廠', '菲律賓建準廠', 'Inc', 'SAS', 'India'"
|
|
|
"- `國家`: 據點所在國家"
|
|
|
"- `類別`: 溫室氣體的排放類別,包含以下選項:\n"
|
|
|
" \t*類別1-直接排放:\n"
|
|
@@ -183,7 +239,9 @@ def write_query_chain(db, llm):
|
|
|
<|begin_of_text|>
|
|
|
|
|
|
<|start_header_id|>system<|end_header_id|>
|
|
|
+
|
|
|
Generate a SQL query to answer this question: `{input}`
|
|
|
+ 你是建準的AI助理,幫助建準查詢碳排放量,如果問題中有提到據點廠房,請使用 PostgreSQL query 進行篩選。
|
|
|
|
|
|
You are a PostgreSQL expert in ESG field. Given an input question, first create a syntactically correct PostgreSQL query to run,
|
|
|
then look at the results of the query and return the answer to the input question.\n\
|
|
@@ -192,6 +250,7 @@ def write_query_chain(db, llm):
|
|
|
Never query for all columns from a table. You must query only the columns that are needed to answer the question.
|
|
|
Wrap each column name in Quotation Mark (") to denote them as delimited identifiers.\n\
|
|
|
|
|
|
+ Unless the user ask for the type of 盤查標準 to be 'ISO' or 'GHG', queries always include query "盤查標準"='GHG' in the WHERE clause.\n
|
|
|
***Pay attention to only return query for PostgreSQL WITHOUT "```sql", And DO NOT content any other words.\n\
|
|
|
***Pay attention to only return PostgreSQL query and no premable or explanation.\n\
|
|
|
<|eot_id|>
|
|
@@ -209,9 +268,9 @@ def write_query_chain(db, llm):
|
|
|
Below are a number of examples of questions and their corresponding SQL queries.\n\
|
|
|
|
|
|
<|eot_id|>
|
|
|
-
|
|
|
- <|start_header_id|>assistant<|end_header_id|>
|
|
|
+ SQL query:
|
|
|
"""
|
|
|
+ # <|start_header_id|>assistant<|end_header_id|>
|
|
|
# prompt_template = PromptTemplate.from_template(template)
|
|
|
|
|
|
example_prompt = PromptTemplate.from_template("The following SQL query best answers the question `{input}`\nSQL query: {query}")
|
|
@@ -227,6 +286,7 @@ def write_query_chain(db, llm):
|
|
|
# llm = HuggingFacePipeline(pipeline=pipe)
|
|
|
|
|
|
|
|
|
+ # sqlcoder = Ollama(model = "sqlcoder", num_gpu=1)
|
|
|
write_query = create_sql_query_chain(llm, db, prompt)
|
|
|
|
|
|
|
|
@@ -245,11 +305,11 @@ def sql_to_nl_chain(llm):
|
|
|
** 請務必在回答中表達是建準的資料,即便問句中並未提及建準。
|
|
|
|
|
|
The following shows some example:
|
|
|
- Question: 廣興廠去年的類別1總排放量是多少?
|
|
|
+ Question: 建準廣興廠去年的類別1總排放量是多少?
|
|
|
SQL Query: SELECT SUM("排放量(公噸CO2e)") AS "類別1總排放量"
|
|
|
FROM "建準碳排放清冊數據new"
|
|
|
WHERE "事業名稱" like '%建準%'
|
|
|
- AND "事業名稱" like '%廣興%'
|
|
|
+ AND "據點" = '昆山廣興廠'
|
|
|
AND "類別" = '類別1'
|
|
|
AND "盤查標準" = 'GHG'
|
|
|
AND "年度" = EXTRACT(YEAR FROM CURRENT_DATE)-1;,
|
|
@@ -257,6 +317,7 @@ def sql_to_nl_chain(llm):
|
|
|
Answer: 建準廣興廠去年的類別1總排放量是1102.3712
|
|
|
|
|
|
如果你不知道答案或SQL query 出現錯誤請回答:"很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@systex.com 以便獲得更進一步的幫助,謝謝。"
|
|
|
+
|
|
|
勿回答無關資訊
|
|
|
<|eot_id|>
|
|
|
|
|
@@ -278,10 +339,14 @@ def sql_to_nl_chain(llm):
|
|
|
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("```sql","").replace("```","")
|
|
|
+ query = query.replace("碰排","碳排")
|
|
|
+ query = query.replace("%%","%")
|
|
|
# query = query.replace("104_112碰排放公開及建準資料","104_112碳排放公開及建準資料")
|
|
|
print(query)
|
|
|
|
|
@@ -308,6 +373,9 @@ def run(db, question, selected_table, 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("```sql","").replace("```","")
|
|
|
+ query = query.replace("碰排","碳排")
|
|
|
+ query = query.replace("%%","%")
|
|
|
# query = query.replace("104_112碰排放公開及建準資料","104_112碳排放公開及建準資料")
|
|
|
print(query)
|
|
|
|
|
@@ -327,7 +395,9 @@ if __name__ == "__main__":
|
|
|
start = time.time()
|
|
|
|
|
|
selected_table = ['用水度數', '用水度數', '建準碳排放清冊數據new']
|
|
|
- question = "建準去年的上游運輸總排放量是多少?"
|
|
|
+ # question = "建準廣興廠去年的上游運輸總排放量是多少?"
|
|
|
+ question = "建準北海廠去年的固定燃燒排放量是多少?"
|
|
|
+ # question = "建準北海廠去年類別1總排放量是多少?"
|
|
|
# question = "台積電2022年的直接排放總排放量是多少?"
|
|
|
# question = "建準廣興廠去年的灰電使用量"
|
|
|
query, result, answer = run(db, question, selected_table, llm)
|