ljy5946 commited on
Commit
c126f3f
·
verified ·
1 Parent(s): 74a4890

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -89
app.py CHANGED
@@ -1,109 +1,71 @@
1
- import os
2
- import gradio as gr
3
- import torch
4
- import logging
5
-
6
- # LangChain 0.1.x 系列的导入方式
7
  from langchain_chroma import Chroma
8
- from langchain.embeddings import HuggingFaceEmbeddings
9
  from langchain_community.llms import HuggingFacePipeline
10
  from langchain.chains import RetrievalQA
11
-
12
- # Transformers 库
13
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
14
 
15
  logging.basicConfig(level=logging.INFO)
16
 
17
- # 设置路径
18
- # 直接使用 Hugging Face Hub 上的模型 ID,而不是本地缓存路径
19
- VECTOR_STORE_DIR = "./vector_store" # 这个目录用于 ChromaDB,我们保留
20
- MODEL_NAME = "uer/gpt2-chinese-cluecorpussmall" # <--- 修改这里!
21
- EMBEDDING_MODEL_NAME = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2" # <--- 修改这里!
22
 
23
- # 1. 轻量 LLM(uer/gpt2-chinese-cluecorpussmall)
24
- print("🔧 加载生成模型...")
25
- try:
26
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
27
- model = AutoModelForCausalLM.from_pretrained(
28
- MODEL_NAME,
29
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
30
- device_map="auto",
31
- )
32
- gen_pipe = pipeline(
33
- task="text-generation",
34
- model=model,
35
- tokenizer=tokenizer,
36
- max_new_tokens=256,
37
- temperature=0.5,
38
- top_p=0.9,
39
- do_sample=True,
40
- )
41
- llm = HuggingFacePipeline(pipeline=gen_pipe)
42
- print("✅ 生成模型加载成功。")
43
- except Exception as e:
44
- logging.error(f"加载生成模型失败: {e}", exc_info=True)
45
- llm = None
46
- print("❌ 生成模型加载失败,应用可能无法正常工作。")
47
 
48
- # 2. 向量库和嵌入模型
49
- print("📚 加载向量库和嵌入模型...")
50
- try:
51
- embeddings = HuggingFaceEmbeddings(
52
- model_name=EMBEDDING_MODEL_NAME
53
- )
54
- vectordb = Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings)
55
- print("✅ 向量库加载成功。")
56
- except Exception as e:
57
- logging.error(f"加载向量库失败: {e}", exc_info=True)
58
- vectordb = None
59
- print("❌ 向量库加载失败,RAG功能将无法使用。")
60
 
61
- # 3. RAG 问答链
62
- qa_chain = None
63
- if llm and vectordb:
64
- try:
65
- retriever = vectordb.as_retriever(search_kwargs={"k": 3})
66
- qa_chain = RetrievalQA.from_chain_type(
67
- llm=llm,
68
- chain_type="stuff",
69
- retriever=retriever,
70
- return_source_documents=True
71
- )
72
- print("✅ RAG问答链构建成功。")
73
- except Exception as e:
74
- logging.error(f"构建RAG问答链失败: {e}", exc_info=True)
75
- print("❌ RAG问答链构建失败。")
76
 
77
- # 4. 业务函数
78
- def qa_fn(query):
79
  if not query.strip():
80
  return "❌ 请输入问题内容。"
81
- if not qa_chain:
82
- return "⚠️ 问答系统未完全加载,请稍后再试或检查日志。"
83
- try:
84
- result = qa_chain({"query": query})
85
- answer = result["result"]
86
- sources = result.get("source_documents", [])
87
- sources_text = "\n\n".join(
88
- [f"【片段 {i+1}】\n" + doc.page_content for i, doc in enumerate(sources)]
89
- )
90
- return f"📌 回答:{answer.strip()}\n\n📚 参考:\n{sources_text}"
91
- except Exception as e:
92
- logging.exception("问答失败:%s", e)
93
- return f"❌ 出现错误:{str(e)}\n请检查日志获取更多信息。"
94
 
95
- # 5. Gradio UI
96
- with gr.Blocks(title="数学知识问答助手", theme=gr.themes.Base()) as demo:
97
  gr.Markdown("## 📘 数学知识问答助手\n输入教材相关问题,例如:“什么是函数的定义域?”")
98
  with gr.Row():
99
- query_input = gr.Textbox(label="问题", placeholder="请输入你的问题", lines=2)
100
- output_box = gr.Textbox(label="回答", lines=15)
101
- submit_btn = gr.Button("提问")
102
-
103
- submit_btn.click(fn=qa_fn, inputs=query_input, outputs=output_box)
104
-
105
- gr.Markdown("---\n模型:uer/gpt2-chinese-cluecorpussmall + Chroma RAG | Powered by Hugging Face Spaces")
106
 
107
  if __name__ == "__main__":
108
  demo.launch()
109
 
 
 
1
+ import os, gradio as gr, torch, logging
 
 
 
 
 
2
  from langchain_chroma import Chroma
3
+ from langchain_community.embeddings import HuggingFaceEmbeddings # ← 新路径
4
  from langchain_community.llms import HuggingFacePipeline
5
  from langchain.chains import RetrievalQA
 
 
6
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
7
 
8
  logging.basicConfig(level=logging.INFO)
9
 
10
+ VECTOR_STORE_DIR = "./vector_store"
11
+ MODEL_NAME = "uer/gpt2-chinese-cluecorpussmall"
12
+ EMBEDDING_MODEL_NAME = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
 
 
13
 
14
+ # ─── 1. 加载 LLM ───
15
+ print("🔧 加载生成模型…")
16
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
17
+ model = AutoModelForCausalLM.from_pretrained(
18
+ MODEL_NAME,
19
+ torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
20
+ device_map="auto",
21
+ )
22
+ gen_pipe = pipeline(
23
+ task="text-generation",
24
+ model=model,
25
+ tokenizer=tokenizer,
26
+ max_new_tokens=256,
27
+ temperature=0.5,
28
+ top_p=0.9,
29
+ do_sample=True,
30
+ )
31
+ llm = HuggingFacePipeline(pipeline=gen_pipe)
 
 
 
 
 
 
32
 
33
+ # ─── 2. 加载向量库 ───
34
+ print("📚 加载向量库…")
35
+ embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL_NAME)
36
+ vectordb = Chroma(persist_directory=VECTOR_STORE_DIR, embedding_function=embeddings)
 
 
 
 
 
 
 
 
37
 
38
+ # ─── 3. 构建 RAG 问答链 ───
39
+ retriever = vectordb.as_retriever(search_kwargs={"k": 3})
40
+ qa_chain = RetrievalQA.from_chain_type(
41
+ llm=llm,
42
+ chain_type="stuff",
43
+ retriever=retriever,
44
+ return_source_documents=True,
45
+ )
 
 
 
 
 
 
 
46
 
47
+ # ─── 4. 业务函数 ───
48
+ def qa_fn(query: str):
49
  if not query.strip():
50
  return "❌ 请输入问题内容。"
51
+ result = qa_chain({"query": query})
52
+ answer = result["result"]
53
+ sources = result.get("source_documents", [])
54
+ sources_text = "\n\n".join(
55
+ [f"【片段 {i+1}】\n{doc.page_content}" for i, doc in enumerate(sources)]
56
+ )
57
+ return f"📌 回答:{answer.strip()}\n\n📚 参考:\n{sources_text}"
 
 
 
 
 
 
58
 
59
+ # ─── 5. Gradio UI ───
60
+ with gr.Blocks(title="数学知识问答助手") as demo:
61
  gr.Markdown("## 📘 数学知识问答助手\n输入教材相关问题,例如:“什么是函数的定义域?”")
62
  with gr.Row():
63
+ query = gr.Textbox(label="问题", placeholder="请输入你的问题", lines=2)
64
+ answer = gr.Textbox(label="回答", lines=15)
65
+ gr.Button("提问").click(qa_fn, inputs=query, outputs=answer)
66
+ gr.Markdown("---\n模型:gpt2-chinese-cluecorpus + Chroma RAG\nPowered by Hugging Face Spaces")
 
 
 
67
 
68
  if __name__ == "__main__":
69
  demo.launch()
70
 
71
+