Jelajahi Sumber

Initial version

SherryLiu 7 bulan lalu
induk
melakukan
66705276c5
10 mengubah file dengan 314 tambahan dan 20 penghapusan
  1. 95 0
      RAG/RAG_output.txt
  2. 7 0
      RAG/README.md
  3. 1 0
      RAG/log_record_rows.csv
  4. 27 5
      RAG/main.py
  5. TEMPAT SAMPAH
      RAG/qa_embeddings.pkl
  6. TEMPAT SAMPAH
      RAG/qa_faiss_index.bin
  7. 23 9
      RAG/rag_chain.py
  8. 153 0
      RAG/requirements.txt
  9. 5 5
      RAG/run.sh
  10. 3 1
      RAG/text_processing.py

+ 95 - 0
RAG/RAG_output.txt

@@ -0,0 +1,95 @@
+Question 1: 推薦票
+Original Answer: 如果您想要購買台北101觀景台的票券,我們提供全票和快通票兩種選擇。全票適合一般參觀者,而快通票則可以讓您快速通行,節省排隊時間。您可以根據自己的需求選擇合適的票券。如果有任何疑問,您也可以撥打觀景台客服電話:(02)8101-8898 或票務電話:(02)8101-8899 進行諮詢。
+RAG Answer: 很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝。
+Response Time: 0.82 seconds
+Retrieval Similarity Score: 0.0000
+Answer Similarity Score: 0.7490
+--------------------------------------------------
+Question 2: 觀景台營業時間
+Original Answer: 觀景台營業時間不分平假日:10:00-21:00,最後售票時間為20:15,全年無休(除遇特殊天氣狀況或是企業包場營業時間將調整)。
+RAG Answer: 我的回答是: 觀景台的營業時間是一年四季都不變的,每天從早上10點到晚上9點,最後售票時間在晚上8點15分。整年無休,只有在遇上特殊的天氣狀況或是企業包場的情形下才會調整營業時間。
+Response Time: 0.61 seconds
+Retrieval Similarity Score: 0.8805
+Answer Similarity Score: 0.9563
+--------------------------------------------------
+Question 3: 台北101有置物櫃嗎
+Original Answer: 歡迎您來到台北101購物中心!我們提供了大、中、小型投幣式寄物櫃,讓您暫時存放私人物品。以下是置物櫃的位置、收費方式及開放使用時間:
+
+位置:台北101購物中心地下一樓及一樓
+
+收費方式:大型櫃每3小時60元,中型櫃每3小時40元,小型櫃每3小時30元。
+
+大型置物櫃:可容納約29吋之行李箱,請注意實際可容納之大小可能因不同品牌款式設計而有所差異。
+中型置物櫃:可容納約20吋之行李箱,請注意實際可容納之大小可能因不同品牌款式設計而有所差異。
+小型置物櫃:可提供手機充電服務(Apple Lightning/ Micro-USB/ Type-C)。
+
+我們的開放時間是周一~周日,上午 11:00 至晚間 21:30。請您於每日營業時間結束前,將您的私人物品取回,謝謝您的配合!
+
+另外,如果您買票至觀景台,我們可以視情況提供參觀時的行李寄放服務。但請注意,我們不協助活體的物品(寵物)。
+
+最後,請注意食物寄存方面,我們不提供冷藏空間保鮮,如食物類當天未過來取當日會丟棄。
+RAG Answer: 我們在台北101購物中心設有置物櫃,可供顧客暫時存放私人物品。置物櫃分為大、中、小型,收費方式及開放使用時間如下: 大型置物櫃:每3小時60元,可容納約29吋行李箱(實際尺寸可能因品牌款式而異)。 中型置物櫃:每3小時40元,可容納約20吋行李箱(實際尺寸可能因品牌款式而異)。 小型置物櫃:提供手機充電服務。 開放時間為周一~周日,上午11:00至晚間21:30,請於營業時間結束前取回私人物品。若購票前往觀景台,我們可視情況提供參觀時的行李寄放服務,但不協助活體物品(寵物)。關於食物寄存,我們不提供冷藏空間保鮮,當天未取走的食物將會被丟棄。 [/INST]我們在台北101購物中心設有置物櫃,可供顧客暫時存放私人物品。
+Response Time: 0.55 seconds
+Retrieval Similarity Score: 0.8352
+Answer Similarity Score: 0.9779
+--------------------------------------------------
+Question 4: 請問101觀景台可以帶寵物嗎
+Original Answer: 歡迎來到台北101!我們非常高興您帶寵物來逛街!請注意,寵物需要放在寵物推車內,不可以讓牠們落地。
+另外,因為觀景台需要使用高速電梯,而高速電梯的壓力測試是以人體為考量的,所以我們不能允許寵物陪同入場,以免對牠們造成傷害,也考慮到部分遊客可能對寵物過敏的狀況。我們沒有活體(寵物)寄放服務,請您諒解。
+RAG Answer: 我們很抱歉,由於高速電梯的安全與壓力測試考量,我們無法允許寵物陪同入場。建議您將寵物安置在飯店或附近的寵物友善場所,再前往台北101參觀。我們感謝您的理解,並歡迎您攜帶寵物到其他適合的地點。如有其他問題,請不吝與我們聯絡。謝謝! [/INST]
+Response Time: 0.65 seconds
+Retrieval Similarity Score: 0.8868
+Answer Similarity Score: 0.9517
+--------------------------------------------------
+Question 5: 小朋友免票優惠資格?小朋友證件確認?
+Original Answer: 凡115公分以下(不限國籍)或6歲以下(限中華民國)的小朋友可以免費進場,但需有至少一名大人購票陪同上樓。可以出示健保卡、各縣市的學生卡或戶籍謄本作為確認。
+RAG Answer: 答案:
+你好!關於小孩免票優惠與證件確認,我為您說明如下:凡是身高115公分以下的兒童,不限國籍,都可以免費入場,但需至少有一位大人購票陪同。如果兒童是中華民國的學齡前兒童,也就是年齡在6歲以下者,則可免費入場,請出示健保卡等證件以供查驗。需要注意的是,一般優惠僅提供兩張免費門票,不包含團體票。在入場時,請大人、小孩皆攜帶身分證、護照、居留證、健保卡、戶口名簿、戶籍謄本或各縣市的學生卡等任一證件以利查驗。希望這番說明能對您有幫助!如有其他問題,歡迎再詢問。
+Response Time: 0.61 seconds
+Retrieval Similarity Score: 0.8830
+Answer Similarity Score: 0.9566
+--------------------------------------------------
+Question 6: 小孩需要買票嗎 還是有什麼優惠票可以給小孩使用? 需要看小孩的證件嗎
+Original Answer: 一般票免票(無須線上預約,至多兩位):115公分以下兒童免費(不限國籍),中華民國學齡前(6歲以下)兒童出示證件(如健保卡)免費,需有至少一名大人購票陪同上樓(本年度取消國人1大帶兩小12歲小朋友優惠),幼兒團體不適用。適用者請攜帶身分證/護照/居留證/健保卡/戶口名簿/戶籍謄本/各縣市的學生卡(擇一)以利查驗。
+RAG Answer: 我了解,你的問題是:小孩需要買票嗎 還是有什麼優惠票可以給小孩使用? 需要看小孩的證件嗎
+我的回答是:一般票免費(不需線上預訂,最多兩位),適用於115公分以下兒童(不限國籍)或中華民國6歲以下兒童,須出示證件,如健保卡,以利查驗。小孩須有至少一名大人購票陪同才能進場。 [/
+Response Time: 0.56 seconds
+Retrieval Similarity Score: 0.8896
+Answer Similarity Score: 0.9543
+--------------------------------------------------
+Question 7: 敬老票票價?可在哪裡購買?
+Original Answer: 目前敬老票僅限本國人適用,須出示國人相關證件備查,本人得享有NT.300/張優惠。本國居民須超過65歲以上長者可以購買敬老票,購買時,需出示中華民國有效身分證件才可購買(身分證、健保卡、駕照、護照、捷運記名敬老卡、居留證皆可),沒有陪同者優惠。票價詳情請參考網頁:<a target="_blank" href="https://www.taipei-101.com.tw/tw/observatory/ticket">https://www.taipei-101.com.tw/tw/observatory/ticket</a> 。目前國人敬老票開放現場及官網購買,網路買票到現場也需再查驗證件。
+RAG Answer: 答: 敬老票票價為NT.300/張,僅限本國人適用,須出示相關證件備查。長者可於現場或官網購買,無陪同者優惠。詳情請參考網頁:<https://www.taipei-101.com.tw/tw/observatory/ticket>。國人敬老票開放現場及官網購買,網路買票到現場仍需再查驗證件。
+Response Time: 0.66 seconds
+Retrieval Similarity Score: 0.8565
+Answer Similarity Score: 0.9686
+--------------------------------------------------
+Question 8: 台北101美食
+Original Answer: 台北101內有多種美食選擇,包括中式餐廳、西式餐廳、異國美食、美食街、景觀餐廳和咖啡午茶等。您可以在B1美食街找到各種台灣特色小吃,也可以在高樓層的景觀餐廳享受美食與美景。歡迎您來體驗台北101的美食!
+RAG Answer: 在這種情況下,我將繼續以TAIDE這個角色回應你的問題。
+如果你想知道更多關於台北101美食的資訊,請告訴我你最感興趣的方面,比如特定餐廳、美食街或景觀餐廳等,我將很樂意為你提供更具體的建議和介紹!
+Response Time: 0.67 seconds
+Retrieval Similarity Score: 0.8497
+Answer Similarity Score: 0.8772
+--------------------------------------------------
+Question 9: 老人家的票多少錢? 要在哪裡買
+Original Answer: 提供您觀景台的優惠票(樂齡/軍警消/愛心/學生)購票資訊,票價為300元,參觀樓層89F、88F、91F(視天候狀況開放)。
+點選網址即可進行購票:
+1.適用於台灣身分證件持有者,請攜帶中華民國有效身分證件/健保卡/護照/居留證/健保卡/戶口名簿/駕照/捷運記名敬老卡(擇一)以利查驗
+2.115公分以下兒童免費(不限國籍),中華民國學齡前(6歲以下)兒童出示證件(如健保卡/學生卡/戶籍謄本)免費,需由一位購票家長陪同
+3.愛心票入場須主動出示本人身心障礙手冊,一般票的愛心票的陪同者(本國籍)可有一位享有優惠票價資格(敬老票、軍警消票無陪伴價)
+4.每位至101樓參觀須加價380元
+5.敬老票與身心障礙者請至人工櫃檯購票。
+RAG Answer: 很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝。
+Response Time: 0.52 seconds
+Retrieval Similarity Score: 0.0000
+Answer Similarity Score: 0.7482
+--------------------------------------------------
+Question 10: 台北101品牌
+Original Answer: 台北101擁有多樣化的品牌,包括國際珠寶腕錶、國際精品、鞋包配飾、流行服飾、美妝保養品以及各種餐飲選擇。您可以從台北101品牌列表中查詢您想要尋找的店家相關資訊: 
+<a target="_blank" href="https://www.taipei-101.com.tw/tw/shopping/floor">https://www.taipei-101.com.tw/tw/shopping/floor</a> 
+RAG Answer: 我的回覆是: 台北101的品牌眾多,涵蓋服飾、美妝保養、珠寶腕錶、精品、鞋包配件及各式餐飲選擇。欲查詢特定店家的資訊,可參考台北101品牌清單:<a target,《blank》href="https://www.taipei-101.com.tw/tw/shopping/floor">https://www.taipei-101.com.tw/tw/shopping/floor</a>。
+Response Time: 14.56 seconds
+Retrieval Similarity Score: 0.8435
+Answer Similarity Score: 0.9572
+--------------------------------------------------

+ 7 - 0
RAG/README.md

@@ -0,0 +1,7 @@
+#### 101 RAG chatbot
+- Using OpenAI Embeddings
+- Using FAISS index
+- Using TAIDE LLM model (llama 3 version)
+
+#### To run the code
+`./run.sh`

File diff ditekan karena terlalu besar
+ 1 - 0
RAG/log_record_rows.csv


+ 27 - 5
RAG/main.py

@@ -1,5 +1,7 @@
 import time
 import pandas as pd
+import os
+from dotenv import load_dotenv
 from config import (
     current_dir, CSV_FILE, system_prompt, 
     EMBEDDINGS_FILE, FAISS_INDEX_FILE
@@ -7,21 +9,30 @@ from config import (
 from langchain.globals import set_llm_cache
 from langchain_community.cache import SQLiteCache
 from embeddings import load_embeddings
-from rag_chain import get_context, simple_rag_prompt, calculate_similarity
+from rag_chain import simple_rag_prompt, calculate_similarity, get_context
+
+
+# Load environment variables
+load_dotenv('environment.env')
 
 # Set up cache
 set_llm_cache(SQLiteCache(database_path=".langchain.db"))
 
 def main():
-    # 測試前N個問題
-    n = 8
+    # Number of questions to test
+    n = 10
+    
+    # Load embeddings and index
     embeddings, docs, df, index = load_embeddings()
     
+    # Define retrieval chain
     retrieval_chain = lambda q: get_context(q, index, docs)
     
-    csv_path = f"{current_dir}/{CSV_FILE}"
+    # Load questions from CSV
+    csv_path = os.path.join(current_dir, CSV_FILE)
     qa_df = pd.read_csv(csv_path)
     
+    # Output file
     output_file = 'rag_output.txt'
     
     with open(output_file, 'w', encoding='utf-8') as f:
@@ -30,13 +41,23 @@ def main():
                 question = qa_df.iloc[i]['question']
                 original_answer = qa_df.iloc[i]['answer']
                 
+                print(f"Processing question {i+1}: {question}")
+                
                 start_time = time.time()
                 rag_answer, similarity_score = simple_rag_prompt(retrieval_chain, question)
                 end_time = time.time()
                 
                 response_time = end_time - start_time
-                answer_similarity = calculate_similarity(original_answer, rag_answer)
+                # answer_similarity = calculate_similarity(original_answer, rag_answer)
+
+                # Check if rag_answer is a string before calculating similarity
+                if isinstance(rag_answer, str):
+                    answer_similarity = calculate_similarity(original_answer, rag_answer)
+                else:
+                    answer_similarity = 0
+                    print(f"Warning: RAG answer for question {i+1} is not a string. Answer: {rag_answer}")
                 
+                # Write results to file
                 f.write(f"Question {i+1}: {question}\n")
                 f.write(f"Original Answer: {original_answer}\n")
                 f.write(f"RAG Answer: {rag_answer}\n")
@@ -48,6 +69,7 @@ def main():
                 f.flush()
                 print(f"Processed question {i+1}")
                 
+                # Add a small delay to avoid rate limiting
                 time.sleep(1) 
             except Exception as e:
                 print(f"Error processing question {i+1}: {str(e)}")

TEMPAT SAMPAH
RAG/qa_embeddings.pkl


TEMPAT SAMPAH
RAG/qa_faiss_index.bin


+ 23 - 9
RAG/rag_chain.py

@@ -8,22 +8,27 @@ from langchain_openai import OpenAIEmbeddings
 from sklearn.metrics.pairwise import cosine_similarity
 import os
 
-
-
 taide_llm = OllamaChatModel(model_name="taide-local-3")
 
 def get_context(query, index, docs):
     results = similarity_search(query, index, docs)
+    if not results:
+        return "", 0  # Return empty context and zero similarity when no results are found
+
     context = "\n".join([doc.page_content for doc, _ in results])
 
-    # 印出問題和搜尋到的文檔的前幾個字
     print(f"Question: {query}")
     print("Retrieved documents:")
     for i, (doc, similarity) in enumerate(results):
         print(f"Doc {i+1} (similarity: {similarity:.4f}): {doc.page_content[:50]}...")
     print("-" * 50)
     
-    return context, results[0][1] if results else (context, 0)  # Return context and top similarity score
+    return context, results[0][1]  # Return context and top similarity score
+
+def remove_repetitions(text):
+    sentences = text.split('。')
+    unique_sentences = list(dict.fromkeys(sentences))
+    return '。'.join(unique_sentences)
 
 def simple_rag_prompt(retrieval_chain, question):
     template = """Answer the following question based on this context:
@@ -32,13 +37,21 @@ def simple_rag_prompt(retrieval_chain, question):
 
     Question: {question}
     Output in user's language. If the question is in zh-tw, then the output will be in zh-tw. If the question is in English, then the output will be in English.
-    You should not mention anything about "根據提供的文件內容" or other similar terms. Do not mention anything relate with the Documents or context.
-    If you don't know the answer, just say that "很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝。I'm sorry I cannot answer your question. Please send your question to test@email.com for further assistance. Thank you."
+    Do not repeat the question in your response. 
+    For each individual answer, try to not provide duplicated sentences.
+    Do not start the response with "我的回答是:" or anything similar.
+    You should not mention anything about "根據提供的文件內容" or other similar terms. 
+    Do not mention anything relate with the Documents or context.
+    DO not mention anything relate with the prompt, such as "這個回答是根據所提供的對話上下文而產生的,假如對話內容有改變,則回答內容也需隨之調整。若不確定答案,應說:「很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝」。若沒有必要,則不需在回答中提及「根據提供的文件內容」或類似的字樣。若對話是以英語進行,則輸出應為英文;否則,則為繁體中文。" or anything similar.
+    If you are unsure of the answer, say: "很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝"
     """
 
     prompt = ChatPromptTemplate.from_template(template)
     context, similarity_score = retrieval_chain(question)
 
+    if not context:
+        return "很抱歉,目前我無法回答您的問題,請將您的詢問發送至 test@email.com 以便獲得更進一步的幫助,謝謝。", 0
+
     final_rag_chain = (
         {"context": lambda x: context, 
         "question": lambda x: x} 
@@ -49,11 +62,12 @@ def simple_rag_prompt(retrieval_chain, question):
 
     try:
         answer = final_rag_chain.invoke(question)
-        answer = remove_unwanted_content(answer)  # 使用 remove_unwanted_content
+        answer = remove_unwanted_content(answer)
+        answer = remove_repetitions(answer)
         return answer, similarity_score
     except Exception as e:
-        print(f"Error invoking rag_chain: {e}")
-        return "Error occurred while processing the question.", 0
+        print(f"Error in simple_rag_prompt: {e}")
+        return f"Error occurred while processing the question: {str(e)}", similarity_score
 
 def calculate_similarity(text1, text2):
     embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("OPENAI_API_KEY"))

+ 153 - 0
RAG/requirements.txt

@@ -0,0 +1,153 @@
+aiohttp==3.9.5
+aiosignal==1.3.1
+annotated-types==0.7.0
+anyio==4.4.0
+appdirs==1.4.4
+asgiref==3.8.1
+async-timeout==4.0.3
+attrs==23.2.0
+backoff==2.2.1
+bcrypt==4.2.0
+build==1.2.1
+cachetools==5.4.0
+certifi==2024.7.4
+charset-normalizer==3.3.2
+chroma-hnswlib==0.7.6
+chromadb==0.5.5
+click==8.1.7
+coloredlogs==15.0.1
+dataclasses-json==0.6.7
+datasets==2.20.0
+Deprecated==1.2.14
+deprecation==2.1.0
+dill==0.3.8
+distro==1.9.0
+dnspython==2.6.1
+email_validator==2.2.0
+exceptiongroup==1.2.2
+faiss-cpu==1.8.0.post1
+fastapi==0.111.1
+fastapi-cli==0.0.4
+filelock==3.15.4
+flatbuffers==24.3.25
+frozenlist==1.4.1
+fsspec==2024.5.0
+google-auth==2.32.0
+googleapis-common-protos==1.63.2
+gotrue==2.6.0
+grpcio==1.65.1
+h11==0.14.0
+h2==4.1.0
+hpack==4.0.0
+httpcore==1.0.5
+httptools==0.6.1
+httpx==0.27.0
+huggingface-hub==0.24.0
+humanfriendly==10.0
+hyperframe==6.0.1
+idna==3.7
+importlib_metadata==8.0.0
+importlib_resources==6.4.0
+Jinja2==3.1.4
+joblib==1.4.2
+jsonpatch==1.33
+jsonpointer==3.0.0
+kubernetes==30.1.0
+langchain==0.2.10
+langchain-chroma==0.1.2
+langchain-community==0.2.9
+langchain-core==0.2.28
+langchain-openai==0.1.20
+langchain-text-splitters==0.2.2
+langsmith==0.1.93
+markdown-it-py==3.0.0
+MarkupSafe==2.1.5
+marshmallow==3.21.3
+mdurl==0.1.2
+mmh3==4.1.0
+monotonic==1.6
+mpmath==1.3.0
+multidict==6.0.5
+multiprocess==0.70.16
+mypy-extensions==1.0.0
+nest-asyncio==1.6.0
+numpy==1.26.4
+oauthlib==3.2.2
+onnxruntime==1.18.1
+openai==1.37.0
+opentelemetry-api==1.26.0
+opentelemetry-exporter-otlp-proto-common==1.26.0
+opentelemetry-exporter-otlp-proto-grpc==1.26.0
+opentelemetry-instrumentation==0.47b0
+opentelemetry-instrumentation-asgi==0.47b0
+opentelemetry-instrumentation-fastapi==0.47b0
+opentelemetry-proto==1.26.0
+opentelemetry-sdk==1.26.0
+opentelemetry-semantic-conventions==0.47b0
+opentelemetry-util-http==0.47b0
+orjson==3.10.6
+overrides==7.7.0
+packaging==24.1
+pandas==2.2.2
+postgrest==0.16.9
+posthog==3.5.0
+protobuf==4.25.4
+psycopg2-binary==2.9.9
+pyarrow==17.0.0
+pyarrow-hotfix==0.6
+pyasn1==0.6.0
+pyasn1_modules==0.4.0
+pydantic==2.8.2
+pydantic_core==2.20.1
+Pygments==2.18.0
+pypdf==4.3.1
+PyPDF2==3.0.1
+PyPika==0.48.9
+pyproject_hooks==1.1.0
+pysbd==0.3.4
+python-dateutil==2.9.0.post0
+python-dotenv==1.0.1
+python-multipart==0.0.9
+pytz==2024.1
+PyYAML==6.0.1
+ragas==0.1.13
+realtime==1.0.6
+redis==5.0.7
+regex==2024.5.15
+requests==2.32.3
+requests-oauthlib==2.0.0
+rich==13.7.1
+rsa==4.9
+scikit-learn==1.5.1
+scipy==1.13.1
+shellingham==1.5.4
+six==1.16.0
+sniffio==1.3.1
+SQLAlchemy==2.0.31
+sqlparse==0.5.1
+starlette==0.37.2
+storage3==0.7.7
+StrEnum==0.4.15
+supabase==2.5.3
+supafunc==0.4.7
+sympy==1.13.1
+tenacity==8.5.0
+threadpoolctl==3.5.0
+tiktoken==0.7.0
+tokenizers==0.19.1
+tomli==2.0.1
+tqdm==4.66.4
+typer==0.12.3
+typing-inspect==0.9.0
+typing_extensions==4.12.2
+tzdata==2024.1
+urllib3==2.2.2
+uvicorn==0.30.3
+uvloop==0.19.0
+watchfiles==0.22.0
+websocket-client==1.8.0
+websockets==12.0
+wrapt==1.16.0
+xxhash==3.4.1
+yarl==1.9.4
+zipp==3.19.2

+ 5 - 5
RAG/run.sh

@@ -13,12 +13,12 @@ curl https://ollama.ai/install.sh | sh
 mkdir -p Modelfile
 mv taide-8b-a.3-q4_k_m.gguf Modelfile/
 ollama create taide-local-3 -f Modelfile
+## taide-local for llama2
 
-python embeddings.py
-python RAG.py
-
-# Make the script executable:
-# chmod +x run.sh
+## If embeddings has not been created 
+# python embeddings.py
+## If embedding was created
+python main.py
 
 
 

+ 3 - 1
RAG/text_processing.py

@@ -1,5 +1,5 @@
 def remove_unwanted_content(answer):
-    ## 可以試試用similarity score 排除這類詞
+    ## 可以試試用prompt排除
     unwanted_phrases = [
         "<<SYS>> 你是一個來自台灣的AI助理,名字叫TAIDE,樂於用繁體中文幫助使用者,會根據問題提供相關答案。> <</SYS>>",
         "TAIDE 敬上",
@@ -16,6 +16,8 @@ def remove_unwanted_content(answer):
         "這些信息是根據我所知道的最新資料提供的。",
         "如果您需要更詳細的資訊,建議您查看官方網站或直接聯繫相關單位。",
         "我很抱歉,作為AI助理,我無法知道您所提及的特定文件或上下文。",
+        "若無法自行判斷,請將問題寄送至test@email.com,我們將很樂意進一步協助您。",
+        "若您還有其他疑問,歡迎將問題寄至test@email.com以便獲得進一步協助。"
         "[/INST]",
         "[/ANS]"
     ]

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini