跳到主要内容
基于 Qwen1.5-0.5B-Chat 的轻量级教育助手开发 | 极客日志
Python AI 算法
基于 Qwen1.5-0.5B-Chat 的轻量级教育助手开发 如何使用 Qwen1.5-0.5B-Chat 轻量级模型构建教育对话助手。通过 ModelScope 加载模型,结合 Flask 搭建 Web 服务,实现本地 CPU 环境下的快速部署。内容涵盖环境配置、核心推理引擎编写、前端界面设计及运行测试,适合资源受限场景下的 AI 应用集成。
修罗 发布于 2026/4/6 更新于 2026/5/23 58 浏览Qwen1.5-0.5B-Chat 教育助手开发:轻量模型集成实战教程
1. 引言:为什么选择这个'小'模型?
如果你正在寻找一个能快速集成到教育应用里的 AI 对话模型,但又担心模型太大、部署太麻烦、成本太高,那么你来对地方了。
今天我们要聊的,是阿里通义千问开源家族里最'苗条'的成员——Qwen1.5-0.5B-Chat 。别看它只有 5 亿参数,在动辄百亿、千亿参数的大模型时代显得有点'小巧',但在特定的教育辅助场景下,它却是一个'小而美'的绝佳选择。
想象一下这些场景:
你想给在线学习平台加一个智能答疑助手,回答学生关于课程内容的简单问题。
你需要一个能批改选择题、填空题,并给出简单解析的自动化工具。
你的应用运行在普通的云服务器甚至本地电脑上,没有强大的 GPU 支持。
在这些情况下,动辄需要几十 GB 显存的大模型就显得'杀鸡用牛刀'了。而 Qwen1.5-0.5B-Chat 就像一个专为轻量级任务定制的'瑞士军刀',部署简单、响应迅速、资源占用极低。
本教程将手把手带你,基于 ModelScope(魔塔社区)的生态,从零开始部署这个轻量模型,并搭建一个具备 Web 界面的教育对话助手。整个过程清晰明了,即使你之前没有太多 AI 模型部署经验,也能跟着一步步做下来。
我们的目标很简单:让你在 30 分钟内,拥有一个属于自己的、可运行的轻量级 AI 教育助手。
2. 项目核心:极简设计与开箱即用
在深入代码之前,我们先快速了解一下这个项目的几个关键设计思路,这能帮你更好地理解后续的每一步操作。
2.1 为什么是 ModelScope?
你可能听说过 Hugging Face,而**ModelScope(魔塔社区)**可以看作是国内 AI 开发者的'Hugging Face'。它由阿里云牵头,汇聚了大量优秀的中文预训练模型和数据集。
选择 ModelScope 作为模型来源,有三大好处:
下载速度快 :模型仓库在国内,无需科学上网,下载速度有保障。
官方认证 :Qwen 系列模型由阿里官方维护并发布在 ModelScope 上,保证了模型的正统性和安全性。
生态友好 :提供了完善的 Python SDK (modelscope),一行代码就能拉取模型,简化了部署流程。
2.2 模型选型:0.5B 参数够用吗?
这是一个很关键的问题。Qwen1.5-0.5B-Chat 是一个经过指令微调(Chat)的对话模型。它的能力边界很清晰:
擅长 :理解简单的指令、进行多轮基础对话、总结归纳、翻译、代码补全(基础语法)。
局限 :对于需要复杂逻辑推理、深度专业知识或生成长篇大论的任务,它的表现会不如更大的模型。
在教育场景中,它非常适合处理:
知识点问答('什么是勾股定理?')
作业题目解析(选择题、判断题)
学习计划建议
简单的代码调试提示
它的优势在于极低的资源消耗 。在 CPU 环境下,内存占用通常小于 2GB,响应速度在可接受范围内,非常适合集成到对实时性要求不高但需要稳定运行的服务中。
2.3 技术栈一览
整个项目用到的技术都非常主流和轻量:
环境 :Conda(管理 Python 环境,避免依赖冲突)
模型 :直接从 ModelScope 拉取 qwen/Qwen1.5-0.5B-Chat
推理 :PyTorch + Transformers 库(业界标准)
服务化 :Flask(轻量级 Web 框架,快速搭建 API 和界面)
交互 :简单的 HTML/JavaScript 前端,实现流式对话效果
这套组合拳确保了项目从安装到运行的每一步都尽可能简单。
3. 环境搭建:十分钟搞定基础
好了,理论部分先到这里,我们开始动手。请确保你有一台能够访问互联网的 Linux 或 macOS 电脑(Windows 用户建议使用 WSL2)。
3.1 第一步:安装 Miniconda(如果已有可跳过) Conda 是一个包和环境管理器,能让我们为这个项目创建一个干净的 Python 环境。
打开你的终端,执行以下命令下载并安装 Miniconda(以 Linux 为例):
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
安装完成后,在终端输入 conda --version,如果显示版本号,说明安装成功。
3.2 第二步:创建专属 Python 环境 我们创建一个名为 qwen_env 的独立环境,并安装指定版本的 Python(这里用 3.9,兼容性好)。
conda create -n qwen_env python=3.9 -y
conda activate qwen_env
激活后,你的命令行提示符前面应该会显示 (qwen_env),表示你已经在这个独立环境中了。之后所有操作都在这个环境下进行。
3.3 第三步:安装核心依赖库 现在我们来安装项目运行所需的 Python 库。我们将使用清华镜像源来加速下载。
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope transformers flask -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
注意 :如果你有 NVIDIA GPU 并想使用 GPU 加速,可以将最后一条命令替换为 CUDA 版本的 PyTorch 安装命令。但本教程以最通用的 CPU 部署为目标。
4. 核心代码:让模型'说话'的引擎 环境好了,我们来写代码。我们将创建两个核心文件:一个负责加载模型和推理,另一个负责启动 Web 服务。
4.1 模型加载与推理脚本 (model_engine.py) 首先,创建一个名为 model_engine.py 的文件。这个文件是 AI 助手的大脑。
from modelscope import AutoModelForCausalLM, AutoTokenizer
import torch
class QwenChatEngine :
"""Qwen1.5-0.5B-Chat 模型推理引擎"""
def __init__ (self, model_name="qwen/Qwen1.5-0.5B-Chat" ):
"""
初始化模型和分词器。
首次运行会自动从 ModelScope 下载模型,请保持网络通畅。
"""
print (f"正在加载模型:{model_name} ..." )
self .tokenizer = AutoTokenizer.from_pretrained(
model_name, trust_remote_code=True
)
self .model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="cpu" ,
torch_dtype=torch.float32,
trust_remote_code=True
)
self .model.eval ()
print ("模型加载完成!" )
def chat (self, user_input, history=None , max_length=512 ):
"""
与模型进行单轮对话。
参数:
user_input: 用户输入的文本
history: 之前的对话历史(格式见下文),如果是第一轮则为 None
max_length: 生成文本的最大长度
返回:
response: 模型的回复
updated_history: 更新后的对话历史
"""
if history is None :
history = []
formatted_prompt = self ._format_chat_prompt(user_input, history)
inputs = self .tokenizer(formatted_prompt, return_tensors="pt" )
with torch.no_grad():
outputs = self .model.generate(
inputs.input_ids,
max_new_tokens=max_length,
do_sample=True ,
temperature=0.8 ,
top_p=0.9
)
full_response = self .tokenizer.decode(outputs[0 ], skip_special_tokens=True )
response = self ._extract_new_response(formatted_prompt, full_response)
updated_history = history + [{"role" : "user" , "content" : user_input}, {"role" : "assistant" , "content" : response}]
return response, updated_history
def _format_chat_prompt (self, user_input, history ):
"""将对话历史格式化为模型接受的提示文本。"""
prompt = ""
for turn in history:
role = turn["role" ]
content = turn["content" ]
if role == "user" :
prompt += f"<|im_start|>user\n{content} <|im_end|>\n"
elif role == "assistant" :
prompt += f"<|im_start|>assistant\n{content} <|im_end|>\n"
prompt += f"<|im_start|>user\n{user_input} <|im_end|>\n"
prompt += "<|im_start|>assistant\n"
return prompt
def _extract_new_response (self, prompt, full_text ):
"""从完整生成文本中提取出模型本轮的新回复。"""
if full_text.startswith(prompt):
response = full_text[len (prompt):]
else :
response = full_text
response = response.replace("<|im_end|>" , "" ).strip()
return response
if __name__ == "__main__" :
engine = QwenChatEngine()
test_question = "请用简单的语言解释一下什么是人工智能?"
print (f"\n用户:{test_question} " )
response, history = engine.chat(test_question)
print (f"助手:{response} " )
follow_up = "它和机器学习有什么区别?"
print (f"\n用户:{follow_up} " )
response, history = engine.chat(follow_up, history)
print (f"助手:{response} " )
QwenChatEngine 类封装了模型加载和对话的核心逻辑。
__init__ 方法中,我们使用 modelscope 的 from_pretrained 函数加载模型和分词器。trust_remote_code=True 对于 Qwen 模型是必须的。
chat 方法是主要接口。它接收用户输入和之前的对话历史,返回模型回复和更新后的历史。
_format_chat_prompt 方法负责将对话转换成 Qwen1.5-Chat 模型能理解的特定格式(使用<|im_start|>和<|im_end|>标记)。
最后的 if __name__ == "__main__": 块是一个简单的测试,运行这个脚本可以直接看到模型的效果。
保存文件后,在终端(确保在 qwen_env 环境下)运行它:
第一次运行会从 ModelScope 下载模型(大约 1GB 左右),需要一些时间。下载完成后,你会看到模型对测试问题的回答。恭喜你,模型的核心引擎已经可以工作了!
4.2 Web 服务与界面脚本 (app.py) 模型能'说话'了,接下来我们给它一个'嘴巴'和'脸'——一个 Web 界面。创建 app.py 文件。
from flask import Flask, render_template, request, jsonify, Response
import json
from model_engine import QwenChatEngine
import time
app = Flask(__name__)
print ("初始化 AI 教育助手..." )
chat_engine = QwenChatEngine()
print ("AI 教育助手就绪!" )
conversation_histories = {}
def get_history (session_id ):
"""获取或创建指定会话的历史记录。"""
if session_id not in conversation_histories:
conversation_histories[session_id] = []
return conversation_histories[session_id]
@app.route('/' )
def index ():
"""渲染主聊天页面。"""
return render_template('index.html' )
@app.route('/chat' , methods=['POST' ] )
def chat ():
"""处理聊天请求的 API 接口。"""
data = request.json
user_message = data.get('message' , '' ).strip()
session_id = data.get('session_id' , 'default' )
if not user_message:
return jsonify({'error' : '消息不能为空' }), 400
history = get_history(session_id)
try :
bot_response, updated_history = chat_engine.chat(user_message, history)
conversation_histories[session_id] = updated_history
return jsonify({
'response' : bot_response,
'session_id' : session_id
})
except Exception as e:
app.logger.error(f"对话处理失败:{e} " )
return jsonify({'error' : '处理您的请求时出了点问题,请稍后再试。' }), 500
@app.route('/clear_history' , methods=['POST' ] )
def clear_history ():
"""清空指定会话的对话历史。"""
data = request.json
session_id = data.get('session_id' , 'default' )
if session_id in conversation_histories:
conversation_histories[session_id] = []
return jsonify({'status' : 'success' , 'message' : '历史记录已清空' })
@app.route('/stream_chat' , methods=['POST' ] )
def stream_chat ():
"""流式对话接口(示例,0.5B 模型生成快,流式效果不明显但展示方法)。"""
data = request.json
user_message = data.get('message' , '' ).strip()
session_id = data.get('session_id' , 'default' )
if not user_message:
return jsonify({'error' : '消息不能为空' }), 400
history = get_history(session_id)
def generate ():
bot_response, updated_history = chat_engine.chat(user_message, history)
conversation_histories[session_id] = updated_history
for word in bot_response.split():
yield f"data: {json.dumps({'token' : word + ' ' } )}\n\n"
time.sleep(0.05 )
yield "data: [DONE]\n\n"
return Response(generate(), mimetype='text/event-stream' )
if __name__ == '__main__' :
app.run(host='0.0.0.0' , port=8080 , debug=True )
这个文件创建了一个 Flask 应用,定义了三个主要路由:
/:提供聊天网页。
/chat:处理用户消息并返回 AI 回复的 API。
/clear_history:清空对话历史的 API。
/stream_chat:一个流式输出的示例接口(可选)。
4.3 聊天网页界面 (templates/index.html) Flask 默认会在 templates 文件夹里寻找 HTML 模板。所以我们需要创建这个文件夹和文件。
然后创建 templates/index.html 文件:
<!DOCTYPE html >
<html lang ="zh-CN" >
<head >
<meta charset ="UTF-8" >
<meta name ="viewport" content ="width=device-width, initial-scale=1.0" >
<title > 轻量级 AI 教育助手 - Qwen1.5-0.5B-Chat</title >
<style >
* { box-sizing : border-box; margin : 0 ; padding : 0 ; font-family : 'Segoe UI' , 'Microsoft YaHei' , sans-serif; }
body { background : linear-gradient (135deg , #f5f7fa 0% , #c3cfe2 100% ); min-height : 100vh ; padding : 20px ; }
.container { max-width : 900px ; margin : 0 auto; background-color : white; border-radius : 20px ; box-shadow : 0 15px 35px rgba (50 , 50 , 93 , 0.1 ), 0 5px 15px rgba (0 , 0 , 0 , 0.07 ); overflow : hidden; }
header { background : linear-gradient (90deg , #4776E6 0% , #8E54E9 100% ); color : white; padding : 30px ; text-align : center; }
header h1 { font-size : 2.2rem ; margin-bottom : 10px ; }
header p { opacity : 0.9 ; font-size : 1.1rem ; }
.chat-container { display : flex; flex-direction : column; height : 70vh ; }
#chat-history { flex : 1 ; padding : 25px ; overflow-y : auto; border-bottom : 1px solid #eee ; }
.message { margin-bottom : 20px ; display : flex; }
.user-message { justify-content : flex-end; }
.bot-message { justify-content : flex-start; }
.bubble { max-width : 75% ; padding : 15px 20px ; border-radius : 20px ; line-height : 1.5 ; word-wrap : break-word; }
.user-bubble { background-color : #4776E6 ; color : white; border-bottom-right-radius : 5px ; }
.bot-bubble { background-color : #f0f2f5 ; color : #333 ; border-bottom-left-radius : 5px ; }
.input-area { padding : 20px ; display : flex; gap : 12px ; }
#user-input { flex : 1 ; padding : 18px 20px ; border : 2px solid #e1e5eb ; border-radius : 12px ; font-size : 1rem ; resize : none; transition : border 0.3s ; }
#user-input :focus { outline : none; border-color : #8E54E9 ; }
button { padding : 18px 30px ; background : linear-gradient (90deg , #4776E6 0% , #8E54E9 100% ); color : white; border : none; border-radius : 12px ; font-size : 1rem ; font-weight : 600 ; cursor : pointer; transition : transform 0.2s , box-shadow 0.2s ; }
button :hover { transform : translateY (-2px ); box-shadow : 0 7px 14px rgba (50 , 50 , 93 , 0.1 ), 0 3px 6px rgba (0 , 0 , 0 , 0.08 ); }
button :disabled { background : #cccccc ; cursor : not-allowed; transform : none; box-shadow : none; }
.controls { padding : 0 20px 20px ; display : flex; justify-content : space-between; }
.typing-indicator { display : none; padding : 10px 20px ; color : #666 ; font-style : italic; }
.info-box { background-color : #f8f9fa ; border-left : 4px solid #4776E6 ; padding : 15px ; margin : 20px ; border-radius : 8px ; font-size : 0.9rem ; color : #555 ; }
footer { text-align : center; padding : 20px ; color : #777 ; font-size : 0.9rem ; border-top : 1px solid #eee ; }
</style >
</head >
<body >
<div class ="container" >
<header >
<h1 > 🤖 轻量级 AI 教育助手</h1 >
<p > 基于 Qwen1.5-0.5B-Chat 模型 | 本地 CPU 部署 | 极简对话体验</p >
</header >
<div class ="info-box" >
<strong > 使用提示:</strong > 这是一个轻量级模型,擅长回答基础知识、解释概念、辅助学习规划等。对于复杂或专业问题,回答可能较为简略。你可以尝试问:'帮我制定一个学习 Python 的一周计划'或'解释一下牛顿第一定律'。
</div >
<div class ="chat-container" >
<div id ="chat-history" >
<div class ="message bot-message" >
<div class ="bubble bot-bubble" > 你好!我是基于 Qwen1.5-0.5B 模型打造的轻量级 AI 教育助手。我可以帮你解答学习问题、解释概念或进行简单的对话。有什么可以帮你的吗?</div >
</div >
</div >
<div class ="typing-indicator" id ="typing" > 助手正在思考...</div >
<div class ="input-area" >
<textarea id ="user-input" placeholder ="输入你的问题或想聊的话题..." rows ="2" > </textarea >
<button id ="send-btn" onclick ="sendMessage()" > 发送</button >
</div >
</div >
<div class ="controls" >
<button onclick ="clearHistory()" > 清空对话</button >
<div > 会话 ID: <span id ="session-id" > default</span > </div >
</div >
<footer >
<p > Powered by Qwen1.5-0.5B-Chat & ModelScope | 本服务运行于本地 CPU 环境</p >
</footer >
</div >
<script >
const sessionId = 'default_' + Math .random ().toString (36 ).substr (2 , 9 );
document .getElementById ('session-id' ).textContent = sessionId;
function addMessage (content, isUser ) {
const historyDiv = document .getElementById ('chat-history' );
const messageDiv = document .createElement ('div' );
messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message' } ` ;
const bubbleDiv = document .createElement ('div' );
bubbleDiv.className = `bubble ${isUser ? 'user-bubble' : 'bot-bubble' } ` ;
bubbleDiv.textContent = content;
messageDiv.appendChild (bubbleDiv);
historyDiv.appendChild (messageDiv);
historyDiv.scrollTop = historyDiv.scrollHeight ;
}
function showTyping (show ) {
document .getElementById ('typing' ). . = show ? : ;
}
( ) {
inputField = . ( );
button = . ( );
message = inputField. . ();
(!message) ;
button. = ;
(message, );
inputField. = ;
( );
{
response = ( , {
: ,
: { : },
: . ({ : message, : sessionId })
});
data = response. ();
(response. ) {
(data. , );
} {
( , );
}
} (error) {
. ( , error);
( , );
} {
( );
button. = ;
inputField. ();
}
}
( ) {
{
( , {
: ,
: { : },
: . ({ : sessionId })
});
historyDiv = . ( );
historyDiv. = ;
} (error) {
( );
}
}
. ( ). ( , ( ) {
(e. === && !e. && !e. ) {
e. ();
();
}
});
. ( ). ( , ( ) {
. . = ;
. . = ( . ) + ;
});
</script >
</body >
</html >
这个 HTML 文件创建了一个干净、现代的聊天界面,包含:
一个显示对话历史的区域。
一个文本输入框和发送按钮。
清空对话历史的功能。
一些简单的交互效果(如打字指示器)。
5. 运行与测试:启动你的 AI 助手
5.1 启动 Flask 服务 在终端中,确保你在项目根目录(即 app.py 所在的目录),并且 qwen_env 环境已激活,然后运行:
初始化 AI 教育助手...
正在加载模型:qwen/Qwen1.5-0.5B-Chat ...
模型加载完成!
AI 教育助手就绪!
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8080
* Running on http://你的服务器 IP:8080
Press CTRL+C to quit
5.2 访问 Web 界面 打开你的浏览器,访问 http://127.0.0.1:8080(如果你在本地运行)或 http://你的服务器 IP:8080(如果你在远程服务器运行)。
你将看到我们刚刚设计的聊天界面。系统已经自动发送了一条欢迎消息。
5.3 进行对话测试 现在,尝试问它一些问题,体验一下这个轻量级助手的能力:
基础知识问答 :
你:'什么是光合作用?'
你:'勾股定理怎么证明?'
学习建议 :
你:'我想学习 Python,该怎么开始?'
你:'如何提高英语听力?'
简单推理 :
你:'如果小明有 5 个苹果,吃了 2 个,又买了 3 个,他现在有几个苹果?'
代码帮助 (基础):
你:'用 Python 写一个打印'Hello World'的程序。'
注意 :由于是 0.5B 的小模型,请对它的能力有合理预期。它的回答通常简洁、直接,对于非常开放或复杂的问题,可能无法给出深度或创造性的回答。它的优势在于快速、轻量和在特定领域的可用性。
6. 总结与展望 恭喜你!你已经成功部署并运行了一个基于 Qwen1.5-0.5B-Chat 的轻量级 AI 教育助手。让我们回顾一下整个过程,并看看未来可以如何扩展。
6.1 本教程回顾
环境准备 :使用 Conda 创建了独立的 Python 环境,安装了所有必要的依赖。
模型集成 :利用 ModelScope SDK,用几行代码就拉取并加载了官方的 Qwen1.5-0.5B-Chat 模型。
核心引擎开发 :编写了 model_engine.py,封装了模型的加载、对话格式处理和推理逻辑。
服务化与交互 :使用 Flask 搭建了 Web 后端 (app.py) 和一个美观的前端界面 (index.html),提供了完整的对话体验。
部署运行 :一键启动服务,并通过浏览器进行交互测试。
整个项目的核心优势在于 '轻量' 和 '易用' 。模型参数少,部署门槛低,非常适合作为大型应用的辅助功能模块,或者用于原型验证和教育演示。
6.2 可能遇到的问题与解决思路
问题:模型下载速度慢或失败。
解决 :检查网络连接。ModelScope 仓库在国内,通常速度较快。如果确实很慢,可以尝试配置镜像源,或者手动下载模型文件到本地,然后修改 model_engine.py 中的 model_name 为本地路径。
问题:运行时报错,提示缺少某些库。
解决 :根据错误信息,使用 pip install 安装缺失的包。确保你始终在 qwen_env 环境下操作。
问题:模型回复速度慢。
解决 :这是 CPU 推理的固有特点。你可以尝试在 engine.chat() 方法中调小 max_length 参数(比如 256),限制生成文本的长度以加快速度。对于生产环境,考虑使用更强大的 CPU 或支持 GPU 的服务器。
问题:前端界面无法访问。
解决 :检查 Flask 服务是否成功启动(端口 8080),检查防火墙设置是否允许该端口的访问。
6.3 下一步可以做什么? 这个基础版本已经可以工作,但你可以根据需求让它变得更强大:
增加会话管理 :目前历史记录存在内存里,服务器重启就没了。可以集成 SQLite 或 Redis 来持久化存储不同用户的对话历史。
添加流式输出 :教程中 /stream_chat 接口是一个简单示例。你可以深入研究 Transformers 库的 streamer 参数,实现真正的 token-by-token 流式输出,让体验更流畅。
集成知识库(RAG) :这是提升小模型专业能力的关键。你可以为它接入一个向量数据库(如 Chroma、Milvus),里面存储课程资料、文档。当用户提问时,先从中检索相关片段,再连同问题和片段一起送给模型生成答案,这样能极大提升回答的准确性和专业性。
模型微调 :如果你有特定领域(如某门课程)的问答数据,可以使用 LoRA 等轻量级微调技术,在 Qwen1.5-0.5B-Chat 的基础上进行微调,让它成为该领域的'专家'。
封装为 API 服务 :将 app.py 中的路由进一步完善,提供标准的 RESTful API,方便其他应用(如移动 App、微信小程序)调用。
尝试更大模型 :如果你有 GPU 资源,可以轻松地将代码中的模型名称换成 qwen/Qwen1.5-7B-Chat 或 qwen/Qwen1.5-14B-Chat,获得更强大的对话能力,代码几乎无需改动。
希望这个教程为你打开了一扇门,让你看到将前沿 AI 模型以极简的方式集成到自己的项目中是如此触手可及。从这个小而美的助手开始,去探索和创造更多的可能性吧。
style
display
'block'
'none'
async
function
sendMessage
const
document
getElementById
'user-input'
const
document
getElementById
'send-btn'
const
value
trim
if
return
disabled
true
addMessage
true
value
''
showTyping
true
try
const
await
fetch
'/chat'
method
'POST'
headers
'Content-Type'
'application/json'
body
JSON
stringify
message
session_id
const
await
json
if
ok
addMessage
response
false
else
addMessage
`错误:${data.error || '未知错误' } `
false
catch
console
error
'请求失败:'
addMessage
'抱歉,网络或服务出现异常,请稍后重试。'
false
finally
showTyping
false
disabled
false
focus
async
function
clearHistory
try
await
fetch
'/clear_history'
method
'POST'
headers
'Content-Type'
'application/json'
body
JSON
stringify
session_id
const
document
getElementById
'chat-history'
innerHTML
`
<div class="message bot-message">
<div class="bubble bot-bubble">对话历史已清空。我是基于 Qwen1.5-0.5B 模型打造的轻量级 AI 教育助手。我可以帮你解答学习问题、解释概念或进行简单的对话。有什么可以帮你的吗?</div>
</div>`
catch
alert
'清空历史记录失败,请刷新页面重试。'
document
getElementById
'user-input'
addEventListener
'keydown'
function
e
if
key
'Enter'
ctrlKey
shiftKey
preventDefault
sendMessage
document
getElementById
'user-input'
addEventListener
'input'
function
this
style
height
'auto'
this
style
height
this
scrollHeight
'px'
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online