Change Liao
commited on
Commit
·
598cd1c
1
Parent(s):
9866893
新增法務AI 助手
Browse files- app.py +118 -8
- cache.sqlite3 +0 -0
- data/be_source/inquery.csv +0 -3
app.py
CHANGED
@@ -15,14 +15,14 @@ from sqlitedict import SqliteDict
|
|
15 |
|
16 |
import gradio as gr
|
17 |
|
18 |
-
from langchain import PromptTemplate
|
19 |
from langchain.agents import Tool
|
20 |
from langchain.agents import load_tools
|
21 |
from langchain.agents import initialize_agent
|
22 |
|
23 |
from langchain.agents import AgentType
|
24 |
|
25 |
-
from langchain.chains import LLMMathChain
|
26 |
from langchain import SerpAPIWrapper
|
27 |
from langchain.chains import ConversationalRetrievalChain
|
28 |
|
@@ -91,6 +91,7 @@ TALKING_HEAD_WIDTH = "192"
|
|
91 |
AZURE_VOICE_DATA = AzureVoiceData()
|
92 |
POLLY_VOICE_DATA = PollyVoiceData()
|
93 |
|
|
|
94 |
|
95 |
def save_sqlite(key,value):
|
96 |
try:
|
@@ -193,12 +194,18 @@ def add_files_to_collection(input_file_path, collection_name):
|
|
193 |
add_documents_into_cromadb(persist_db, file_path, collection_name)
|
194 |
|
195 |
def get_prompt_summary_string():
|
196 |
-
|
197 |
|
198 |
{text}
|
199 |
|
200 |
精簡摘要:"""
|
201 |
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
template_string = """
|
203 |
我是鴻海(等同Foxconn)的員工, 你是一個鴻海的人資專家.
|
204 |
請根據歷史對話,針對這次的問題, 形成獨立問題. 請優先從提供的文件中尋找答案, 你被允許回答不知道, 但回答不知道時需要給中央人資的客服聯絡窗口資訊.
|
@@ -208,7 +215,55 @@ template_string = """
|
|
208 |
這次的問題: {question}
|
209 |
人資專家:
|
210 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
211 |
def get_prompt_template_string():
|
|
|
212 |
return template_string
|
213 |
|
214 |
def get_default_template_prompt():
|
@@ -367,7 +422,20 @@ def content_summary(split_documents):
|
|
367 |
llm = AzureChatOpenAI(
|
368 |
deployment_name=global_deployment_id,
|
369 |
model_name=global_model_name,
|
370 |
-
temperature=0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
371 |
map_prompt = get_prompt_summary_string()
|
372 |
map_prompt_template = PromptTemplate(template=map_prompt, input_variables=["text"])
|
373 |
chain = load_summarize_chain(
|
@@ -383,6 +451,7 @@ def content_summary(split_documents):
|
|
383 |
except Exception as e:
|
384 |
print(e)
|
385 |
return {'output_text':refuse_string}
|
|
|
386 |
|
387 |
def pdf_summary(file_name):
|
388 |
print("file_name: "+file_name)
|
@@ -402,6 +471,7 @@ def youtube_summary(youtube_url):
|
|
402 |
split_documents=text_splitter.split_documents(document)
|
403 |
result = content_summary(split_documents)
|
404 |
return result['output_text']
|
|
|
405 |
def summary_large_file(files):
|
406 |
file_paths = [file.name for file in files]
|
407 |
print(file_paths[0])
|
@@ -529,7 +599,6 @@ def kh_update_km(files):
|
|
529 |
|
530 |
return num_of_collection(tmp_collection)
|
531 |
|
532 |
-
|
533 |
class Logger:
|
534 |
def __init__(self, filename):
|
535 |
self.terminal = sys.stdout
|
@@ -546,7 +615,6 @@ class Logger:
|
|
546 |
def isatty(self):
|
547 |
return False
|
548 |
|
549 |
-
|
550 |
def read_logs():
|
551 |
sys.stdout.flush()
|
552 |
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
@@ -554,7 +622,6 @@ def read_logs():
|
|
554 |
with open("output.log", "r", encoding='UTF-8') as f:
|
555 |
return ansi_escape.sub('', f.read())
|
556 |
|
557 |
-
|
558 |
def lunch_style(demo, logs=gr.Text()):
|
559 |
sys.stdout = Logger("output.log")
|
560 |
demo.load(read_logs, None, logs, every=1)
|
@@ -731,7 +798,8 @@ def gradio_run():
|
|
731 |
gr.Examples(onlyfiles, label="資料庫檔案", inputs=invField, examples_per_page=4)
|
732 |
with gr.Row():
|
733 |
with gr.Column():
|
734 |
-
|
|
|
735 |
deployment_name=global_deployment_id,
|
736 |
model_name=global_model_name,
|
737 |
max_tokens=2000,
|
@@ -791,6 +859,47 @@ def gradio_run():
|
|
791 |
'如果龍華廠區的員工每人每天問3個問題,台灣員工每人每天問7個問題, 請問這樣一個月多少錢?'
|
792 |
], label="訊息範例", inputs=tmp_msg)
|
793 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
794 |
demo.queue(concurrency_count=10)
|
795 |
lunch_style(demo,console)
|
796 |
|
@@ -798,5 +907,6 @@ def test():
|
|
798 |
mypath = "C:\\Users\\catsk\\SourceCode\\azure_openai_poc\\data\\ks_source_files"
|
799 |
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
|
800 |
print(onlyfiles)
|
|
|
801 |
gradio_run()
|
802 |
|
|
|
15 |
|
16 |
import gradio as gr
|
17 |
|
18 |
+
from langchain import PromptTemplate, LLMChain
|
19 |
from langchain.agents import Tool
|
20 |
from langchain.agents import load_tools
|
21 |
from langchain.agents import initialize_agent
|
22 |
|
23 |
from langchain.agents import AgentType
|
24 |
|
25 |
+
from langchain.chains import LLMMathChain, StuffDocumentsChain
|
26 |
from langchain import SerpAPIWrapper
|
27 |
from langchain.chains import ConversationalRetrievalChain
|
28 |
|
|
|
91 |
AZURE_VOICE_DATA = AzureVoiceData()
|
92 |
POLLY_VOICE_DATA = PollyVoiceData()
|
93 |
|
94 |
+
prompt_string =""
|
95 |
|
96 |
def save_sqlite(key,value):
|
97 |
try:
|
|
|
194 |
add_documents_into_cromadb(persist_db, file_path, collection_name)
|
195 |
|
196 |
def get_prompt_summary_string():
|
197 |
+
_local_prompt_string = """使用中文替下面內容做個精簡摘要:
|
198 |
|
199 |
{text}
|
200 |
|
201 |
精簡摘要:"""
|
202 |
|
203 |
+
if prompt_string == "":
|
204 |
+
return _local_prompt_string
|
205 |
+
else:
|
206 |
+
print("prompt_string: "+prompt_string)
|
207 |
+
return prompt_string
|
208 |
+
|
209 |
template_string = """
|
210 |
我是鴻海(等同Foxconn)的員工, 你是一個鴻海的人資專家.
|
211 |
請根據歷史對話,針對這次的問題, 形成獨立問題. 請優先從提供的文件中尋找答案, 你被允許回答不知道, 但回答不知道時需要給中央人資的客服聯絡窗口資訊.
|
|
|
215 |
這次的問題: {question}
|
216 |
人資專家:
|
217 |
"""
|
218 |
+
|
219 |
+
default_legal_contract_prompt = """
|
220 |
+
你是一位超級助理, 十分擅長從大量文字中擷取摘要.
|
221 |
+
以下用 ''' 包含的是保密合約的內容,幫我生成一份2,000個中文字以內保密合約摘要,摘要需要包含以下項目:
|
222 |
+
1.背景: 介紹對方公司的背景、為什麼要跟該公司簽訂保密合約
|
223 |
+
2.目的: 要與對方交換什麼資料, 資料內容與範圍
|
224 |
+
3.合約期間:保密合約的時間範圍
|
225 |
+
4.提前解約條款: 發生什麼樣的條件就會要提前解約
|
226 |
+
5.保密期間: 保密的時間範圍
|
227 |
+
6.管轄法院: 如有爭端,雙方同意的管轄法院是哪個法院
|
228 |
+
|
229 |
+
AI 風險評估: 希望AI 可以評估該資料交換是否有高風險的疑慮; 評估準測:
|
230 |
+
高風險: 涉及到營業秘密的內容
|
231 |
+
中風險: 沒有營業秘密, 但有涉及敏感資料(足以辨識個人的訊息)
|
232 |
+
低風險: 僅涉及作業面向的訊息
|
233 |
+
|
234 |
+
保密合約:
|
235 |
+
'''
|
236 |
+
{text}
|
237 |
+
'''
|
238 |
+
|
239 |
+
"""
|
240 |
+
|
241 |
+
default_legal_quotation_prompt = """
|
242 |
+
你是一位超級助理, 十分擅長從大量文字中擷取摘要.
|
243 |
+
以下用 ''' 包含的是報價單的內容,幫我生成一份2,000個中文字以內報價單摘要,摘要需要包含以下項目:
|
244 |
+
|
245 |
+
1. 標的名稱: 報價單中所列出的產品或服務的名稱。
|
246 |
+
2. 價格: 報價單中所列出的每個產品或服務的價格, 一定要有正確的幣別與金額數字.
|
247 |
+
3. 付款內容: 報價單中所列出的付款方式和相關內容, 包括訂金, 交貨款和保留款的金額和支付方式; 除了各款項的交付百分比, 也需要有正確的金額與幣別.
|
248 |
+
4. 交貨時間: 報價單中所列出的產品或服務的交付的日期或時間範圍。
|
249 |
+
5. 保固(英文為Warranty): 請摘要報價單中所有關於保固內容.
|
250 |
+
6. 維修費用:報價單中所列出的產品或服務的維修費用或相關條款, 有任何維修的金額請一定要列出.
|
251 |
+
7. 貿易條件(Trade Term)
|
252 |
+
8. 其他注意事項:報價單中所列出的其他重要事項或注意事項。
|
253 |
+
|
254 |
+
請根據報價單的內容, 生成一份清晰明確的摘要, 條列式地把摘要列出, 確保所有項目都被包含在內. 如果內容超過三句話, 請以子項目的方式逐一列舉出來.
|
255 |
+
|
256 |
+
請注意,生成的摘要應該是簡潔且易於理解的, 要詳細條列出內容, 不可產生 "依其他文件說明" 等說明方式.
|
257 |
+
在報價單裡沒有找到符合的資訊, 你被允許回答 "無相關資料".
|
258 |
+
|
259 |
+
報價單內容:
|
260 |
+
|
261 |
+
'''
|
262 |
+
{text}
|
263 |
+
'''
|
264 |
+
"""
|
265 |
def get_prompt_template_string():
|
266 |
+
print("template:"+template_string)
|
267 |
return template_string
|
268 |
|
269 |
def get_default_template_prompt():
|
|
|
422 |
llm = AzureChatOpenAI(
|
423 |
deployment_name=global_deployment_id,
|
424 |
model_name=global_model_name,
|
425 |
+
temperature=0.0)
|
426 |
+
_local_prompt_string = get_prompt_summary_string()
|
427 |
+
_local_prompt = PromptTemplate.from_template(_local_prompt_string)
|
428 |
+
|
429 |
+
llm_chain = LLMChain(llm=llm, prompt=_local_prompt)
|
430 |
+
|
431 |
+
# Define StuffDocumentsChain
|
432 |
+
stuff_chain = StuffDocumentsChain(
|
433 |
+
llm_chain=llm_chain, document_variable_name="text"
|
434 |
+
)
|
435 |
+
output = stuff_chain(split_documents)
|
436 |
+
return output
|
437 |
+
|
438 |
+
'''
|
439 |
map_prompt = get_prompt_summary_string()
|
440 |
map_prompt_template = PromptTemplate(template=map_prompt, input_variables=["text"])
|
441 |
chain = load_summarize_chain(
|
|
|
451 |
except Exception as e:
|
452 |
print(e)
|
453 |
return {'output_text':refuse_string}
|
454 |
+
'''
|
455 |
|
456 |
def pdf_summary(file_name):
|
457 |
print("file_name: "+file_name)
|
|
|
471 |
split_documents=text_splitter.split_documents(document)
|
472 |
result = content_summary(split_documents)
|
473 |
return result['output_text']
|
474 |
+
|
475 |
def summary_large_file(files):
|
476 |
file_paths = [file.name for file in files]
|
477 |
print(file_paths[0])
|
|
|
599 |
|
600 |
return num_of_collection(tmp_collection)
|
601 |
|
|
|
602 |
class Logger:
|
603 |
def __init__(self, filename):
|
604 |
self.terminal = sys.stdout
|
|
|
615 |
def isatty(self):
|
616 |
return False
|
617 |
|
|
|
618 |
def read_logs():
|
619 |
sys.stdout.flush()
|
620 |
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
|
|
622 |
with open("output.log", "r", encoding='UTF-8') as f:
|
623 |
return ansi_escape.sub('', f.read())
|
624 |
|
|
|
625 |
def lunch_style(demo, logs=gr.Text()):
|
626 |
sys.stdout = Logger("output.log")
|
627 |
demo.load(read_logs, None, logs, every=1)
|
|
|
798 |
gr.Examples(onlyfiles, label="資料庫檔案", inputs=invField, examples_per_page=4)
|
799 |
with gr.Row():
|
800 |
with gr.Column():
|
801 |
+
|
802 |
+
llm = AzureChatOpenAI(
|
803 |
deployment_name=global_deployment_id,
|
804 |
model_name=global_model_name,
|
805 |
max_tokens=2000,
|
|
|
859 |
'如果龍華廠區的員工每人每天問3個問題,台灣員工每人每天問7個問題, 請問這樣一個月多少錢?'
|
860 |
], label="訊息範例", inputs=tmp_msg)
|
861 |
|
862 |
+
with gr.Tab("法務AI幫手"):
|
863 |
+
def change_prompt(inputString):
|
864 |
+
global prompt_string
|
865 |
+
prompt_string = inputString
|
866 |
+
return inputString
|
867 |
+
|
868 |
+
with gr.Row():
|
869 |
+
with gr.Column(scale=2):
|
870 |
+
gr.Markdown("""
|
871 |
+
### 操作方式:
|
872 |
+
|
873 |
+
1. 可以選擇任何合約或是報價單, 目前僅支援text/pdf/docx/csv 格式; 上傳後即可使用下方的 prompt 來做摘要
|
874 |
+
2. 如果要修改prompt, 直接點選 `prompt 對話框` 修改即可; 若有覺得摘要後內容不足, 不夠清楚, 可以在prompt 裡修正或新增定義. 新增完再上傳一次檔案即可
|
875 |
+
3. 再煩請覺得更好的prompt 內容給Change; 若後續有需要長時間微調prompt, 會再加上可以線上儲存 prompt 功能.
|
876 |
+
4. 下方有prompt 範例, 可以直接點選就會更改prompt 內容.
|
877 |
+
|
878 |
+
""")
|
879 |
+
file_name_field = gr.Textbox(max_lines=1, label="1. 上傳檔案", placeholder="目前沒有上傳檔案")
|
880 |
+
upload_button = gr.UploadButton("請上傳保密合約或報價單(可接受text, pdf, docx, csv 格式)",
|
881 |
+
file_types=["text", ".pdf", ".csv", ".docx"], file_count="multiple")
|
882 |
+
gr.Markdown("""
|
883 |
+
|
884 |
+
|
885 |
+
""")
|
886 |
+
prompt_textbox = gr.Textbox(default_legal_quotation_prompt, lines=20, max_lines=20, label="2. Prompt", interactive=True)
|
887 |
+
prompt_textbox.change(change_prompt, inputs=prompt_textbox)
|
888 |
+
with gr.Column(scale=3):
|
889 |
+
summary_text = gr.Textbox()
|
890 |
+
summary_text.label = "3. AI 摘要:"
|
891 |
+
summary_text.change = False
|
892 |
+
summary_text.lines = 40
|
893 |
+
summary_text.max_lines = 40
|
894 |
+
pass
|
895 |
+
|
896 |
+
|
897 |
+
gr.Examples([default_legal_contract_prompt, default_legal_quotation_prompt], label="Prompt 範例",
|
898 |
+
inputs=prompt_textbox, outputs=prompt_textbox, fn=change_prompt)
|
899 |
+
|
900 |
+
upload_button.upload(upload_large_file, upload_button, file_name_field).\
|
901 |
+
then(change_prompt,inputs=prompt_textbox).\
|
902 |
+
then(summary_large_file, upload_button, summary_text)
|
903 |
demo.queue(concurrency_count=10)
|
904 |
lunch_style(demo,console)
|
905 |
|
|
|
907 |
mypath = "C:\\Users\\catsk\\SourceCode\\azure_openai_poc\\data\\ks_source_files"
|
908 |
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
|
909 |
print(onlyfiles)
|
910 |
+
|
911 |
gradio_run()
|
912 |
|
cache.sqlite3
CHANGED
Binary files a/cache.sqlite3 and b/cache.sqlite3 differ
|
|
data/be_source/inquery.csv
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:3b9f6a7ac5884b022e982f01d6f2b22c2374bcbaf2cb43a01623a637bb83cabb
|
3 |
-
size 61120
|
|
|
|
|
|
|
|