LLMs-from-scratch用户界面开发:构建交互式LLM应用
你还在为训练好的语言模型缺乏直观交互方式而烦恼吗?本文将带你从零开始,基于LLMs-from-scratch项目构建三种实用的交互式界面,无需复杂前端知识,通过简单Python代码即可实现ChatGPT式对话体验。读完本文后,你将掌握文本生成、情感分析和指令微调模型的界面开发全流程。
界面开发基础框架
LLMs-from-scratch项目采用Chainlit框架实现界面开发,这是一个轻量级Python库,专注于构建LLM应用的交互式界面。其核心优势在于:无需前端开发经验,通过装饰器和异步函数即可快速搭建实时交互界面;内置消息流式传输、历史记录管理和UI组件定制功能;与PyTorch生态无缝集成,支持GPU加速推理。
项目中所有界面代码均遵循"模型加载-消息处理-响应生成"的三段式架构:
# 核心架构示例 [ch05/06_user_interface/app_own.py](https://link.gitcode.com/i/6f10a1af0457d7953aafbc3716c922aa)
def get_model_and_tokenizer():
# 1. 加载模型配置与权重
# 2. 初始化分词器
# 3. 返回模型与配置对象
@chainlit.on_message
async def main(message: chainlit.Message):
# 1. 处理用户输入
# 2. 模型推理生成响应
# 3. 发送结果到界面
await chainlit.Message(content=response).send()
文本生成界面:从预训练模型到对话机器人
基础版文本生成界面
第五章提供了两种文本生成界面实现:基于OpenAI原版GPT-2权重的app_orig.py和使用自定义训练权重的app_own.py。两者主要区别在于模型加载部分:
# 加载自定义训练模型 [ch05/06_user_interface/app_own.py](https://link.gitcode.com/i/6f10a1af0457d7953aafbc3716c922aa)
model_path = Path("..") / "01_main-chapter-code" / "model.pth"
checkpoint = torch.load(model_path, weights_only=True)
model = GPTModel(GPT_CONFIG_124M)
model.load_state_dict(checkpoint)
运行流程:
- 安装依赖:
pip install -r ch05/06_user_interface/requirements-extra.txt - 启动服务:
chainlit run ch05/06_user_interface/app_own.py - 在浏览器访问http://localhost:8000即可开始对话
该界面支持温度参数调节和最大生成长度控制,适合展示基础语言模型的文本续写能力。界面设计遵循极简原则,左侧为消息历史区,右侧为控制面板,底部为输入框,整体布局与ChatGPT类似。
多轮对话增强版
Qwen3专项实现了支持上下文记忆的多轮对话界面qwen3-chat-interface-multiturn.py,通过维护对话历史列表实现上下文理解:
# 多轮对话历史管理 [ch05/11_qwen3/qwen3-chat-interface/qwen3-chat-interface-multiturn.py]
message_history = [
{"role": "system", "content": "你是一个 helpful 的助手"}
]
@chainlit.on_message
async def main(message: chainlit.Message):
message_history.append({"role": "user", "content": message.content})
# 构建包含历史的完整prompt
response = generate_response(message_history)
message_history.append({"role": "assistant", "content": response})
运行该界面需要先执行standalone-qwen3.ipynb生成模型文件,支持0.6B参数规模的Qwen3模型,相比基础版GPT-2具有更好的中文理解能力和对话连贯性。
分类任务界面:情感分析交互系统
第六章实现了基于微调模型的情感分析界面app.py,将文本生成模型改造为情感分类器。核心改动在于输出层改造和推理逻辑:
# 分类模型加载 [ch06/04_user_interface/app.py](https://link.gitcode.com/i/e7edd201b56dfc5d29400f1682e095fe)
model = GPTModel(GPT_CONFIG_124M)
# 将生成头替换为分类头
model.out_head = torch.nn.Linear(in_features=GPT_CONFIG_124M["emb_dim"], out_features=2)
checkpoint = torch.load(model_path, map_location=device, weights_only=True)
model.load_state_dict(checkpoint)
分类推理流程:
# 情感分析推理 [ch06/04_user_interface/app.py](https://link.gitcode.com/i/e7edd201b56dfc5d29400f1682e095fe)
label = classify_review(
user_input,
model,
tokenizer,
device,
max_length=120
)
该界面针对电影评论情感分析优化,用户输入评论后会返回"正面"或"负面"判断。测试示例:
- 输入:"这部电影情节紧凑,演员表演出色,绝对值得一看!" → 输出:"正面"
- 输入:"剧情拖沓,特效廉价,浪费两小时。" → 输出:"负面"
指令微调界面:构建专业问答系统
第七章提供的指令微调模型界面app.py引入了结构化prompt和响应提取机制,使模型能理解并执行具体指令:
# 指令格式处理 [ch07/06_user_interface/app.py](https://link.gitcode.com/i/192aa400b8fa95ed70c464bfa1f7a4e6)
prompt = f"""Below is an instruction that describes a task. Write a response
that appropriately completes the request.
### Instruction:
{message.content}
"""
token_ids = generate(
model=model,
idx=text_to_token_ids(prompt, tokenizer).to(device),
max_new_tokens=35,
context_size=model_config["context_length"],
eos_id=50256
)
response = extract_response(text, prompt)
该界面使用355M参数的指令微调模型,特别优化了指令跟随能力,支持翻译、摘要、问答等多种任务:
- 翻译任务:"将'人工智能正在改变世界'翻译成英文"
- 摘要任务:"总结以下文本的主要观点:..."
- 知识问答:"解释什么是注意力机制"
高级界面定制与部署优化
界面个性化设置
Chainlit支持通过config.toml文件定制界面外观:
[UI]
title = "LLM交互界面"
description = "基于LLMs-from-scratch的自定义界面"
icon = "📝"
[MODEL]
max_new_tokens = 100
temperature = 0.7
Qwen3界面进一步实现了品牌定制,通过public/logo_dark.webp和public/logo_light.webp实现深色/浅色模式的logo切换。
性能优化技巧
- 模型加载优化:使用
torch.inference_mode()和半精度推理减少内存占用 - 推理速度提升:启用KV缓存加速序列生成ch04/03_kv_cache
- 资源监控:添加GPU内存使用监控,避免OOM错误
# 简单性能监控示例
def print_gpu_usage():
print(f"GPU Memory Used: {torch.cuda.memory_allocated()/1024**3:.2f} GB")
常见问题与解决方案
模型加载失败
最常见问题是未先运行对应章节的训练代码生成模型文件:
- 文本生成界面需要先执行ch05/01_main-chapter-code/ch05.ipynb
- 情感分析界面依赖ch06/01_main-chapter-code/ch06.ipynb生成的review_classifier.pth
- 指令微调界面需要ch07/01_main-chapter-code/ch07.ipynb的训练输出
界面响应缓慢
- 检查是否启用GPU加速:
print(device)应输出"cuda" - 降低max_new_tokens参数减少生成长度
- 使用更小配置的模型:如将GPT-2 medium换成small版本
总结与扩展方向
本文介绍的三种界面覆盖了LLM应用的主要场景:基础文本生成、特定任务分类和指令遵循对话。这些实现均可作为起点进行扩展:
- 功能增强:添加语音输入输出、文件上传处理
- 多模态扩展:集成图像生成模型实现文生图界面
- 部署优化:使用FastAPI+Chainlit构建生产级服务
所有代码均位于项目的各章节user_interface目录下,建议按以下顺序学习:
- ch05/06_user_interface:基础文本生成
- ch06/04_user_interface:分类任务界面
- ch07/06_user_interface:指令微调模型界面
- ch05/11_qwen3/qwen3-chat-interface:多轮对话高级实现
通过这些界面,你可以直观展示模型能力、收集用户反馈并进行快速迭代优化,为LLM应用开发提供完整的原型验证方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



