Marathon23 commited on
Commit
c35ccd6
1 Parent(s): dd40b1e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -18
app.py CHANGED
@@ -9,20 +9,28 @@ from langchain_community.document_loaders import PyMuPDFLoader, PyPDFLoader
9
  from langchain.vectorstores import Chroma
10
  from langchain_community.embeddings import OpenAIEmbeddings
11
  from langchain_community.chat_models import ChatOpenAI
12
- import shutil
13
  import logging
14
 
15
- # 設置日誌
16
  logging.basicConfig(level=logging.INFO)
17
  logger = logging.getLogger(__name__)
18
 
19
- # 向量資料庫目錄
 
 
 
 
 
 
 
 
20
  VECTORDB_DIR = os.path.abspath("./data")
21
  os.makedirs(VECTORDB_DIR, exist_ok=True)
22
- os.chmod(VECTORDB_DIR, 0o755)
23
  logger.info(f"VECTORDB_DIR set to: {VECTORDB_DIR}")
24
 
25
- # 測試 PDF 加載器
26
  def test_pdf_loader(file_path, loader_type='PyMuPDFLoader'):
27
  logger.info(f"Testing PDF loader ({loader_type}) with file: {file_path}")
28
  try:
@@ -42,7 +50,7 @@ def test_pdf_loader(file_path, loader_type='PyMuPDFLoader'):
42
  except Exception as e:
43
  logger.error(f"Error loading {file_path} with {loader_type}: {e}")
44
 
45
- # 載入和處理 PDF 文件
46
  def load_and_process_documents(file_paths, loader_type='PyMuPDFLoader', api_key=None):
47
  if not api_key:
48
  raise ValueError("未提供 OpenAI API 密鑰。")
@@ -65,6 +73,7 @@ def load_and_process_documents(file_paths, loader_type='PyMuPDFLoader', api_key=
65
  loaded_docs = loader.load()
66
  if loaded_docs:
67
  logger.info(f"載入 {file_path} 成功,包含 {len(loaded_docs)} 個文檔。")
 
68
  logger.info(f"第一個文檔內容: {loaded_docs[0].page_content[:500]}")
69
  documents.extend(loaded_docs)
70
  else:
@@ -87,7 +96,7 @@ def load_and_process_documents(file_paths, loader_type='PyMuPDFLoader', api_key=
87
 
88
  # 初始化向量資料庫
89
  try:
90
- embeddings = OpenAIEmbeddings(openai_api_key=api_key)
91
  logger.info("初始化 OpenAIEmbeddings 成功。")
92
  except Exception as e:
93
  raise ValueError(f"初始化 OpenAIEmbeddings 時出現錯誤: {e}")
@@ -104,7 +113,7 @@ def load_and_process_documents(file_paths, loader_type='PyMuPDFLoader', api_key=
104
 
105
  return vectordb
106
 
107
- # 聊天處理函數
108
  def handle_query(user_message, chat_history, vectordb, api_key):
109
  try:
110
  if not user_message:
@@ -138,22 +147,15 @@ def handle_query(user_message, chat_history, vectordb, api_key):
138
  logger.error(f"Error in handle_query: {e}")
139
  return chat_history + [("系統", f"出現錯誤: {str(e)}")]
140
 
141
- # 保存 API 密鑰的函數
142
  def save_api_key(api_key, state):
143
  if not api_key.startswith("sk-"):
144
  return "請輸入有效的 OpenAI API 密鑰。", state
145
- # 嘗試驗證 API 密鑰
146
- try:
147
- openai.api_key = api_key
148
- openai.Engine.list() # 簡單的 API 請求來驗證密鑰
149
- except Exception as e:
150
- logger.error(f"Invalid OpenAI API key: {e}")
151
- return "無效的 OpenAI API 密鑰。請重新輸入。", state
152
  state['api_key'] = api_key
153
  logger.info("使用者已保存自己的 OpenAI API 密鑰。")
154
  return "API 密鑰已成功保存。您現在可以上傳 PDF 文件並開始提問。", state
155
 
156
- # 處理文件上傳的函數
157
  def process_files(files, state):
158
  logger.info("process_files called")
159
  if files:
@@ -206,7 +208,6 @@ def process_files(files, state):
206
  else:
207
  return "請上傳至少一個 PDF 文件。", state
208
 
209
- # 聊天介面處理函數
210
  def chat_interface(user_message, chat_history, state):
211
  vectordb = state.get('vectordb', None)
212
  api_key = state.get('api_key', None)
 
9
  from langchain.vectorstores import Chroma
10
  from langchain_community.embeddings import OpenAIEmbeddings
11
  from langchain_community.chat_models import ChatOpenAI
12
+ import shutil # 用於文件複製
13
  import logging
14
 
15
+ # 設置日誌配置
16
  logging.basicConfig(level=logging.INFO)
17
  logger = logging.getLogger(__name__)
18
 
19
+ # 獲取 OpenAI API 密鑰(初始不使用固定密鑰)
20
+ api_key_env = os.getenv("OPENAI_API_KEY")
21
+ if api_key_env:
22
+ openai.api_key = api_key_env
23
+ logger.info("OpenAI API 密鑰已設置。")
24
+ else:
25
+ logger.info("未設置固定的 OpenAI API 密鑰。將使用使用者提供的密鑰。")
26
+
27
+ # 確保向量資料庫目錄存在且有寫入權限
28
  VECTORDB_DIR = os.path.abspath("./data")
29
  os.makedirs(VECTORDB_DIR, exist_ok=True)
30
+ os.chmod(VECTORDB_DIR, 0o755) # 設置適當的權限
31
  logger.info(f"VECTORDB_DIR set to: {VECTORDB_DIR}")
32
 
33
+ # 定義測試 PDF 加載器的函數
34
  def test_pdf_loader(file_path, loader_type='PyMuPDFLoader'):
35
  logger.info(f"Testing PDF loader ({loader_type}) with file: {file_path}")
36
  try:
 
50
  except Exception as e:
51
  logger.error(f"Error loading {file_path} with {loader_type}: {e}")
52
 
53
+ # 定義載入和處理 PDF 文件的函數
54
  def load_and_process_documents(file_paths, loader_type='PyMuPDFLoader', api_key=None):
55
  if not api_key:
56
  raise ValueError("未提供 OpenAI API 密鑰。")
 
73
  loaded_docs = loader.load()
74
  if loaded_docs:
75
  logger.info(f"載入 {file_path} 成功,包含 {len(loaded_docs)} 個文檔。")
76
+ # 打印第一個文檔的部分內容以確認
77
  logger.info(f"第一個文檔內容: {loaded_docs[0].page_content[:500]}")
78
  documents.extend(loaded_docs)
79
  else:
 
96
 
97
  # 初始化向量資料庫
98
  try:
99
+ embeddings = OpenAIEmbeddings(openai_api_key=api_key) # 使用使用者的 API 密鑰
100
  logger.info("初始化 OpenAIEmbeddings 成功。")
101
  except Exception as e:
102
  raise ValueError(f"初始化 OpenAIEmbeddings 時出現錯誤: {e}")
 
113
 
114
  return vectordb
115
 
116
+ # 定義聊天處理函數
117
  def handle_query(user_message, chat_history, vectordb, api_key):
118
  try:
119
  if not user_message:
 
147
  logger.error(f"Error in handle_query: {e}")
148
  return chat_history + [("系統", f"出現錯誤: {str(e)}")]
149
 
150
+ # 定義保存 API 密鑰的函數
151
  def save_api_key(api_key, state):
152
  if not api_key.startswith("sk-"):
153
  return "請輸入有效的 OpenAI API 密鑰。", state
 
 
 
 
 
 
 
154
  state['api_key'] = api_key
155
  logger.info("使用者已保存自己的 OpenAI API 密鑰。")
156
  return "API 密鑰已成功保存。您現在可以上傳 PDF 文件並開始提問。", state
157
 
158
+ # 定義 Gradio 的處理函數
159
  def process_files(files, state):
160
  logger.info("process_files called")
161
  if files:
 
208
  else:
209
  return "請上傳至少一個 PDF 文件。", state
210
 
 
211
  def chat_interface(user_message, chat_history, state):
212
  vectordb = state.get('vectordb', None)
213
  api_key = state.get('api_key', None)