import json from typing import List, Dict from openai import OpenAI from redis import Redis from app.api.article_director.article_schemas import UserArticleRequest from settings import settings SYSTEM_PROMPT = """ # 背景 你是一个人工智能助手,名字叫EduChat,是一个由华东师范大学开发的教育领域大语言模型。 # 对话主题:作文指导 ## 作文指导主题的要求: EduChat你需要扮演一位经验丰富的语文老师,现在需要帮助一位学生审阅作文并给出修改建议。请按照以下步骤进行: 整体评价:先对作文的整体质量进行简要评价,指出主要优点和需要改进的方向。 亮点分析:具体指出作文中的亮点(如结构、描写、情感表达等方面的优点)。 具体修改建议:针对作文中的不足,从以下几个方面提出具体修改建议,并给出修改后的示例: 语言表达:是否生动、准确?有无冗余或重复?可以如何优化? 细节描写:是否足够具体?能否加入更多感官描写(视觉、听觉、嗅觉、触觉等)使画面更立体? 情感表达:情感是否自然?能否更深入或升华? 结构布局:段落衔接是否自然?开头结尾是否呼应? (注意:每个建议点都要结合原文具体句子进行分析,并给出修改后的句子或段落作为示例) 写作技巧提示:提供2-3条实用的写作技巧(如动态描写公式、感官交织法等),帮助学生举一反三。 修改效果总结:简要说明按照建议修改后,作文会有哪些方面的提升(如文学性、情感层次、场景沉浸感等)。 请用亲切、鼓励的语气进行点评,保持专业性同时让学生易于接受。 """ def chat_ecnu_request( session: List[Dict[str, str]], ): client = OpenAI( api_key=settings.ECNU_TEACH_AI_KEY, base_url="https://chat.ecnu.edu.cn/open/api/v1" ) completion = client.chat.completions.create( model="educhat-r1", messages=session, temperature=0.8, # 保持创造性 top_p=0.9, # 保持多样性 ) return completion def set_user_prompt(user_article: UserArticleRequest, article_lang: str): user_prompt = f"以下是我的{article_lang}作文,作文体裁为{user_article.article_type},请帮我修改:{user_article.title_content}" return user_prompt async def get_session(redis_client: Redis, user_id: str) -> List[Dict[str, str]]: """从 Redis 读取对话上下文""" data = await redis_client.get(f"session:{user_id}") if data: return json.loads(data) else: # 如果没有记录,创建带 system prompt 的初始会话 return [{"role": "system", "content": SYSTEM_PROMPT}] async def save_session(redis_client: Redis, user_id: str, session: List[Dict[str, str]]): """保存对话上下文到 Redis""" await redis_client.setex(f"session:{user_id}", 86400, json.dumps(session)) async def reset_session(redis_client: Redis, user_id: str): """清空用户上下文""" await redis_client.delete(f"session:{user_id}")