
Phi-3-vision-128k-instruct实操笔记Chainlit消息流定制与历史会话持久化1. 模型简介Phi-3-Vision-128K-Instruct 是一个轻量级的多模态模型支持文本和视觉数据的处理。作为Phi-3模型家族的一员它特别强调高质量的推理能力并支持长达128K的上下文长度。该模型经过监督微调和直接偏好优化在指令遵循和安全性方面表现出色。2. 环境准备与部署验证2.1 部署状态检查在开始使用前我们需要确认模型服务是否已成功部署。通过以下命令可以查看部署日志cat /root/workspace/llm.log如果看到类似下图的输出说明模型已成功加载并准备好接收请求2.2 Chainlit前端调用Chainlit是一个强大的前端框架可以方便地与我们的模型进行交互。启动Chainlit前端后你将看到如下界面3. 基础功能演示3.1 图文对话示例让我们尝试一个简单的图文对话。上传一张图片并提问图片中是什么模型会分析图片内容并给出回答如下图所示4. 消息流定制开发4.1 自定义消息处理器要实现消息流的定制我们需要修改Chainlit的处理器代码。以下是一个基本的消息处理示例cl.on_message async def process_message(message: cl.Message): # 获取用户上传的图片 if message.elements: image message.elements[0] image_path image.path # 调用Phi-3-vision模型处理 response await call_phi3_vision(image_path, message.content) # 发送响应消息 await cl.Message(contentresponse).send()4.2 流式响应实现为了实现更流畅的交互体验我们可以启用流式响应cl.on_message async def stream_response(message: cl.Message): # 创建消息流 msg cl.Message(content) await msg.send() # 模拟流式响应 for chunk in generate_response_stream(message): await msg.stream_token(chunk) # 完成消息 await msg.update()5. 历史会话持久化5.1 会话存储方案要实现历史会话的持久化我们可以选择以下几种存储方案本地文件存储简单易用适合小型应用数据库存储推荐使用SQLite或PostgreSQL云存储如AWS S3或阿里云OSS5.2 实现代码示例以下是一个使用SQLite存储会话历史的完整示例import sqlite3 from datetime import datetime def init_db(): conn sqlite3.connect(chat_history.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS conversations (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, timestamp DATETIME, input_text TEXT, response_text TEXT, image_path TEXT)) conn.commit() conn.close() cl.on_message async def save_conversation(message: cl.Message): # 初始化数据库 init_db() # 获取会话数据 user_id message.session_id timestamp datetime.now() input_text message.content image_path message.elements[0].path if message.elements else None # 调用模型获取响应 response await call_phi3_vision(image_path, input_text) # 存储到数据库 conn sqlite3.connect(chat_history.db) c conn.cursor() c.execute(INSERT INTO conversations VALUES (NULL,?,?,?,?,?), (user_id, timestamp, input_text, response, image_path)) conn.commit() conn.close() # 返回响应 await cl.Message(contentresponse).send()6. 高级功能扩展6.1 多轮对话支持通过持久化历史会话我们可以轻松实现多轮对话功能cl.on_message async def multi_turn_chat(message: cl.Message): # 获取历史会话 history get_chat_history(message.session_id) # 构建上下文 context \n.join([fUser: {h[input]}\nAI: {h[response]} for h in history[-5:]]) # 保留最近5轮对话 # 调用模型时传入历史上下文 response await call_phi3_vision_with_context( message.elements[0].path if message.elements else None, message.content, context ) # 存储并返回响应 save_conversation(message.session_id, message.content, response) await cl.Message(contentresponse).send()6.2 自定义UI组件Chainlit允许我们添加丰富的自定义UI组件来增强用户体验cl.on_message async def enhanced_ui(message: cl.Message): # 创建带有多媒体组件的消息 response cl.Message(content) await response.send() # 添加文本内容 await response.stream_token(这是图片分析结果\n\n) # 添加分析结果表格 analysis_results [ [对象, 置信度, 位置], [猫, 98%, 左上角], [沙发, 95%, 中央] ] await response.stream_token(cl.Html( table .join([tr .join([ftd{cell}/td for cell in row]) /tr for row in analysis_results]) /table )) # 完成消息 await response.update()7. 总结通过本文的实践我们实现了以下功能基础调用成功部署并验证了Phi-3-vision-128k-instruct模型的基本图文对话功能消息定制开发了自定义的消息处理器实现了流式响应历史持久化采用SQLite数据库存储会话历史支持多轮对话UI增强添加了丰富的自定义组件提升用户体验这些技术可以广泛应用于客服系统、教育辅助、内容审核等多个场景。通过Chainlit的灵活框架我们可以快速构建出功能丰富、交互流畅的多模态应用。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。