Marathon23
commited on
Commit
•
c35ccd6
1
Parent(s):
dd40b1e
Update app.py
Browse files
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 |
-
#
|
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 |
-
#
|
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 |
-
#
|
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)
|