From bef1d0881a9701c2725c98e2b488b1393b78dcf2 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 5 Mar 2025 19:29:24 +0800 Subject: [PATCH] 'commit' --- AI/AiService/CallDeepSeekStream.py | 145 ++---------------- AI/AiService/Json.txt | 40 +++++ AI/AiService/Json2.txt | 15 ++ AI/AiService/Sample.txt | 85 ++++++++++ AI/AiService/Util.py | 82 ++++++++++ AI/AiService/__pycache__/Util.cpython-310.pyc | Bin 0 -> 2257 bytes AI/AiService/prompt.txt | 25 +++ 7 files changed, 257 insertions(+), 135 deletions(-) create mode 100644 AI/AiService/Json.txt create mode 100644 AI/AiService/Json2.txt create mode 100644 AI/AiService/Sample.txt create mode 100644 AI/AiService/Util.py create mode 100644 AI/AiService/__pycache__/Util.cpython-310.pyc create mode 100644 AI/AiService/prompt.txt diff --git a/AI/AiService/CallDeepSeekStream.py b/AI/AiService/CallDeepSeekStream.py index 0dbe5f52..921dccd6 100644 --- a/AI/AiService/CallDeepSeekStream.py +++ b/AI/AiService/CallDeepSeekStream.py @@ -1,11 +1,9 @@ -from fastapi import FastAPI, Query, Body -from fastapi.responses import StreamingResponse, PlainTextResponse +import uvicorn +from fastapi import FastAPI, Body from fastapi.middleware.cors import CORSMiddleware -import socket -from openai import OpenAI -import asyncio -import json +from fastapi.responses import StreamingResponse, PlainTextResponse +from Util import * app = FastAPI() # 添加 CORS 中间件 @@ -17,91 +15,19 @@ app.add_middleware( allow_headers=["*"], ) -# 阿里云中用来调用 deepseek v3 的密钥 -MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" -MODEL_NAME = "deepseek-v3" - -# 初始化 OpenAI 客户端 -client = OpenAI( - api_key=MODEL_API_KEY, - base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", -) - -# 获取本机所有 IPv4 地址 -def get_local_ips(): - ips = [] - hostname = socket.gethostname() - try: - # 获取所有 IP 地址 - addrs = socket.getaddrinfo(hostname, None, family=socket.AF_INET) # 只获取 IPv4 地址 - for addr in addrs: - ip = addr[4][0] - if ip not in ips: - ips.append(ip) - except Exception as e: - print(f"获取 IP 地址失败: {e}") - return ips - - -# 解析 Markdown 内容并生成 JSON 数据 -def parse_markdown_to_json(content: str): - sections = [] - current_section = None - current_subsection = None - - for line in content.split("\n"): - # 忽略无用的标记 - if line.strip() in ["```markdown", "```"]: - continue - if line.startswith("# "): # 一级标题(忽略,作为整体标题) - continue - elif line.startswith("## "): # 二级标题 - if current_section: - sections.append(current_section) - current_section = {"title": line[3:].strip(), "items": []} - current_subsection = None - elif line.startswith("### "): # 三级标题 - if current_section: - current_subsection = {"title": line[4:].strip(), "text": ""} - current_section["items"].append(current_subsection) - elif line.strip() and (line.startswith("- ") or (line[0].isdigit() and line[1] == '.')): # 列表项或数字加点 - if not current_subsection: # 如果 current_subsection 为 None,则创建一个默认子章节 - current_subsection = {"title": "", "text": ""} - if current_section: - current_section["items"].append(current_subsection) - current_subsection["text"] += line.strip() + " " - elif line.strip(): # 普通文本 - if current_subsection: - current_subsection["text"] += line.strip() + " " - - if current_section: - sections.append(current_section) - return sections - -# 生成流式 JSON 数据(中文输出,逐行返回) - # 根路由,返回提示信息 @app.get("/") def root(): return PlainTextResponse("Hello ApiStream") -# 流式返回数据(支持 GET 和 POST 方法) -@app.api_route("/api/tools/aippt_outline", methods=["GET", "POST"]) +@app.post("/api/tools/aippt_outline") # 仅支持 POST 方法 async def aippt_outline( - course_name: str = Query(None, description="课程名称(GET 方法使用)"), # 从查询参数中获取 course_name - course_name_body: str = Body(None, embed=True, description="课程名称(POST 方法使用)") # 从请求体中获取 course_name + course_name: str = Body(..., embed=True, description="课程名称") # 从请求体中获取 course_name ): - # 检查 course_name 是否为空 - if not course_name and not course_name_body: - return PlainTextResponse("请提供课程名称,例:course_name=三角形面积") - - # 优先使用 POST 请求体中的 course_name - course_name = course_name_body if course_name_body else course_name - # 返回流式响应 return StreamingResponse( - generate_stream(course_name), + generate_stream_markdown(course_name), media_type="text/event-stream", headers={ "Cache-Control": "no-cache", @@ -110,59 +36,10 @@ async def aippt_outline( "X-Accel-Buffering": "no" } ) - -# 流式生成数据的函数 -async def generate_stream(course_name: str): - # 调用阿里云 API,启用流式响应 - stream = client.chat.completions.create( - model=MODEL_NAME, - messages=[ - {'role': 'system', 'content': '你是一个教学经验丰富的基础教育教师'}, - {'role': 'user', 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。不要返回 ```markdown 或者 ``` 这样的内容!'} - ], - stream=True, # 启用流式响应 - timeout=6000, - ) - - # 逐字返回数据 - for chunk in stream: - if chunk.choices[0].delta.content: - for char in chunk.choices[0].delta.content: - yield char.encode("utf-8") - await asyncio.sleep(0.05) # 控制逐字输出的速度 - -# 生成流式 JSON 数据(中文输出,逐行返回) -async def generate_json_stream(content: str): # 新增 content 参数 - # 解析 Markdown 内容 - sections = parse_markdown_to_json(content) - - # 封面(使用第一个章节的标题作为封面标题) - first_section_title = sections[0]["title"] if sections else "默认标题" - yield json.dumps({"type": "cover", "data": {"title": first_section_title, "text": "课程简介"}}, ensure_ascii=False) + "\n" - await asyncio.sleep(0.5) - - # 目录(使用所有章节的标题) - yield json.dumps({"type": "contents", "data": {"items": [section["title"] for section in sections]}}, ensure_ascii=False) + "\n" - await asyncio.sleep(0.5) - - # 逐章节生成内容 - for section in sections: - # 过渡(使用章节标题动态生成过渡文本) - yield json.dumps({"type": "transition", "data": {"title": section["title"], "text": section["title"]}}, ensure_ascii=False) + "\n" - await asyncio.sleep(0.5) - - # 具体内容(直接使用解析后的章节内容) - yield json.dumps({"type": "content", "data": {"title": section["title"], "items": section["items"]}}, ensure_ascii=False) + "\n" - await asyncio.sleep(0.5) - - # 结束 - yield json.dumps({"type": "end"}, ensure_ascii=False) + "\n" - -# 从文件中读取 Markdown 并生成流式 JSON(中文输出,逐行返回) -@app.get("/api/tools/aippt") -async def aippt(content: str = Query(..., description="Markdown 内容")): # 新增 content 参数 +@app.post("/api/tools/aippt") # 修改为 POST 方法 +async def aippt(content: str = Body(..., embed=True, description="Markdown 内容")): # 使用 Body 接收请求体参数 return StreamingResponse( - generate_json_stream(content), # 传入 content + convert_markdown_to_json(content), # 传入 content media_type="text/plain", # 使用 text/plain 格式 headers={ "Cache-Control": "no-cache", @@ -175,8 +52,6 @@ async def aippt(content: str = Query(..., description="Markdown 内容")): # # 运行应用 if __name__ == "__main__": - import uvicorn - # 获取本机所有 IPv4 地址 ips = get_local_ips() if not ips: diff --git a/AI/AiService/Json.txt b/AI/AiService/Json.txt new file mode 100644 index 00000000..b680cad6 --- /dev/null +++ b/AI/AiService/Json.txt @@ -0,0 +1,40 @@ +1、第一级目录按下面的格式返回,title就是一级目录文字,text你帮着生成简短的描述语言: +{"type": "cover", "data": { "title": "大学生职业生涯规划", "text": "明确方向,开启精彩职业人生" } } + +2、 整理所有二级目录,按下面格式返回: +{"type": "contents", "data": { "items": [ "自我认知", "职业环境分析", "职业目标设定", "计划实施", "评估与反馈", "意义与总结" ] } } + +3、每个二级目录,按下面的格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "transition", "data": { "title": "开启自我认知", "text": "了解自身兴趣、性格和能力" } } + +4、每个二级下的三级目录,按下面格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "content", "data": { "title": "个人兴趣", "items": [ { "title": "文学创作", "text": "对文学创作感兴趣,喜欢用文字表达情感与思想,能在写作中发挥想象力,创作各类作品,丰富精神世界。" }, { "title": "计算机编程", "text": "热衷于计算机编程,享受编写代码解决问题的过程,关注编程技术的更新,希望在该领域有所建树。" }, { "title": "体育运动", "text": "热爱体育运动,如篮球、跑步等,通过运动增强体质,培养团队协作和竞争意识,释放学习压力。" }, { "title": "艺术设计", "text": "对艺术设计有浓厚兴趣,具备审美能力,善于运用色彩和图形进行创意设计,展现独特艺术风格。" } ] } } +{"type": "content", "data": { "title": "个人性格", "items": [ { "title": "外向开朗", "text": "性格外向开朗,善于与他人交流沟通,能快速融入新环境,建立良好人际关系,在团队中发挥积极作用。" }, { "title": "内向沉稳", "text": "有时内向沉稳,做事专注认真,不受外界干扰,能深入思考问题,高质量完成任务。" }, { "title": "责任心强", "text": "拥有强烈的责任心,勇于担当,对待工作和学习认真负责,尽力做到最好,值得他人信赖。" }, { "title": "富有创造力", "text": "思维活跃,富有创造力,能提出新颖独特的想法和解决方案,为团队带来新的活力和思路。" } ] } } +{"type": "content", "data": { "title": "个人能力", "items": [ { "title": "语言表达", "text": "具备良好的语言表达能力,能清晰准确地传达信息,在演讲、交流等场合表现出色,有效沟通。" }, { "title": "组织协调", "text": "拥有较强的组织协调能力,能合理安排资源,组织活动,协调各方关系,确保工作顺利进行。" }, { "title": "专业技能", "text": "掌握一定的专业技能,在所学专业领域有一定知识储备和实践经验,为未来职业发展打下基础。" }, { "title": "快速学习", "text": "具备快速学习新知识的能力,能适应不断变化的环境和需求,及时掌握新技能,提升自身竞争力。" } ] } } + +{"type": "transition", "data": { "title": "剖析职业环境", "text": "了解行业、岗位和企业情况" } } +{"type": "content", "data": { "title": "行业现状与趋势", "items": [ { "title": "互联网行业", "text": "互联网行业发展迅速,技术创新不断,应用场景广泛,创造了众多就业机会,引领时代发展潮流。" }, { "title": "金融行业", "text": "金融行业保持稳定增长,对经济发展起着重要支撑作用,需要具备专业知识和风险意识的人才。" }, { "title": "制造业转型", "text": "制造业正进行转型升级,向智能化、高端化发展,对技术人才和创新能力有更高要求。" }, { "title": "新兴行业", "text": "新兴行业如人工智能、新能源等崛起,带来新的发展机遇,吸引大量人才投身其中。" } ] } } +{"type": "content", "data": { "title": "职业要求与需求", "items": [ { "title": "技能要求", "text": "不同职业有不同技能要求,如编程、设计、营销等,需针对性学习提升,以满足岗位需求。" }, { "title": "人才数量", "text": "岗位的人才需求数量不同,热门行业和岗位需求较大,竞争也相对激烈,需做好职业规划。" }, { "title": "发展前景", "text": "关注岗位的发展前景,选择有潜力的行业和岗位,能为个人职业发展提供更多机会和空间。" }, { "title": "薪资待遇", "text": "薪资待遇是职业选择的重要因素之一,不同岗位和地区薪资差异较大,要综合考虑自身价值。" } ] } } +{"type": "content", "data": { "title": "企业分析", "items": [ { "title": "企业文化", "text": "知名企业有独特的企业文化,如创新、团队合作等,影响员工的价值观和工作方式,应选择契合的企业。" }, { "title": "发展战略", "text": "了解企业的发展战略,有助于判断企业的未来走向,选择有发展潜力的企业,实现个人与企业共同成长。" }, { "title": "用人标准", "text": "企业有不同的用人标准,如学历、经验、技能等,要根据自身条件选择合适的企业和岗位。" }, { "title": "晋升机制", "text": "良好的晋升机制能激励员工努力工作,为员工提供发展空间,关注企业的晋升通道和条件。" } ] } } + +{"type": "transition", "data": { "title": "设定职业目标", "text": "分阶段规划职业发展" } } +{"type": "content", "data": { "title": "短期目标(1 - 2年)", "items": [ { "title": "课程学习", "text": "完成专业课程学习,取得优异成绩,为后续职业发展奠定坚实的专业基础,提升自身竞争力。" }, { "title": "参加实习", "text": "参加相关实习,积累实践经验,了解行业实际情况,将理论知识与实践相结合,提高解决问题的能力。" }, { "title": "考取证书", "text": "考取专业相关证书,增加就业筹码,证明自己具备相应的专业能力和知识水平,获得企业认可。" }, { "title": "拓展人脉", "text": "拓展人脉资源,结识行业内人士,获取更多信息和机会,为未来职业发展搭建平台。" } ] } } +{"type": "content", "data": { "title": "中期目标(3 - 5年)", "items": [ { "title": "业务骨干", "text": "在所在岗位上成为业务骨干,熟练掌握工作技能,高效完成工作任务,为企业创造价值。" }, { "title": "项目管理", "text": "获得一定的项目管理经验,学会组织和协调团队,确保项目顺利进行,提升综合管理能力。" }, { "title": "专业专家", "text": "提升专业技能,成为行业专家,深入研究专业领域知识,解决复杂问题,在行业内树立权威。" }, { "title": "争取晋升", "text": "争取晋升机会,获得更高的职位和更好的待遇,实现个人职业发展的突破。" } ] } } +{"type": "content", "data": { "title": "长期目标(5年以上)", "items": [ { "title": "中高层管理", "text": "成为企业中高层管理人员,参与企业战略决策,带领团队实现企业目标,展现领导才能。" }, { "title": "拥有事业", "text": "拥有自己的事业,实现创业梦想,创造更多价值,为社会做出贡献。" }, { "title": "行业影响", "text": "在行业内具有一定的影响力,推动行业发展,成为行业的引领者,提升个人知名度。" }, { "title": "财务自由", "text": "实现财务自由,享受高品质生活,有更多的选择和自由,实现人生价值。" } ] } } + +{"type": "transition", "data": { "title": "落实计划实施", "text": "分阶段执行职业规划" } } +{"type": "content", "data": { "title": "在校计划", "items": [ { "title": "学习计划", "text": "制定学习计划,合理安排时间,提高学习效率,系统学习专业知识,为未来职业发展做好准备。" }, { "title": "社团活动", "text": "参加社团活动,锻炼综合能力,如组织能力、沟通能力等,丰富校园生活,拓展人脉资源。" }, { "title": "科研项目", "text": "积极参与科研项目,培养创新能力,探索未知领域,提高解决问题的能力和科研素养。" }, { "title": "人际关系", "text": "建立良好的人际关系,与同学、老师保持良好沟通,营造和谐的学习和生活氛围,获得更多支持和帮助。" } ] } } +{"type": "content", "data": { "title": "毕业后计划", "items": [ { "title": "入职选择", "text": "选择合适的企业和岗位入职,综合考虑企业发展前景、岗位需求和自身兴趣等因素,做出明智决策。" }, { "title": "适应环境", "text": "快速适应工作环境,融入团队,了解企业文化和工作流程,与同事建立良好合作关系。" }, { "title": "学习提升", "text": "不断学习新知识,提升工作能力,适应行业发展变化,保持竞争力,为企业创造更多价值。" }, { "title": "总结反思", "text": "定期进行工作总结和反思,发现问题及时改进,不断优化工作方法和流程,提高工作效率和质量。" } ] } } +{"type": "content", "data": { "title": "计划调整", "items": [ { "title": "目标调整", "text": "根据实际情况,调整职业目标,确保目标合理可行,适应自身发展和外部环境变化。" }, { "title": "步骤优化", "text": "优化计划实施步骤,提高计划的可操作性和有效性,确保各项任务顺利完成。" }, { "title": "环境适应", "text": "适应外部环境变化,及时做出调整,抓住机遇,应对挑战,保障职业规划顺利推进。" } ] } } + +{"type": "transition", "data": { "title": "做好评估反馈", "text": "持续优化职业规划" } } +{"type": "content", "data": { "title": "自我评估", "items": [ { "title": "总结反思", "text": "定期进行自我总结和反思,回顾自己的学习和工作表现,发现优点和不足,明确改进方向。" }, { "title": "分析优劣", "text": "分析自己的优点和不足,发挥优势,弥补短板,不断提升自己的综合素质和能力。" }, { "title": "改进措施", "text": "制定改进措施,针对不足之处采取具体行动,如学习新知识、参加培训等,逐步完善自己。" } ] } } +{"type": "content", "data": { "title": "他人评估", "items": [ { "title": "征求意见", "text": "向老师、同学、同事征求意见,从不同角度了解自己的表现和不足,获取客观反馈。" }, { "title": "接受评价", "text": "接受领导的评价和建议,认真对待领导的指导,努力改进工作,提高工作绩效。" }, { "title": "参考看法", "text": "参考家人的看法,家人的关心和支持能给予鼓励和动力,同时也能提供不同的视角和建议。" } ] } } +{"type": "content", "data": { "title": "评估周期与机制", "items": [ { "title": "设定周期", "text": "设定评估周期,如每半年或一年,定期对职业规划进行评估和调整,确保规划的有效性。" }, { "title": "反馈机制", "text": "建立有效的反馈机制,及时收集和分析评估信息,根据反馈结果调整规划,保障职业发展方向正确。" } ] } } + +{"type": "transition", "data": { "title": "总结职业规划", "text": "明确意义展望未来" } } +{"type": "content", "data": { "title": "职业规划重要性", "items": [ { "title": "明确方向", "text": "明确职业方向,避免盲目就业,让自己在职业道路上少走弯路,提高职业发展效率。" }, { "title": "提高竞争力", "text": "提高自身竞争力,增加就业机会,通过规划有针对性地提升自己的能力和素质,脱颖而出。" }, { "title": "实现价值", "text": "实现个人价值,促进个人成长,在适合的职业领域中发挥才能,不断进步,实现人生目标。" } ] } } +{"type": "content", "data": { "title": "总结与展望", "items": [ { "title": "回顾过程", "text": "回顾整个职业规划过程,总结经验教训,为未来职业发展提供参考,更好地应对挑战。" }, { "title": "充满信心", "text": "对未来的职业发展充满信心,相信通过努力和规划能实现职业目标,创造美好未来。" }, { "title": "鼓励自己", "text": "鼓励自己不断努力,实现职业目标,保持积极心态,勇于追求梦想,为理想而奋斗。" } ] } } + +{"type": "end" } + diff --git a/AI/AiService/Json2.txt b/AI/AiService/Json2.txt new file mode 100644 index 00000000..8f922509 --- /dev/null +++ b/AI/AiService/Json2.txt @@ -0,0 +1,15 @@ +1、第一级目录按下面的格式返回,title就是一级目录文字,text你帮着生成简短的描述语言: +{"type": "cover", "data": { "title": "大学生职业生涯规划", "text": "明确方向,开启精彩职业人生" } } + +2、 整理所有二级目录,按下面格式返回: +{"type": "contents", "data": { "items": [ "自我认知", "职业环境分析", "职业目标设定", "计划实施", "评估与反馈", "意义与总结" ] } } + +3、每个二级目录,按下面的格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "transition", "data": { "title": "开启自我认知", "text": "了解自身兴趣、性格和能力" } } + +4、每个二级下的三级目录,按下面格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "content", "data": { "title": "个人兴趣", "items": [ { "title": "文学创作", "text": "对文学创作感兴趣,喜欢用文字表达情感与思想,能在写作中发挥想象力,创作各类作品,丰富精神世界。" }, { "title": "计算机编程", "text": "热衷于计算机编程,享受编写代码解决问题的过程,关注编程技术的更新,希望在该领域有所建树。" }, { "title": "体育运动", "text": "热爱体育运动,如篮球、跑步等,通过运动增强体质,培养团队协作和竞争意识,释放学习压力。" }, { "title": "艺术设计", "text": "对艺术设计有浓厚兴趣,具备审美能力,善于运用色彩和图形进行创意设计,展现独特艺术风格。" } ] } } + +5、最后按下面字符串固定输出 +{"type": "end" } + diff --git a/AI/AiService/Sample.txt b/AI/AiService/Sample.txt new file mode 100644 index 00000000..89716172 --- /dev/null +++ b/AI/AiService/Sample.txt @@ -0,0 +1,85 @@ +# 大学生职业生涯规划 +## 自我认知 +### 个人兴趣 +- 对文学创作的兴趣 +- 对计算机编程的兴趣 +- 对体育运动的兴趣 +- 对艺术设计的兴趣 +### 个人性格 +- 外向开朗,善于交际 +- 内向沉稳,做事专注 +- 责任心强,勇于担当 +- 富有创造力,思维活跃 +### 个人能力 +- 具备良好的语言表达能力 +- 拥有较强的组织协调能力 +- 掌握一定的专业技能 +- 具备快速学习新知识的能力 +## 职业环境分析 +### 行业现状与发展趋势 +- 互联网行业的快速发展 +- 金融行业的稳定增长 +- 制造业的转型升级 +- 新兴行业的崛起 +### 职业要求与岗位需求 +- 不同职业的技能要求 +- 岗位的人才需求数量 +- 岗位的发展前景 +- 岗位的薪资待遇 +### 企业分析 +- 知名企业的企业文化 +- 企业的发展战略 +- 企业的用人标准 +- 企业的晋升机制 +## 职业目标设定 +### 短期目标(1 - 2年) +- 完成专业课程学习,取得优异成绩 +- 参加相关实习,积累实践经验 +- 考取专业相关证书 +- 拓展人脉资源 +### 中期目标(3 - 5年) +- 在所在岗位上成为业务骨干 +- 获得一定的项目管理经验 +- 提升专业技能,成为行业专家 +- 争取晋升机会 +### 长期目标(5年以上) +- 成为企业中高层管理人员 +- 拥有自己的事业 +- 在行业内具有一定的影响力 +- 实现财务自由 +## 计划实施 +### 在校计划 +- 制定学习计划,提高学习效率 +- 参加社团活动,锻炼综合能力 +- 积极参与科研项目,培养创新能力 +- 建立良好的人际关系 +### 毕业后计划 +- 选择合适的企业和岗位入职 +- 快速适应工作环境,融入团队 +- 不断学习新知识,提升工作能力 +- 定期进行工作总结和反思 +### 计划调整 +- 根据实际情况,调整职业目标 +- 优化计划实施步骤 +- 适应外部环境变化,及时做出调整 +## 评估与反馈 +### 自我评估 +- 定期进行自我总结和反思 +- 分析自己的优点和不足 +- 制定改进措施 +### 他人评估 +- 向老师、同学、同事征求意见 +- 接受领导的评价和建议 +- 参考家人的看法 +### 评估周期与反馈机制 +- 设定评估周期,如每半年或一年 +- 建立有效的反馈机制,及时调整规划 +## 职业规划的意义与总结 +### 职业规划的重要性 +- 明确职业方向,避免盲目就业 +- 提高自身竞争力,增加就业机会 +- 实现个人价值,促进个人成长 +### 总结与展望 +- 回顾整个职业规划过程 +- 对未来的职业发展充满信心 +- 鼓励自己不断努力,实现职业目标 \ No newline at end of file diff --git a/AI/AiService/Util.py b/AI/AiService/Util.py new file mode 100644 index 00000000..adc0b7fd --- /dev/null +++ b/AI/AiService/Util.py @@ -0,0 +1,82 @@ +import asyncio +import socket +from openai import OpenAI + +# 阿里云中用来调用 deepseek v3 的密钥 +MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" +MODEL_NAME = "deepseek-v3" + + +# 初始化 OpenAI 客户端 +client = OpenAI( + api_key=MODEL_API_KEY, + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", +) + +# 获取本机所有 IPv4 地址 +def get_local_ips(): + ips = [] + hostname = socket.gethostname() + try: + # 获取所有 IP 地址 + addrs = socket.getaddrinfo(hostname, None, family=socket.AF_INET) # 只获取 IPv4 地址 + for addr in addrs: + ip = addr[4][0] + if ip not in ips: + ips.append(ip) + except Exception as e: + print(f"获取 IP 地址失败: {e}") + return ips + +# 流式生成数据的函数 +async def generate_stream_markdown(course_name: str): + # 调用阿里云 API,启用流式响应 + stream = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {'role': 'system', 'content': '你是一个教学经验丰富的基础教育教师'}, + {'role': 'user', 'content': '帮我设计一下' + course_name + '的课件提纲,用markdown格式返回。不要返回 ```markdown 或者 ``` 这样的内容!'} + ], + stream=True, # 启用流式响应 + timeout=6000, + ) + + # 逐字返回数据 + for chunk in stream: + if chunk.choices[0].delta.content: + for char in chunk.choices[0].delta.content: + yield char.encode("utf-8") + await asyncio.sleep(0.05) # 控制逐字输出的速度 + + + + +def generate_prompt(source: str) -> str: + # 打开 prompt.txt 文件,读取内容 + with open("prompt.txt", "r", encoding="utf-8") as file: + prompt = file.read() + prompt = prompt.replace("{{source}}", source) + return prompt + +async def convert_markdown_to_json(source: str): + # 生成提示词 + prompt = generate_prompt(source) + + # 调用 AI 模型,启用流式响应 + stream = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {"role": "system", "content": "你是一个专业的 Markdown 内容解析器。"}, + {"role": "user", "content": prompt} + ], + stream=True, # 启用流式响应 + max_tokens=2000, + temperature=0.5 + ) + + # 逐字返回数据 + for chunk in stream: + if chunk.choices[0].delta.content: + for char in chunk.choices[0].delta.content: + yield char.encode("utf-8") + await asyncio.sleep(0.05) # 控制逐字输出的速度 diff --git a/AI/AiService/__pycache__/Util.cpython-310.pyc b/AI/AiService/__pycache__/Util.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f170b1b426d6f1accce40ad5ca624d82f793de2 GIT binary patch literal 2257 zcmZ8iYiv}<6`q;<*y~-}fYtKKYY9!#P3jj$k)df43mnx-a8f~wSh-rR?~K=Xy?gI6 zch+EMH!_bzNWn2tX;jFgYo$#>q(Tx^#U(WP+n@bCzbeIRFTeO(P)mExU2siiHRsOb z%$YOieBaryqa#V6-QNB8{Kqi*4kzoI36mG0M+Fd^a9SkU)|X}}%vq6@jI2QkH?k%- zvz9P~$t`Zrv#iY%+&M$C3En203C5E=b;iuL@pj?x4p=dHC*J@oNnC;bjeHZ#Qk)(n znXa2~9~sS1ZNFL;!O+O;&SfmI z{*^Guj}48C4fzL!oc292_Dkg#d&)Dq13bzVL(eVd!1yLO8>K;*)S--aF^9IpC`s8I z`;TdN-rY)JXO7*Kn?XsZys#o6arhh$<8Z%WU@&|87}%@A;3R`A(E=+N%H)(YZhXKv zV7E%P5N<<kdyX(q9ouR9hX; zy+}tOUq6TWv8Ru1=a9Wj$0#IVCQ_nQ8313F|5ji5-PPr#x#gwLSAKi3@uyE#zh1cc z`MKq#FB(_RtzJ6Q`2F?O#W~n&p85(Emd;*g+LU2Y=!6#rN(4%ql}N}+7no}-U0FH% zZu81F%`1zs(YGszVzAS^`pxp!e_2^Lzk26Yd(jSXtRg+3Z7Ebm1`puT00jqnTuEMnfr9FaDCFk6vCxiq zi>nGd4A?Q@cN(f};PjJd^KqyK_&Wl<%IXX;yT}lkfGm4-Hd&SsHPxd|C{3l@0mh+_ zI&n~dd9%saUvD{9t7QyrLSYO5OTy(kAw{|9dLm=UJ~*Y#2_FzQmzs4nPU&dL~I|GSSTy~Al9>R zdFeOHOP2uJ=>zu&l5T;#`RT_iADwSp{0vAUx4|j-Fo;9`Kj2k)7(x5z3mHp30t5Ld z3WQrWS#nS0R5&GqD4PP>ml0nTDPkJLDUy$aUZy<`ncRs7e}v)*6i=df3dN66WKbZ| z<O1djpSY)KGJ$X{Ia-I8$hm@C#@%= ssdZk){>E%{o`YIaDT?Q@oJZS1I0XL$Ov9weJ#g!;V|Q-o+T4}+9|voGxBvhE literal 0 HcmV?d00001 diff --git a/AI/AiService/prompt.txt b/AI/AiService/prompt.txt new file mode 100644 index 00000000..30804530 --- /dev/null +++ b/AI/AiService/prompt.txt @@ -0,0 +1,25 @@ +你是一个专业的 Markdown 内容解析器,能够将 Markdown 格式的文本转换为文本字符串。请根据以下规则处理 Markdown 内容: + +1、第一级目录按下面的格式返回,title就是一级目录文字,text你帮着生成简短的描述语言: +{"type": "cover", "data": { "title": "大学生职业生涯规划", "text": "明确方向,开启精彩职业人生" } } + +2、 整理所有二级目录,按下面格式返回: +{"type": "contents", "data": { "items": [ "自我认知", "职业环境分析", "职业目标设定", "计划实施", "评估与反馈", "意义与总结" ] } } + +3、每个二级目录,按下面的格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "transition", "data": { "title": "开启自我认知", "text": "了解自身兴趣、性格和能力" } } + +4、每个二级下的三级目录,按下面格式返回,同样,title是二级目录文字,text你帮着生成简短的描述语言: +{"type": "content", "data": { "title": "个人兴趣", "items": [{ "title": "文学创作", "text": "对文学创作感兴趣,喜欢用文字表达情感与思想,能在写作中发挥想象力,创作各类作品,丰富精神世界。" }, { "title": "计算机编程", "text": "热衷于计算机编程,享受编写代码解决问题的过程,关注编程技术的更新,希望在该领域有所建树。" }, { "title": "体育运动", "text": "热爱体育运动,如篮球、跑步等,通过运动增强体质,培养团队协作和竞争意识,释放学习压力。" }, { "title": "艺术设计", "text": "对艺术设计有浓厚兴趣,具备审美能力,善于运用色彩和图形进行创意设计,展现独特艺术风格。" } ] } } + +5、最后按下面字符串固定输出 +{"type": "end" } + +6、不要 输出:```json 和 ``` + +7、不要生成 ** 这样的 markdown中加重的符号 + +以下是需要处理的 Markdown 内容: +{{source}} + +请将上述 Markdown 内容转换为以下 文本字符串 格式: \ No newline at end of file