十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Web应用项目开发源码级教程:AI汉字谜盒

Web应用项目开发源码级教程:AI汉字谜盒 1.开发规范Restful指的是遵循 REST 架构风格的 API 接口服务而 RESTREpresentational State Transfer表述性状态转换它是一种软件架构风格那么REST架构风格是怎么样的呢对于传统的架构风格比如新增用户一种操作就有寻多种不同的 API 接口定义方式因此传统架构风格的缺点在于不规范难维护对于REST架构风格通过 URL 来定位资源使用 HTTP 动词描述操作这就使得 API 接口简介规范优雅注意REST是风格是约定方式约定不是规定可以打破描述功能模块经常使用复数形式加s表示此类资源而非单个资源如usersbooksitems小结2.基础环境准备1.创建项目文件夹将资料中的 static 目录拷贝到项目中2.编写 Python 程序定义路径操作函数访问前端 HTML 页面from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)小结3.核心功能开发3.1 新建会话在打开该项目页面时如果之前没有会话则要自动创建一个会话会话标识形式如 2026-05-15_12-00-05相关代码如下import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)BaseModel是 Pydantic 库提供的父类FastAPI 深度集成了 Pydantic用于定义 FastAPI 数据模型和数据验证规则3.2 与AI交互在会话界面我们就可以输入我们的问题或答案然后请求服务端与AI进行交互了3.2.1 请求参数的接收在与 AI 进行交互式前端传递给服务端的参数包含两项分别为 session_id 与 message并以 json 格式在请求体中传递到服务端代码如下import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #返回数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #请求数据模型 class ChatRequest(BaseModel): session_id: str message: str #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) #与AI交互 app.post(/api/chat) def chat(request: ChatRequest) - ApiResponse: print(f与AI交互:{request.session_id} : {request.message}) return ApiResponse(code200, message请求成功, dataAI的回复) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)小结如下3.2.2 chat 函数功能逻辑实现在会话页面我们就可以输入我们的问题或者答案然后请求服务端与 AI 进行交互了相关代码操作如下:import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any from openai import OpenAI #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #----------------根据session_id获取文件名----------------- def get_session_file_name(session_id): return fsessions/{session_id}.json #----------------根据session_id获取文件名----------------- prompt # 角色定义 你是一个专门玩猜字谜的AI小助手只进行字谜互动不闲聊无关内容全程纯文本交互不使用表情符号。 ## 核心能力 - 出字谜、判对错、给提示 - 记忆已用谜题确保会话内不重复 - 简洁明快回应 ## 出题规则严格执行 1. 开场先友好打招呼并随机出一道常见、简单、适合大众并必须符合逻辑推理的字谜禁止使用生僻、低俗、网络烂梗。 2. 题目格式“谜面”打一字。 3. 每次出题必须完全随机禁止重复使用相同题目也可以偶尔穿插使用下面示例中的谜语。 4. 新出题目时, 不要提示, 用户需要提示时, 或者答错时, 再给予合理的提示。 ## 判题规则严格执行 1. 用户只回复一个字时直接视为答案。 2. 答对立即夸奖并揭晓谜底格式如“太棒了就是‘X’字要不要再来一题” 3. 答错告知不对可给一句简短提示但不泄露答案。格式如“不对哦再想想~” 4. 严禁在用户答错后直接公布答案只有用户说“公布答案”或“不知道”等情况时才公布。 ## 互动流程 1. 用户答对夸奖 确认正确 询问“要不要再来一题” 2. 用户答错告知不对 简单提示 鼓励继续猜 3. 用户说“提示一下”给出简短线索不公布答案 4. 用户说“公布答案”或“不知道”揭晓谜底并解释 询问“要不要再来一题” 5. 用户说“换一题”“再来一题”立即更换新字谜 ## 回复风格约束 - 语气轻松有趣但保持简洁 - 全程只围绕字谜拒绝回答其他问题 - 回复不超过3句话 - **绝对不要在回复中说“这个出过了我来个新的”或类似表述** — 直接给出新谜语即可 - 判题错误零容忍不确定谜底时先回复“我再想想”而不是乱判 ## 常见谜语类型及谜底参考示例, 仅仅为参照示例 ### 组合类 - 「一加一不是二」 王 - 「二人不是天」 夫 - 「十口不是田」 古 ### 包含类 - 「一人在内」 肉 - 「口里有人」 囚 - 「门里有口」 问 - 「田里长草」 苗 - 「心里有你」 您 - 「山里有山」 出 - 「王头上有人」 全 - 「水上有石」 泵 ### 半取类 - 「半吃半拿」 哈 - 「半真半假」 值 - 「半青半紫」 素 - 「半朋半友」 有 - 「半推半就」 扰 - 「半山半水」 汕 ### 象形类 - 「三人又重逢」 众 - 「一口咬掉牛尾巴」 告 - 「两座山」 出 - 「三日又重逢」 晶 #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #返回数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #请求数据模型 class ChatRequest(BaseModel): session_id: str message: str #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) #与AI交互 app.post(/api/chat) def chat(request: ChatRequest) - ApiResponse: print(f与AI交互:{request.session_id} : {request.message}) #逻辑实现 - 与AI大模型进行交互 #1. 加载json文件中的会话数据 session_path get_session_file_name(request.session_id) with open(session_path, r, encodingutf-8) as f: session_data json.load(f) #2. 创建与AI大模型交互的消息信息 messages [{role:system, content: prompt}] for message in session_data[messages]: messages.append(message) messages.append({role:user, content: request.message}) #3. 调用大模型 print(f------ 请求的会话信息:{messages}) #测试 # -------------------------API调用前期准备-------------------------- # 创建与 AI 大模型交互的客户端对象 api_key ark-5e6f71b7-87c7-4933-935b-534a2daa4736-b19c5 client OpenAI( base_urlhttps://ark.cn-beijing.volces.com/api/v3, api_keyapi_key, ) #-------------------------API调用前期准备-------------------------- response client.responses.create( model doubao-seed-evolving, input messages, stream False, temperature 1.3 ) #4. 获取响应数据 rd response.model_dump() # 从output里拿message的文本 content next(i[content][0][text] for i in rd[output] if i[type] message) print(------ AI大模型返回结果, content) #测试 #5. 更新消息列表 messages.append({role:assistant, content: content}) messages.pop(0) #去除系统提示词 session_data[messages] messages print(f------ 更新后的会话信息:{session_data}) #6. 保存会话信息到json文件 with open(session_path, w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #7. 返回数据 return ApiResponse(code200, message请求成功, datacontent) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)3.3 会话列表在汉字谜盒项目的左侧侧边栏,要查询并展示出所有的会话信息,将会话名展示在左侧,并且根据时间倒序排序相关代码如下import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any from openai import OpenAI #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #----------------根据session_id获取文件名----------------- def get_session_file_name(session_id): return fsessions/{session_id}.json #----------------根据session_id获取文件名----------------- prompt # 角色定义 你是一个专门玩猜字谜的AI小助手只进行字谜互动不闲聊无关内容全程纯文本交互不使用表情符号。 ## 核心能力 - 出字谜、判对错、给提示 - 记忆已用谜题确保会话内不重复 - 简洁明快回应 ## 出题规则严格执行 1. 开场先友好打招呼并随机出一道常见、简单、适合大众并必须符合逻辑推理的字谜禁止使用生僻、低俗、网络烂梗。 2. 题目格式“谜面”打一字。 3. 每次出题必须完全随机禁止重复使用相同题目也可以偶尔穿插使用下面示例中的谜语。 4. 新出题目时, 不要提示, 用户需要提示时, 或者答错时, 再给予合理的提示。 ## 判题规则严格执行 1. 用户只回复一个字时直接视为答案。 2. 答对立即夸奖并揭晓谜底格式如“太棒了就是‘X’字要不要再来一题” 3. 答错告知不对可给一句简短提示但不泄露答案。格式如“不对哦再想想~” 4. 严禁在用户答错后直接公布答案只有用户说“公布答案”或“不知道”等情况时才公布。 ## 互动流程 1. 用户答对夸奖 确认正确 询问“要不要再来一题” 2. 用户答错告知不对 简单提示 鼓励继续猜 3. 用户说“提示一下”给出简短线索不公布答案 4. 用户说“公布答案”或“不知道”揭晓谜底并解释 询问“要不要再来一题” 5. 用户说“换一题”“再来一题”立即更换新字谜 ## 回复风格约束 - 语气轻松有趣但保持简洁 - 全程只围绕字谜拒绝回答其他问题 - 回复不超过3句话 - **绝对不要在回复中说“这个出过了我来个新的”或类似表述** — 直接给出新谜语即可 - 判题错误零容忍不确定谜底时先回复“我再想想”而不是乱判 ## 常见谜语类型及谜底参考示例, 仅仅为参照示例 ### 组合类 - 「一加一不是二」 王 - 「二人不是天」 夫 - 「十口不是田」 古 ### 包含类 - 「一人在内」 肉 - 「口里有人」 囚 - 「门里有口」 问 - 「田里长草」 苗 - 「心里有你」 您 - 「山里有山」 出 - 「王头上有人」 全 - 「水上有石」 泵 ### 半取类 - 「半吃半拿」 哈 - 「半真半假」 值 - 「半青半紫」 素 - 「半朋半友」 有 - 「半推半就」 扰 - 「半山半水」 汕 ### 象形类 - 「三人又重逢」 众 - 「一口咬掉牛尾巴」 告 - 「两座山」 出 - 「三日又重逢」 晶 #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #返回数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #请求数据模型 class ChatRequest(BaseModel): session_id: str message: str #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) #与AI交互 app.post(/api/chat) def chat(request: ChatRequest) - ApiResponse: print(f与AI交互:{request.session_id} : {request.message}) #逻辑实现 - 与AI大模型进行交互 #1. 加载json文件中的会话数据 session_path get_session_file_name(request.session_id) with open(session_path, r, encodingutf-8) as f: session_data json.load(f) #2. 创建与AI大模型交互的消息信息 messages [{role:system, content: prompt}] for message in session_data[messages]: messages.append(message) messages.append({role:user, content: request.message}) #3. 调用大模型 print(f------ 请求的会话信息:{messages}) #测试 # -------------------------API调用前期准备-------------------------- # 创建与 AI 大模型交互的客户端对象 api_key ark-5e6f71b7-87c7-4933-935b-534a2daa4736-b19c5 client OpenAI( base_urlhttps://ark.cn-beijing.volces.com/api/v3, api_keyapi_key, ) #-------------------------API调用前期准备-------------------------- response client.responses.create( model doubao-seed-evolving, input messages, stream False, temperature 1.3 ) #4. 获取响应数据 rd response.model_dump() # 从output里拿message的文本 content next(i[content][0][text] for i in rd[output] if i[type] message) print(------ AI大模型返回结果, content) #测试 #5. 更新消息列表 messages.append({role:assistant, content: content}) messages.pop(0) #去除系统提示词 session_data[messages] messages print(f------ 更新后的会话信息:{session_data}) #6. 保存会话信息到json文件 with open(session_path, w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #7. 返回数据 return ApiResponse(code200, message请求成功, datacontent) #会话列表 app.get(/api/sessions) def get_sessions() - ApiResponse: print(获取会话列表) #1. 获取session目录下所有的文件名 sessions_files os.listdir(sessions) #2. 获取文件名中的会话id sessions_ids [file.split(.)[0] for file in sessions_files] #3. 返回数据 return ApiResponse(code200, message获取会话列表成功, datasessions_ids) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)3.4 加载指定会话在点击左侧的会话名称后就要查询出该会话对应的会话信息并在消息栏将其展示出来相关代码如下import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any from openai import OpenAI #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #----------------根据session_id获取文件名----------------- def get_session_file_name(session_id): return fsessions/{session_id}.json #----------------根据session_id获取文件名----------------- prompt # 角色定义 你是一个专门玩猜字谜的AI小助手只进行字谜互动不闲聊无关内容全程纯文本交互不使用表情符号。 ## 核心能力 - 出字谜、判对错、给提示 - 记忆已用谜题确保会话内不重复 - 简洁明快回应 ## 出题规则严格执行 1. 开场先友好打招呼并随机出一道常见、简单、适合大众并必须符合逻辑推理的字谜禁止使用生僻、低俗、网络烂梗。 2. 题目格式“谜面”打一字。 3. 每次出题必须完全随机禁止重复使用相同题目也可以偶尔穿插使用下面示例中的谜语。 4. 新出题目时, 不要提示, 用户需要提示时, 或者答错时, 再给予合理的提示。 ## 判题规则严格执行 1. 用户只回复一个字时直接视为答案。 2. 答对立即夸奖并揭晓谜底格式如“太棒了就是‘X’字要不要再来一题” 3. 答错告知不对可给一句简短提示但不泄露答案。格式如“不对哦再想想~” 4. 严禁在用户答错后直接公布答案只有用户说“公布答案”或“不知道”等情况时才公布。 ## 互动流程 1. 用户答对夸奖 确认正确 询问“要不要再来一题” 2. 用户答错告知不对 简单提示 鼓励继续猜 3. 用户说“提示一下”给出简短线索不公布答案 4. 用户说“公布答案”或“不知道”揭晓谜底并解释 询问“要不要再来一题” 5. 用户说“换一题”“再来一题”立即更换新字谜 ## 回复风格约束 - 语气轻松有趣但保持简洁 - 全程只围绕字谜拒绝回答其他问题 - 回复不超过3句话 - **绝对不要在回复中说“这个出过了我来个新的”或类似表述** — 直接给出新谜语即可 - 判题错误零容忍不确定谜底时先回复“我再想想”而不是乱判 ## 常见谜语类型及谜底参考示例, 仅仅为参照示例 ### 组合类 - 「一加一不是二」 王 - 「二人不是天」 夫 - 「十口不是田」 古 ### 包含类 - 「一人在内」 肉 - 「口里有人」 囚 - 「门里有口」 问 - 「田里长草」 苗 - 「心里有你」 您 - 「山里有山」 出 - 「王头上有人」 全 - 「水上有石」 泵 ### 半取类 - 「半吃半拿」 哈 - 「半真半假」 值 - 「半青半紫」 素 - 「半朋半友」 有 - 「半推半就」 扰 - 「半山半水」 汕 ### 象形类 - 「三人又重逢」 众 - 「一口咬掉牛尾巴」 告 - 「两座山」 出 - 「三日又重逢」 晶 #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #返回数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #请求数据模型 class ChatRequest(BaseModel): session_id: str message: str #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) #与AI交互 app.post(/api/chat) def chat(request: ChatRequest) - ApiResponse: print(f与AI交互:{request.session_id} : {request.message}) #逻辑实现 - 与AI大模型进行交互 #1. 加载json文件中的会话数据 session_path get_session_file_name(request.session_id) with open(session_path, r, encodingutf-8) as f: session_data json.load(f) #2. 创建与AI大模型交互的消息信息 messages [{role:system, content: prompt}] for message in session_data[messages]: messages.append(message) messages.append({role:user, content: request.message}) #3. 调用大模型 print(f------ 请求的会话信息:{messages}) #测试 # -------------------------API调用前期准备-------------------------- # 创建与 AI 大模型交互的客户端对象 api_key ark-5e6f71b7-87c7-4933-935b-534a2daa4736-b19c5 client OpenAI( base_urlhttps://ark.cn-beijing.volces.com/api/v3, api_keyapi_key, ) #-------------------------API调用前期准备-------------------------- response client.responses.create( model doubao-seed-evolving, input messages, stream False, temperature 1.3 ) #4. 获取响应数据 rd response.model_dump() # 从output里拿message的文本 content next(i[content][0][text] for i in rd[output] if i[type] message) print(------ AI大模型返回结果, content) #测试 #5. 更新消息列表 messages.append({role:assistant, content: content}) messages.pop(0) #去除系统提示词 session_data[messages] messages print(f------ 更新后的会话信息:{session_data}) #6. 保存会话信息到json文件 with open(session_path, w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #7. 返回数据 return ApiResponse(code200, message请求成功, datacontent) #会话列表 app.get(/api/sessions) def get_sessions() - ApiResponse: print(获取会话列表) #1. 获取session目录下所有的文件名 sessions_files os.listdir(sessions) #2. 获取文件名中的会话id sessions_ids [file.split(.)[0] for file in sessions_files] #3. 返回数据 return ApiResponse(code200, message获取会话列表成功, datasessions_ids) #获取会话信息 app.get(/api/sessions/{session_id}) def get_session(session_id: str)- ApiResponse: print(获取会话信息) #1.读取会话文件json with open(os.path.join(sessions,session_id .json), r, encodingutf-8) as f: session_data json.load(f) #2.返回数据 return ApiResponse(code200, message获取会话信息成功, datasession_data) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)3.5 删除指定会话在点击左侧绘画名称之后的 × 就要将当前的会话信息直接删除掉相关代码操作如下import os from fastapi import FastAPI from starlette.responses import FileResponse from starlette.staticfiles import StaticFiles from datetime import datetime import json from pydantic import BaseModel from typing import Any from openai import OpenAI #-------------------生成会话标识函数---------------------- def generate_session_id(): return datetime.now().strftime(%Y-%m-%d_%H-%M-%S) #-------------------生成会话标识函数---------------------- #----------------根据session_id获取文件名----------------- def get_session_file_name(session_id): return fsessions/{session_id}.json #----------------根据session_id获取文件名----------------- prompt # 角色定义 你是一个专门玩猜字谜的AI小助手只进行字谜互动不闲聊无关内容全程纯文本交互不使用表情符号。 ## 核心能力 - 出字谜、判对错、给提示 - 记忆已用谜题确保会话内不重复 - 简洁明快回应 ## 出题规则严格执行 1. 开场先友好打招呼并随机出一道常见、简单、适合大众并必须符合逻辑推理的字谜禁止使用生僻、低俗、网络烂梗。 2. 题目格式“谜面”打一字。 3. 每次出题必须完全随机禁止重复使用相同题目也可以偶尔穿插使用下面示例中的谜语。 4. 新出题目时, 不要提示, 用户需要提示时, 或者答错时, 再给予合理的提示。 ## 判题规则严格执行 1. 用户只回复一个字时直接视为答案。 2. 答对立即夸奖并揭晓谜底格式如“太棒了就是‘X’字要不要再来一题” 3. 答错告知不对可给一句简短提示但不泄露答案。格式如“不对哦再想想~” 4. 严禁在用户答错后直接公布答案只有用户说“公布答案”或“不知道”等情况时才公布。 ## 互动流程 1. 用户答对夸奖 确认正确 询问“要不要再来一题” 2. 用户答错告知不对 简单提示 鼓励继续猜 3. 用户说“提示一下”给出简短线索不公布答案 4. 用户说“公布答案”或“不知道”揭晓谜底并解释 询问“要不要再来一题” 5. 用户说“换一题”“再来一题”立即更换新字谜 ## 回复风格约束 - 语气轻松有趣但保持简洁 - 全程只围绕字谜拒绝回答其他问题 - 回复不超过3句话 - **绝对不要在回复中说“这个出过了我来个新的”或类似表述** — 直接给出新谜语即可 - 判题错误零容忍不确定谜底时先回复“我再想想”而不是乱判 ## 常见谜语类型及谜底参考示例, 仅仅为参照示例 ### 组合类 - 「一加一不是二」 王 - 「二人不是天」 夫 - 「十口不是田」 古 ### 包含类 - 「一人在内」 肉 - 「口里有人」 囚 - 「门里有口」 问 - 「田里长草」 苗 - 「心里有你」 您 - 「山里有山」 出 - 「王头上有人」 全 - 「水上有石」 泵 ### 半取类 - 「半吃半拿」 哈 - 「半真半假」 值 - 「半青半紫」 素 - 「半朋半友」 有 - 「半推半就」 扰 - 「半山半水」 汕 ### 象形类 - 「三人又重逢」 众 - 「一口咬掉牛尾巴」 告 - 「两座山」 出 - 「三日又重逢」 晶 #创建会话存放的目录 sessions if not os.path.exists(sessions): os.mkdir(sessions) #返回数据模型 class ApiResponse(BaseModel): code: int message: str data: Any #请求数据模型 class ChatRequest(BaseModel): session_id: str message: str #创建FastAPI对象实例 app FastAPI() #挂载静态文件目录 app.mount(/static, StaticFiles(directorystatic), namestatic) #定义路径操作函数 app.get(/) def root(): return FileResponse(static/index.html) #创建会话 app.post(/api/sessions) def create_sessions()- ApiResponse: print(创建会话) #1.生成会话的标识(名字) session_id generate_session_id() #2.组装会话信息保存到文件json session_data { current_session: session_id, messages: [] } with open(os.path.join(sessions,session_id .json), w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #3.返回数据 return ApiResponse(code200, message创建会话成功, datasession_id) #与AI交互 app.post(/api/chat) def chat(request: ChatRequest) - ApiResponse: print(f与AI交互:{request.session_id} : {request.message}) #逻辑实现 - 与AI大模型进行交互 #1. 加载json文件中的会话数据 session_path get_session_file_name(request.session_id) with open(session_path, r, encodingutf-8) as f: session_data json.load(f) #2. 创建与AI大模型交互的消息信息 messages [{role:system, content: prompt}] for message in session_data[messages]: messages.append(message) messages.append({role:user, content: request.message}) #3. 调用大模型 print(f------ 请求的会话信息:{messages}) #测试 # -------------------------API调用前期准备-------------------------- # 创建与 AI 大模型交互的客户端对象 api_key ark-5e6f71b7-87c7-4933-935b-534a2daa4736-b19c5 client OpenAI( base_urlhttps://ark.cn-beijing.volces.com/api/v3, api_keyapi_key, ) #-------------------------API调用前期准备-------------------------- response client.responses.create( model doubao-seed-evolving, input messages, stream False, temperature 1.3 ) #4. 获取响应数据 rd response.model_dump() # 从output里拿message的文本 content next(i[content][0][text] for i in rd[output] if i[type] message) print(------ AI大模型返回结果, content) #测试 #5. 更新消息列表 messages.append({role:assistant, content: content}) messages.pop(0) #去除系统提示词 session_data[messages] messages print(f------ 更新后的会话信息:{session_data}) #6. 保存会话信息到json文件 with open(session_path, w, encodingutf-8) as f: json.dump(session_data, f, ensure_asciiFalse, indent2) #7. 返回数据 return ApiResponse(code200, message请求成功, datacontent) #会话列表 app.get(/api/sessions) def get_sessions() - ApiResponse: print(获取会话列表) #1. 获取session目录下所有的文件名 sessions_files os.listdir(sessions) #2. 获取文件名中的会话id sessions_ids [file.split(.)[0] for file in sessions_files] #3. 返回数据 return ApiResponse(code200, message获取会话列表成功, datasessions_ids) #获取会话信息 app.get(/api/sessions/{session_id}) def get_session(session_id: str)- ApiResponse: print(获取会话信息) #1.读取会话文件json with open(os.path.join(sessions,session_id .json), r, encodingutf-8) as f: session_data json.load(f) #2.返回数据 return ApiResponse(code200, message获取会话信息成功, datasession_data) #删除会话 app.delete(/api/sessions/{session_id}) def delete_session(session_id: str) - ApiResponse: print(删除会话) #1. 删除会话文件json os.remove(os.path.join(sessions,session_id .json)) #2. 返回数据 return ApiResponse(code200, message删除会话成功, dataNone) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8001)3.6 程序优化3.6.1 日志记录程序中使用 print语句记录日志存在以下的问题关闭日志过程繁琐程序开发完毕关闭日志需要一行一行地删除或注释掉 print语句无法获取日志的输出时间和输出位置为了能够灵活的控制项目中日志的输出我们可以通过官方提供的logging 模块来输出日志具体做法如下日志级别日志级别就是给日志信息贴上的 “重要性标签”常见的级别有DEBUGINFOWARNINGERRORFATAL日志级别依次升高3.6.2 异常处理项目中的功能较多目前我们未考虑异常处理可以借助与 FastAPI 中的统一异常处理方案来处理异常具体操作实现如下
返回列表