基于LLMs与LangChain开发学习导师的作业提醒功能技术问询
学习导师应用作业定时提醒功能实现思路
一、核心功能拆解
- 定时触发提醒:基于对话交互节点或预设时间发起作业完成情况询问
- 回复意图识别:精准判断学生回复对应的作业状态(已完成/未完成需延后/未完成需即时协助/无关内容)
- 动态调整提醒策略:根据学生反馈更新后续提醒的时间间隔或终止提醒流程
二、具体实现步骤
1. 对话上下文与作业状态存储
- 基于LangChain的对话内存扩展自定义字段,用来记录作业跟踪状态(待提醒/已提醒待回复/已完成/需再次提醒)和下次提醒时间戳,多用户场景推荐用
SQLChatMessageHistory实现持久化存储 - 示例代码:
from langchain.memory import ConversationBufferMemory from langchain.memory.chat_message_histories import SQLChatMessageHistory from datetime import datetime, timedelta # 扩展内存结构,添加作业跟踪字段 class HomeworkTrackingMemory(ConversationBufferMemory): def __init__(self, user_id, **kwargs): # 绑定用户专属的对话历史存储 chat_history = SQLChatMessageHistory(session_id=user_id, connection_string="sqlite:///chat_history.db") super().__init__(chat_memory=chat_history, **kwargs) self.homework_status = "pending" # pending/reminded/completed/need_remind_again self.next_remind_time = None self.max_remind_count = 3 self.current_remind_count = 0 # 初始化某用户的内存 user_memory = HomeworkTrackingMemory(user_id="student_001", memory_key="chat_history", return_messages=True)
2. 定时提醒触发逻辑
有两种触发方式,可根据场景选择:
- 对话内触发:每次学生发起对话时,先检查当前时间是否超过
next_remind_time,同时判断提醒次数未达上限,满足条件则自动插入提醒话术 - 后台定时任务:用
APScheduler调度工具,根据存储的next_remind_time主动推送提醒(需结合Websocket或消息通知机制) - 对话内触发示例:
def check_and_trigger_remind(memory): current_time = datetime.now() if (memory.homework_status == "need_remind_again" and current_time >= memory.next_remind_time and memory.current_remind_count < memory.max_remind_count): # 插入提醒消息到对话历史 memory.chat_memory.add_ai_message("请问你完成之前布置的作业了吗?") memory.homework_status = "reminded" memory.current_remind_count += 1 return True return False
3. 学生回复意图识别
直接通过LLM做意图分类,用简洁的prompt明确任务,避免歧义:
- 示例prompt:
请根据用户回复判断对应的作业状态,仅返回编号: 1. 已完成:明确表示作业已做完 2. 未完成需延后:未完成且希望过段时间再提醒 3. 未完成需协助:未完成且希望立即得到作业相关帮助 4. 无关内容:回复与作业完成情况无关 用户回复:{{user_input}}
- 解析回复后更新状态的代码示例:
def update_homework_status(memory, llm, user_input): prompt = f"""请根据用户回复判断对应的作业状态,仅返回编号: 1. 已完成:明确表示作业已做完 2. 未完成需延后:未完成且希望过段时间再提醒 3. 未完成需协助:未完成且希望立即得到作业相关帮助 4. 无关内容:回复与作业完成情况无关 用户回复:{user_input}""" response = llm.predict(prompt).strip() if response == "1": memory.homework_status = "completed" memory.next_remind_time = None elif response == "2": memory.homework_status = "need_remind_again" # 默认设置2小时后再次提醒,可根据学生需求调整 memory.next_remind_time = datetime.now() + timedelta(hours=2) elif response == "3": # 切换到作业辅导流程,暂不设置后续提醒 memory.homework_status = "reminded" elif response == "4": # 不改变当前跟踪状态 pass
4. 整合到LangChain对话链
将状态检查和更新逻辑嵌入对话交互的前置、后置环节:
from langchain.chains import ConversationChain from langchain.llms import OpenAI llm = OpenAI(temperature=0) conversation = ConversationChain(llm=llm, memory=user_memory, verbose=True) def handle_user_input(user_id, user_input): # 初始化/获取用户的作业跟踪内存 memory = HomeworkTrackingMemory(user_id=user_id, memory_key="chat_history", return_messages=True) # 前置检查:触发提醒(如果满足条件) check_and_trigger_remind(memory) # 处理用户输入生成回复 ai_response = conversation.predict(input=user_input) # 后置更新:根据用户回复调整作业跟踪状态 update_homework_status(memory, llm, user_input) return ai_response
三、关键优化点
- 状态持久化:多用户场景下必须用数据库存储作业跟踪状态,不能仅依赖内存,避免服务重启后数据丢失
- 提醒频率控制:设置最大提醒次数阈值,防止过度打扰学生,同时支持学生自定义提醒间隔
- 意图识别准确性:可在prompt中加入few-shot示例(比如“示例:用户说‘我还没写完,下午再问我’→返回2”),提升LLM分类准确率
内容的提问来源于stack exchange,提问作者m0j1
相关产品推荐
相关产品推荐

