Change Liao commited on
Commit
598cd1c
·
1 Parent(s): 9866893

新增法務AI 助手

Browse files
Files changed (3) hide show
  1. app.py +118 -8
  2. cache.sqlite3 +0 -0
  3. 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
- return """使用中文替下面內容做個精簡摘要:
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.2)
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- llm = AzureOpenAI(
 
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