KIRA111B commited on
Commit
4a5b989
·
verified ·
1 Parent(s): f6734fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -115
app.py CHANGED
@@ -1,116 +1,115 @@
1
- # app.py
2
- import gradio as gr
3
- from langchain.prompts import PromptTemplate
4
- from langchain_community.embeddings import HuggingFaceBgeEmbeddings
5
- from langchain_community.vectorstores import FAISS
6
- from langchain.chains import RetrievalQA
7
- from langchain_community.llms import LlamaCpp
8
- from huggingface_hub import hf_hub_download
9
- import os
10
-
11
- # --- 1. 配置部分 ---
12
- VECTOR_STORE_PATH = "vector_store"
13
- EMBEDDING_MODEL = "BAAI/bge-large-zh-v1.5"
14
- GGUF_MODEL_REPO = "li-plus/chatglm3-6b-gguf"
15
- GGUF_MODEL_FILE = "chatglm3-6b.q4_0.gguf"
16
-
17
- # --- 2. 加载RAG核心管道 ---
18
- # 将所有耗时操作封装起来,只在应用启动时执行一次
19
- def load_rag_chain():
20
- print("开始加载RAG管道...")
21
-
22
- # 检查向量数据库是否存在
23
- if not os.path.exists(VECTOR_STORE_PATH):
24
- raise FileNotFoundError(
25
- f"错误:向量数据库文件夹 '{VECTOR_STORE_PATH}' 未找到!"
26
- "请确保你已经将本地生成的 'vector_store' 文件夹与 'app.py' 一起上传。"
27
- )
28
-
29
- # 加载Embedding模型
30
- print(f"--> 正在加载Embedding模型: {EMBEDDING_MODEL}")
31
- embeddings = HuggingFaceBgeEmbeddings(
32
- model_name=EMBEDDING_MODEL,
33
- model_kwargs={'device': 'cpu'},
34
- encode_kwargs={'normalize_embeddings': True}
35
- )
36
-
37
- # 加载本地的FAISS向量数据库
38
- print(f"--> 正在从 '{VECTOR_STORE_PATH}' 加载向量数据库...")
39
- vector_store = FAISS.load_local(
40
- VECTOR_STORE_PATH,
41
- embeddings,
42
- allow_dangerous_deserialization=True
43
- )
44
-
45
- # 从Hugging Face Hub下载GGUF模型文件
46
- print(f"--> 开始下载/加载GGUF模型: {GGUF_MODEL_FILE} from {GGUF_MODEL_REPO}")
47
- model_path = hf_hub_download(
48
- repo_id=GGUF_MODEL_REPO,
49
- filename=GGUF_MODEL_FILE,
50
- local_dir="models", # 模型会下载到服务器的这个文件夹
51
- local_dir_use_symlinks=False
52
- )
53
-
54
- # 初始化LlamaCpp模型加载器
55
- print("--> 模型文件准备就绪,正在初始化LlamaCpp...")
56
- llm = LlamaCpp(
57
- model_path=model_path,
58
- n_gpu_layers=0, # 强制在CPU上运行
59
- n_batch=512, # 批处理大小
60
- n_ctx=4096, # 上下文窗口大小
61
- f16_kv=True, # 对性能有帮助
62
- verbose=False # 设为False以保持日志干净
63
- )
64
-
65
- # 定义Prompt模板
66
- prompt_template = """System: 你是AI客服“粤小智”。请严格根据“背景知识”回答“用户问题”,语言通俗、步骤清晰。如果知识不足,请回答“抱歉,关于您的问题,我的知识库暂时没有相关信息。”
67
-
68
- 背景知识:
69
- {context}
70
-
71
- 用户问题:
72
- {question}
73
-
74
- 你的回答:
75
- """
76
- PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
77
-
78
- # 创建完整的RAG问答链
79
- qa_chain = RetrievalQA.from_chain_type(
80
- llm=llm,
81
- chain_type="stuff",
82
- retriever=vector_store.as_retriever(search_kwargs={"k": 3}), # 每次检索3个最相关的文档块
83
- chain_type_kwargs={"prompt": PROMPT},
84
- return_source_documents=False # 线上运行时不返回源文档
85
- )
86
-
87
- print("✅ RAG管道加载完毕,应用准备就绪!")
88
- return qa_chain
89
-
90
- # --- 3. Gradio应用逻辑 ---
91
- # 在应用启动时,执行一次加载操作
92
- RAG_CHAIN = load_rag_chain()
93
-
94
- # 定义与Gradio界面交互的函数
95
- def predict(message, history):
96
- print(f"收到用户消息: '{message}'")
97
- if not message:
98
- return ""
99
- result = RAG_CHAIN.invoke({"query": message})
100
- response = result.get('result', "抱歉,处理时出现内部错误。").strip()
101
- print(f"模型生成回答: '{response}'")
102
- return response
103
-
104
- # --- 4. 搭建并启动Gradio界面 ---
105
- with gr.Blocks(theme=gr.themes.Soft(), css=".gradio-container {background: linear-gradient(to right, #74ebd5, #ACB6E5)}") as demo:
106
- gr.Markdown("# 粤政云服务智能向导 - 我是粤小智 🤖")
107
- gr.ChatInterface(
108
- predict,
109
- title="粤小智客服",
110
- description="您好!可以向我提问关于粤政云平台使用的问题。",
111
- examples=["我想建个网站,该怎么申请服务器?", "如何重置我的云主机密码?", "我的应用访问变慢了怎么办?"]
112
- )
113
-
114
- print("正在启动Garamio界面...")
115
- # 使用queue()可以处理并发请求,让应用更稳定
116
  demo.queue().launch()
 
1
+ # app.py
2
+ import gradio as gr
3
+ from langchain.prompts import PromptTemplate
4
+ from langchain_community.embeddings import HuggingFaceBgeEmbeddings
5
+ from langchain_community.vectorstores import FAISS
6
+ from langchain.chains import RetrievalQA
7
+ from langchain_community.llms import LlamaCpp
8
+ from huggingface_hub import hf_hub_download
9
+ import os
10
+
11
+ # --- 1. 配置部分 ---
12
+ VECTOR_STORE_PATH = "vector_store"
13
+ EMBEDDING_MODEL = "BAAI/bge-large-zh-v1.5"
14
+ GGUF_MODEL_REPO = "li-plus/chatglm3-6b-gguf"
15
+ GGUF_MODEL_FILE = "chatglm3-6b.Q4_K_M.gguf"
16
+ # --- 2. 加载RAG核心管道 ---
17
+ # 将所有耗时操作封装起来,只在应用启动时执行一次
18
+ def load_rag_chain():
19
+ print("开始加载RAG管道...")
20
+
21
+ # 检查向量数据库是否存在
22
+ if not os.path.exists(VECTOR_STORE_PATH):
23
+ raise FileNotFoundError(
24
+ f"错误:向量数据库文件夹 '{VECTOR_STORE_PATH}' 未找到!"
25
+ "请确保你已经将本地生成的 'vector_store' 文件夹与 'app.py' 一起上传。"
26
+ )
27
+
28
+ # 加载Embedding模型
29
+ print(f"--> 正在加载Embedding模型: {EMBEDDING_MODEL}")
30
+ embeddings = HuggingFaceBgeEmbeddings(
31
+ model_name=EMBEDDING_MODEL,
32
+ model_kwargs={'device': 'cpu'},
33
+ encode_kwargs={'normalize_embeddings': True}
34
+ )
35
+
36
+ # 加载本地的FAISS向量数据库
37
+ print(f"--> 正在从 '{VECTOR_STORE_PATH}' 加载向量数据库...")
38
+ vector_store = FAISS.load_local(
39
+ VECTOR_STORE_PATH,
40
+ embeddings,
41
+ allow_dangerous_deserialization=True
42
+ )
43
+
44
+ # 从Hugging Face Hub下载GGUF模型文件
45
+ print(f"--> 开始下载/加载GGUF模型: {GGUF_MODEL_FILE} from {GGUF_MODEL_REPO}")
46
+ model_path = hf_hub_download(
47
+ repo_id=GGUF_MODEL_REPO,
48
+ filename=GGUF_MODEL_FILE,
49
+ local_dir="models", # 模型会下载到服务器的这个文件夹
50
+ local_dir_use_symlinks=False
51
+ )
52
+
53
+ # 初始化LlamaCpp模型加载器
54
+ print("--> 模型文件准备就绪,正在初始化LlamaCpp...")
55
+ llm = LlamaCpp(
56
+ model_path=model_path,
57
+ n_gpu_layers=0, # 强制在CPU上运行
58
+ n_batch=512, # 批处理大小
59
+ n_ctx=4096, # 上下文窗口大小
60
+ f16_kv=True, # 对性能有帮助
61
+ verbose=False # 设为False以保持日志干净
62
+ )
63
+
64
+ # 定义Prompt模板
65
+ prompt_template = """System: 你是AI客服“粤小智”。请严格根据“背景知识”回答“用户问题”,语言通俗、步骤清晰。如果知识不足,请回答“抱歉,关于您的问题,我的知识库暂时没有相关信息。”
66
+
67
+ 背景知识:
68
+ {context}
69
+
70
+ 用户问题:
71
+ {question}
72
+
73
+ 你的回答:
74
+ """
75
+ PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
76
+
77
+ # 创建完整的RAG问答链
78
+ qa_chain = RetrievalQA.from_chain_type(
79
+ llm=llm,
80
+ chain_type="stuff",
81
+ retriever=vector_store.as_retriever(search_kwargs={"k": 3}), # 每次检索3个最相关的文档块
82
+ chain_type_kwargs={"prompt": PROMPT},
83
+ return_source_documents=False # 线上运行时不返回源文档
84
+ )
85
+
86
+ print("✅ RAG管道加载完毕,应用准备就绪!")
87
+ return qa_chain
88
+
89
+ # --- 3. Gradio应用逻辑 ---
90
+ # 在应用启动时,执行一次加载操作
91
+ RAG_CHAIN = load_rag_chain()
92
+
93
+ # 定义与Gradio界面交互的函数
94
+ def predict(message, history):
95
+ print(f"收到用户消息: '{message}'")
96
+ if not message:
97
+ return ""
98
+ result = RAG_CHAIN.invoke({"query": message})
99
+ response = result.get('result', "抱歉,处理时出现内部错误。").strip()
100
+ print(f"模型生成回答: '{response}'")
101
+ return response
102
+
103
+ # --- 4. 搭建并启动Gradio界面 ---
104
+ with gr.Blocks(theme=gr.themes.Soft(), css=".gradio-container {background: linear-gradient(to right, #74ebd5, #ACB6E5)}") as demo:
105
+ gr.Markdown("# 粤政云服务智能向导 - 我是粤小智 🤖")
106
+ gr.ChatInterface(
107
+ predict,
108
+ title="粤小智客服",
109
+ description="您好!可以向我提问关于粤政云平台使用的问题。",
110
+ examples=["我想建个网站,该怎么申请服务器?", "如何重置我的云主机密码?", "我的应用访问变慢了怎么办?"]
111
+ )
112
+
113
+ print("正在启动Garamio界面...")
114
+ # 使用queue()可以处理并发请求,让应用更稳定
 
115
  demo.queue().launch()