diff --git a/AI/AiService/CallDeepSeekStream.py b/AI/AiService/CallDeepSeekStream.py index fc33df9e..6cf7c091 100644 --- a/AI/AiService/CallDeepSeekStream.py +++ b/AI/AiService/CallDeepSeekStream.py @@ -1,3 +1,5 @@ +import re + import uvicorn from fastapi import FastAPI, Body from fastapi.middleware.cors import CORSMiddleware @@ -18,6 +20,7 @@ client = OpenAI( base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) + def markdown_to_dict(markdown_content): """ 将 Markdown 内容转换为 Python 字典 @@ -29,6 +32,7 @@ def markdown_to_dict(markdown_content): # 将 JSON 字符串转换为字典 return json.loads(json_content) + def extract_level1(json_dict): """ 提取一级目录,生成指定格式的 JSON 对象列表 @@ -39,6 +43,7 @@ def extract_level1(json_dict): return [{"type": "cover", "data": {"title": level1_title, "text": ""}}] return [] + def extract_level2_and_level3(json_dict, level1_title=None): """ 提取指定一级目录下的二级目录及其三级目录内容,生成指定格式的 JSON 对象列表 @@ -81,6 +86,7 @@ def extract_level2_and_level3(json_dict, level1_title=None): return result return [] + def extract_contents(json_dict, level1_title=None): """ 提取所有二级目录名称,生成目录部分的 JSON 对象 @@ -95,6 +101,48 @@ def extract_contents(json_dict, level1_title=None): return {"type": "contents", "data": {"items": level2_titles}} return {"type": "contents", "data": {"items": []}} + +def expand_text_with_ai(json_dict): + """ + 调用 AI 扩写每个有 title 属性的节点,生成一句话描述并放到 text 属性上 + """ + + # 递归处理字典 + def process_dict(d): + if isinstance(d, dict): + for key, value in d.items(): + if key == "title" and isinstance(value, str): + # 基于全文和当前 title 生成一句话描述 + prompt = f"基于以下内容,为标题 '{value}' 生成一句话描述,言简意赅,不要使用标点符号:\n{json.dumps(json_dict, ensure_ascii=False)}" + # 调用 AI 生成描述 + response = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {"role": "system", "content": "你是一个教学经验丰富的基础教育教师"}, + {"role": "user", "content": prompt} + ], + temperature=0.7 + ) + # 提取生成的描述 + description = response.choices[0].message.content.strip() + # 去掉标点符号 + description = re.sub(r'[^\w\s]', '', description) + # 将描述赋值给 text 属性 + d["text"] = description + elif isinstance(value, dict): + process_dict(value) + elif isinstance(value, list): + for item in value: + process_dict(item) + elif isinstance(d, list): + for item in d: + process_dict(item) + + # 处理整个字典 + process_dict(json_dict) + return json_dict + + async def ConvertMarkdownToJson(markdown_content): """ 生成一个 AsyncIterable,逐行返回 JSON 字符串 @@ -102,6 +150,9 @@ async def ConvertMarkdownToJson(markdown_content): # 将 Markdown 转换为字典 json_dict = markdown_to_dict(markdown_content) + # 调用 AI 扩写每个有 title 属性的节点 + json_dict = expand_text_with_ai(json_dict) + # 提取一级目录 level1_json = extract_level1(json_dict) print(level1_json) @@ -125,6 +176,7 @@ async def ConvertMarkdownToJson(markdown_content): # 添加结束标记 yield '{"type": "end" }' + # 获取本机所有 IPv4 地址 def get_local_ips(): ips = [] @@ -140,6 +192,7 @@ def get_local_ips(): print(f"获取 IP 地址失败: {e}") return ips + # 流式生成数据的函数 async def generate_stream_markdown(course_name: str): """ @@ -150,7 +203,8 @@ async def generate_stream_markdown(course_name: str): model=MODEL_NAME, messages=[ {'role': 'system', 'content': '你是一个教学经验丰富的基础教育教师'}, - {'role': 'user', 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回,这个非常重要!2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容,不能省略。'} + {'role': 'user', + 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回,这个非常重要!2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容,不能省略。'} ], stream=True, # 启用流式响应 timeout=6000, @@ -172,6 +226,7 @@ async def generate_stream_markdown(course_name: str): print("\n完整的 Markdown 内容:") print(full_markdown) + app = FastAPI() # 添加 CORS 中间件 @@ -183,14 +238,16 @@ app.add_middleware( allow_headers=["*"], ) + # 根路由,返回提示信息 @app.get("/") def root(): return PlainTextResponse("Hello ApiStream") + @app.post("/api/tools/aippt_outline") # 仅支持 POST 方法 async def aippt_outline( - course_name: str = Body(..., embed=True, description="课程名称") # 从请求体中获取 course_name + course_name: str = Body(..., embed=True, description="课程名称") # 从请求体中获取 course_name ): # 返回流式响应 return StreamingResponse( @@ -204,6 +261,7 @@ async def aippt_outline( } ) + @app.post("/api/tools/aippt") # 修改为 POST 方法 async def aippt(content: str = Body(..., embed=True, description="Markdown 内容")): # 使用 Body 接收请求体参数 return StreamingResponse( @@ -218,18 +276,29 @@ async def aippt(content: str = Body(..., embed=True, description="Markdown 内 } ) + # 运行应用 if __name__ == "__main__": - # 获取本机所有 IPv4 地址 - ips = get_local_ips() - if not ips: - print("无法获取本机 IP 地址,使用默认地址 127.0.0.1") - ips = ["127.0.0.1"] - - # 打印所有 IP 地址 - print("服务将在以下 IP 地址上运行:") - for ip in ips: - print(f"http://{ip}:5173") - - # 启动 FastAPI 应用,绑定到所有 IP 地址 - uvicorn.run(app, host="0.0.0.0", port=5173) \ No newline at end of file + # # 获取本机所有 IPv4 地址 + # ips = get_local_ips() + # if not ips: + # print("无法获取本机 IP 地址,使用默认地址 127.0.0.1") + # ips = ["127.0.0.1"] + # + # # 打印所有 IP 地址 + # print("服务将在以下 IP 地址上运行:") + # for ip in ips: + # print(f"http://{ip}:5173") + # + # # 启动 FastAPI 应用,绑定到所有 IP 地址 + # uvicorn.run(app, host="0.0.0.0", port=5173) + + # 读取Sample.md + with open("Sample.md", "r", encoding="utf-8") as f: + markdown_content = f.read() + json_dict = markdown_to_dict(markdown_content) + + # 调用 AI 扩写每个有 title 属性的节点 + json_dict = expand_text_with_ai(json_dict) + + print(json_dict) diff --git a/AI/AiService/Sample.md b/AI/AiService/Sample.md index d72f205a..1a52bf81 100644 --- a/AI/AiService/Sample.md +++ b/AI/AiService/Sample.md @@ -1,42 +1,29 @@ # 方程解决问题的课件提纲 -- 【整体框架展示方程解决实际问题的思路与步骤】 ## 一、引入方程概念 -- 【从生活实例出发引出方程的概念】 ### 1.1 生活中的等量关系 -- 【通过具体事例展现等量关系是方程的基础】 - 分享小明买书的例子 总价等于单价乘以数量 - 引导学生发现其中存在的等量关系 ### 1.2 方程的定义 -- 【明确什么是方程及其基本构成要素】 - 给出方程的正式定义 含有未知数的等式 - 解释方程中各个部分 如未知数 系数 常数项 ## 二、建立方程模型 -- 【掌握从实际问题到方程模型的转化方法】 ### 2.1 分析问题找关键信息 -- 【学会筛选有用信息为建模做准备】 - 演示如何阅读理解应用题 找出已知条件和所求 - 强调寻找等量关系的重要性 ### 2.2 设定未知数构建方程 -- 【正确设定未知数并根据等量关系列出方程】 - 讲解设未知数的原则 一般设要求的量为x - 举例说明根据等量关系列出方程的过程 ## 三、求解方程 -- 【学习不同类型的方程求解方法】 ### 3.1 一元一次方程的解法 -- 【掌握最基础的一元一次方程求解技巧】 - 复习等式的性质 为解方程做铺垫 - 详细讲解移项 合并同类项 系数化1等步骤 ### 3.2 验根的重要性 -- 【确保求得的解符合实际情况】 - 强调验根的意义 防止出现增根或漏根 - 展示验根的具体操作过程 ## 四、方程的实际应用 -- 【体会方程在解决实际问题中的价值】 ### 4.1 行程问题 -- 【利用方程解决与行程相关的计算】 - 分析路程 速度 时间之间的关系 - 举例行程问题并用方程求解 ### 4.2 工程问题 -- 【运用方程处理工程进度方面的难题】 - 探讨工作量 工作效率 工作时间的关系 - 通过具体案例体现方程在工程问题中的应用 \ No newline at end of file