Phi-3-mini-128k-instruct入门教程Chainlit中添加用户反馈评分与迭代机制1. 准备工作与环境搭建1.1 确认模型部署状态在开始之前我们需要确认Phi-3-mini-128k-instruct模型已经通过vLLM成功部署。可以通过以下命令检查服务状态cat /root/workspace/llm.log如果看到类似Model loaded successfully的日志信息说明模型已经准备就绪。1.2 安装Chainlit确保你的Python环境中已经安装了Chainlit。如果没有安装可以使用pip进行安装pip install chainlit2. 基础Chainlit应用搭建2.1 创建基础应用文件创建一个名为app.py的文件这是我们的Chainlit应用入口。添加以下基础代码import chainlit as cl from vllm import LLM, SamplingParams # 初始化vLLM模型 llm LLM(modelPhi-3-mini-128k-instruct) sampling_params SamplingParams(temperature0.7, top_p0.9) cl.on_message async def main(message: cl.Message): # 使用vLLM生成响应 response llm.generate([message.content], sampling_params) # 发送响应 await cl.Message(contentresponse[0].outputs[0].text).send()2.2 启动Chainlit应用运行以下命令启动Chainlit应用chainlit run app.py -w启动后在浏览器中打开显示的URL通常是http://localhost:8000你将看到一个简单的聊天界面可以输入问题并获取模型的回答。3. 添加用户反馈评分功能3.1 修改应用代码收集反馈我们需要修改app.py来添加用户反馈功能。以下是更新后的代码import chainlit as cl from vllm import LLM, SamplingParams import json import os # 初始化vLLM模型 llm LLM(modelPhi-3-mini-128k-instruct) sampling_params SamplingParams(temperature0.7, top_p0.9) # 反馈数据存储文件 FEEDBACK_FILE feedback_data.json cl.on_message async def main(message: cl.Message): # 使用vLLM生成响应 response llm.generate([message.content], sampling_params) model_response response[0].outputs[0].text # 发送响应并添加反馈按钮 feedback_elements [ cl.Button(namegood, valuegood, label 有帮助), cl.Button(namebad, valuebad, label 没帮助) ] await cl.Message( contentmodel_response, elementsfeedback_elements ).send() cl.on_button_click async def handle_feedback(button_click: cl.ButtonClick): # 获取当前对话上下文 current_message button_click.message # 准备反馈数据 feedback_data { user_query: current_message.content, model_response: current_message.elements[0].content, feedback: button_click.value, timestamp: str(cl.utils.get_timestamp()) } # 存储反馈数据 if not os.path.exists(FEEDBACK_FILE): with open(FEEDBACK_FILE, w) as f: json.dump([feedback_data], f) else: with open(FEEDBACK_FILE, r) as f: data json.load(f) data.append(feedback_data) f.seek(0) json.dump(data, f) # 确认反馈已收到 await cl.Message(contentf感谢您的反馈您选择了{button_click.value}).send()3.2 反馈界面展示当用户与模型交互后每条回复下方会显示两个按钮 有帮助和 没帮助。用户点击任一按钮后系统会记录这次交互的详细信息包括用户的问题模型的回答用户选择的反馈类型时间戳这些数据会被保存到feedback_data.json文件中供后续分析使用。4. 实现迭代改进机制4.1 分析反馈数据我们可以定期分析收集到的反馈数据找出模型表现不佳的案例。创建一个新的Python脚本analyze_feedback.pyimport json from collections import defaultdict FEEDBACK_FILE feedback_data.json def analyze_feedback(): with open(FEEDBACK_FILE, r) as f: data json.load(f) # 统计反馈比例 feedback_counts defaultdict(int) for entry in data: feedback_counts[entry[feedback]] 1 print(f总反馈数: {len(data)}) print(f正面反馈: {feedback_counts[good]} ({(feedback_counts[good]/len(data))*100:.1f}%)) print(f负面反馈: {feedback_counts[bad]} ({(feedback_counts[bad]/len(data))*100:.1f}%)) # 找出常见负面反馈案例 bad_feedbacks [entry for entry in data if entry[feedback] bad] print(\n常见负面反馈案例:) for i, entry in enumerate(bad_feedbacks[:5], 1): print(f{i}. 用户问题: {entry[user_query]}) print(f 模型回答: {entry[model_response]}\n) if __name__ __main__: analyze_feedback()4.2 基于反馈优化模型根据分析结果我们可以采取多种优化措施提示工程优化调整系统提示词引导模型给出更符合用户期望的回答参数调整修改temperature、top_p等生成参数微调数据收集将负面反馈案例整理为微调数据集用户偏好学习根据用户反馈调整回答风格以下是优化后的app.py示例加入了基于反馈的动态参数调整import chainlit as cl from vllm import LLM, SamplingParams import json import os # 初始化vLLM模型 llm LLM(modelPhi-3-mini-128k-instruct) # 反馈数据存储文件 FEEDBACK_FILE feedback_data.json # 动态参数 dynamic_params { temperature: 0.7, top_p: 0.9, recent_feedback_ratio: 0.5 # 默认值 } def update_params_based_on_feedback(): if not os.path.exists(FEEDBACK_FILE): return with open(FEEDBACK_FILE, r) as f: data json.load(f) if len(data) 10: # 至少10个反馈才开始调整 return # 计算最近20个反馈的正面比例 recent_feedbacks data[-20:] good_count sum(1 for f in recent_feedbacks if f[feedback] good) ratio good_count / len(recent_feedbacks) # 根据反馈比例调整参数 dynamic_params[recent_feedback_ratio] ratio if ratio 0.3: # 负面反馈较多 dynamic_params[temperature] max(0.3, dynamic_params[temperature] - 0.1) dynamic_params[top_p] max(0.7, dynamic_params[top_p] - 0.1) elif ratio 0.7: # 正面反馈较多 dynamic_params[temperature] min(1.0, dynamic_params[temperature] 0.1) dynamic_params[top_p] min(0.95, dynamic_params[top_p] 0.1) cl.on_message async def main(message: cl.Message): # 基于最新反馈更新参数 update_params_based_on_feedback() # 使用动态参数生成响应 sampling_params SamplingParams( temperaturedynamic_params[temperature], top_pdynamic_params[top_p] ) response llm.generate([message.content], sampling_params) model_response response[0].outputs[0].text # 发送响应并添加反馈按钮 feedback_elements [ cl.Button(namegood, valuegood, label 有帮助), cl.Button(namebad, valuebad, label 没帮助), cl.Text(namesuggestion, displayinline, placeholder(可选) 您希望如何改进回答?) ] await cl.Message( contentmodel_response, elementsfeedback_elements ).send() cl.on_button_click async def handle_feedback(button_click: cl.ButtonClick): # 获取用户建议文本 suggestion None for element in button_click.message.elements: if element.name suggestion and element.value: suggestion element.value # 准备反馈数据 feedback_data { user_query: button_click.message.content, model_response: button_click.message.elements[0].content, feedback: button_click.value, suggestion: suggestion, timestamp: str(cl.utils.get_timestamp()), params: { temperature: dynamic_params[temperature], top_p: dynamic_params[top_p] } } # 存储反馈数据 if not os.path.exists(FEEDBACK_FILE): with open(FEEDBACK_FILE, w) as f: json.dump([feedback_data], f) else: with open(FEEDBACK_FILE, r) as f: data json.load(f) data.append(feedback_data) f.seek(0) json.dump(data, f) # 确认反馈已收到 await cl.Message(contentf感谢您的反馈您选择了{button_click.value}).send()5. 总结与进阶建议5.1 本教程实现的核心功能通过本教程我们成功在Chainlit应用中为Phi-3-mini-128k-instruct模型添加了以下功能用户反馈评分系统/反馈数据收集与存储基于反馈的动态参数调整用户建议收集功能5.2 进阶优化方向要进一步改进系统可以考虑实时监控面板创建一个Dashboard实时显示反馈统计和模型表现自动微调流程当负面反馈达到阈值时自动触发模型微调用户个性化根据用户历史反馈调整回答风格多维度反馈除了有帮助/没帮助还可以收集准确性、相关性等维度的评分5.3 部署建议对于生产环境部署建议使用数据库如SQLite或MongoDB替代JSON文件存储反馈数据添加定期备份机制实现反馈数据的自动分析和报告生成考虑添加用户身份识别以支持个性化体验获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。