FinGPT / app.py
jolchmo's picture
hf_token
0c5d74c
raw
history blame
3.84 kB
import gradio as gr
import spaces
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
import os
# 加载模型和tokenizer
model_name = "meta-llama/Meta-Llama-3-8B"
adapter_name = "FinGPT/fingpt-mt_llama3-8b_lora"
# 获取HF token(Spaces会自动提供)
hf_token = os.environ.get("HF_TOKEN") or os.environ.get("HUGGING_FACE_HUB_TOKEN")
print("正在加载模型...")
try:
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
token=hf_token
)
tokenizer.pad_token = tokenizer.eos_token
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True,
token=hf_token
)
model = PeftModel.from_pretrained(base_model, adapter_name)
model = model.eval()
print("模型加载完成!")
except Exception as e:
print(f"模型加载错误: {e}")
print("请确保在Spaces设置中添加了HF_TOKEN")
raise
@spaces.GPU
def chat(message, history):
"""
聊天函数,处理用户消息并返回模型响应
"""
# 构建对话历史
conversation = []
for user_msg, bot_msg in history:
conversation.append(f"User: {user_msg}")
conversation.append(f"Assistant: {bot_msg}")
conversation.append(f"User: {message}")
conversation.append("Assistant:")
prompt = "\n".join(conversation)
# 编码输入
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=2048)
inputs = {k: v.to(model.device) for k, v in inputs.items()}
# 生成响应
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.7,
top_p=0.9,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# 解码输出
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取助手的回复
if "Assistant:" in response:
response = response.split("Assistant:")[-1].strip()
return response
# 创建Gradio Chatbot界面
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# 🤖 FinGPT Chatbot
这是一个基于 **FinGPT/fingpt-mt_llama3-8b_lora** 模型的金融对话助手。
您可以询问关于金融市场、投资、经济分析等问题。
"""
)
chatbot = gr.Chatbot(
label="聊天记录",
height=500,
bubble_full_width=False
)
with gr.Row():
msg = gr.Textbox(
label="输入您的消息",
placeholder="在这里输入您的问题...",
scale=4
)
submit = gr.Button("发送", scale=1, variant="primary")
clear = gr.Button("清空对话历史")
gr.Examples(
examples=[
"什么是量化宽松政策?",
"如何评估一只股票的价值?",
"请解释一下技术分析中的MACD指标",
"当前市场环境下应该如何配置资产?"
],
inputs=msg
)
# 事件处理
def user_message(user_msg, history):
return "", history + [[user_msg, None]]
def bot_message(history):
user_msg = history[-1][0]
bot_response = chat(user_msg, history[:-1])
history[-1][1] = bot_response
return history
msg.submit(user_message, [msg, chatbot], [msg, chatbot], queue=False).then(
bot_message, chatbot, chatbot
)
submit.click(user_message, [msg, chatbot], [msg, chatbot], queue=False).then(
bot_message, chatbot, chatbot
)
clear.click(lambda: None, None, chatbot, queue=False)
if __name__ == "__main__":
demo.launch()