ARTICLE DETAIL

资讯详情

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

零基础入门python66:FastAPI AI标题、摘要和标签

零基础入门python66:FastAPI AI标题、摘要和标签 零基础入门python66FastAPI AI标题、摘要和标签一、上一篇课后练习讲解上一篇练习围绕“安全调用大模型API”。参考做法是先运行上一篇的测试再用一个成功请求和一个失败请求验证边界本篇在同一项目上增加新能力。上一篇课后练习完整答案上一篇练习已经落实到完整文件运行下面代码可以观察本篇要求的成功和失败状态数据库写入全部放在明确事务边界内。答案要点safe_generate 截断脱敏 prompt用 asyncio.wait_for 控制超时超时只把 ai_status 置 failed不回滚正文。完整答案文件app/ai.py完整参考答案文件完整文件app/ai.pyimportasyncioasyncdefsafe_generate(client,prompt,timeout10):promptprompt[:4000]try:resultawaitasyncio.wait_for(client.generate(prompt),timeout)return{status:ok,text:result.text}exceptasyncio.TimeoutError:return{status:failed,error:ai_timeout}验收运行项目测试FastAPI/Flask 使用 python -m pytest -qDjango 使用 python manage.py test再按本文 curl 或 Docker 命令检查预期状态码。完整参考答案文件下面是交付项目中真实存在的完整文件 fastapi-blog/app/ai.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。fromtypingimportProtocolfromfastapiimportAPIRouter,Dependsfrom.dependenciesimportget_current_userfrom.modelsimportUserfrom.schemasimportWritingRequestclassAIClient(Protocol):defsuggest(self,content:str)-dict:...classLocalAIClient:defsuggest(self,content):return{title:content[:20],summary:content[:80],tags:[Python]}defget_ai_client():returnLocalAIClient()routerAPIRouter(prefix/api/ai,tags[ai])router.post(/writing-assistant)defwriting_assistant(body:WritingRequest,user:UserDepends(get_current_user),client:AIClientDepends(get_ai_client)):returnclient.suggest(body.content)正文长度限制控制成本邮箱、token 和内部提示词不能写进日志模型输出永远是不可信输入不能执行其中的 SQL、HTML 或 Python。二、本篇要解决的真实问题把 AI 输出解析为结构化 schema校验标题长度和标签数量解析失败返回可追踪错误并写审计日志。三、请求是怎样走完整条链路的客户端请求 → 路由匹配 → Pydantic 校验 → Depends 注入用户/Session → SQLAlchemy 查询或业务服务 → 提交事务 → 响应模型序列化。每一步都有明确责任排错时按这个顺序定位。四、先看一个最小代码片段timeout_seconds10# 外部服务必须有超时失败时返回可解释的降级结果这里的注释不是装饰它说明数据从哪里来、为什么不能相信客户端以及失败时系统应保持什么状态。五、完整文件代码app/ai.py当前阶段完整文件fromtypingimportProtocolfromfastapiimportAPIRouter,Dependsfrom.dependenciesimportget_current_userfrom.modelsimportUserfrom.schemasimportWritingRequestclassAIClient(Protocol):defsuggest(self,content:str)-dict:...classLocalAIClient:defsuggest(self,content):return{title:content[:20],summary:content[:80],tags:[Python]}defget_ai_client():returnLocalAIClient()routerAPIRouter(prefix/api/ai,tags[ai])router.post(/writing-assistant)defwriting_assistant(body:WritingRequest,user:UserDepends(get_current_user),client:AIClientDepends(get_ai_client)):returnclient.suggest(body.content)阅读方法先找路由函数再找它的 Depends、输入 schema、数据库操作和 response_model这五处合起来才是一个功能。app/schemas.py当前阶段完整文件fromdatetimeimportdatetimefrompydanticimportBaseModel,ConfigDict,EmailStr,Field,field_validatorclassUserCreate(BaseModel):email:EmailStr password:strField(min_length8,max_length128)classUserRead(BaseModel):model_configConfigDict(from_attributesTrue)id:intemail:strclassToken(BaseModel):access_token:strtoken_type:strbearerclassArticleCreate(BaseModel):title:strField(min_length2,max_length120)content:strField(min_length10,max_length20000)field_validator(title)classmethoddefclean_title(cls,value):returnvalue.strip()classArticleRead(ArticleCreate):model_configConfigDict(from_attributesTrue)id:intauthor_id:intcreated_at:datetimeclassCommentCreate(BaseModel):content:strField(min_length1,max_length500)classWritingRequest(BaseModel):content:strField(min_length20,max_length10000)阅读方法先找路由函数再找它的 Depends、输入 schema、数据库操作和 response_model这五处合起来才是一个功能。六、安装、启动与验收..\..\.venv\Scripts\python.exe-m pip install-r requirements.txt..\..\.venv\Scripts\python.exe-m pytest-q..\..\.venv\Scripts\python.exe-m uvicorn app.main:app--reload打开/docs按顺序完成注册、登录、创建文章、分页查询、修改删除、评论点赞。错误请求必须看到明确状态码校验错误 422未登录 401无权限 403重复点赞 409。测试应全部通过。七、本篇验收清单能指出输入校验发生在哪个 schema。能解释 Session 何时提交、何时回滚。能用第二个用户验证资源隔离。能复现一个失败场景并说明原因。八、课后练习围绕“AI标题、摘要和标签”新增一个测试用例写出请求、预期响应和断言下一篇开头会给出参考实现并继续使用本项目。五、AI 标题、摘要和标签结果服务于编辑工作流流程是正文提交、模型建议、字段校验、用户确认、最终保存。模型建议默认不覆盖数据库。router.post(/writing-assistant)defwriting_assistant(body:WritingRequest,user:UserDepends(get_current_user),client:AIClientDepends(get_ai_client)):suggestionclient.suggest(body.content)return{requested_by:user.id,title:suggestion[title].strip(),summary:suggestion[summary].strip(),tags:list(dict.fromkeys(suggestion.get(tags,[])))[:5]}标签去重保留顺序最多五个。对同一正文可按内容哈希缓存但 key 要包含提示词版本。让 FakeAI 返回空标题或 20 个标签服务端应拒绝或降级而不是保存脏数据。六、当前项目中的完整文件对照阅读七、AI 输出的人工确认点把 AI 结果展示为草稿用户点击确认后才写入 articles。保存时再次检查标题长度、标签数量和当前用户权限因为客户端可能篡改确认请求。模型输出的 Markdown 不能直接当 HTML 渲染先做安全过滤防止脚本注入。可以把 prompt_version、model_name 和 latency_ms 保存到审计表未来才有可能比较不同提示词的质量和成本。八、补充代码文件九、质量评估不能只看格式为 AI 建立人工抽样表标题是否概括正文、摘要是否出现正文没有的事实、标签是否过宽、是否包含敏感信息。每周抽样记录通过率和平均延迟提示词升级前后对比同一批文章。模型输出先用 Pydantic 校验再做业务过滤例如标签去重、禁止空标题、限制 Markdown 长度。保存用户确认后的结果并保留原始正文 hash出现投诉时能够复现当时的 prompt_version。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。app/ai.pyfromtypingimportProtocolfromfastapiimportAPIRouter,Dependsfrom.dependenciesimportget_current_userfrom.modelsimportUserfrom.schemasimportWritingRequestclassAIClient(Protocol):defsuggest(self,content:str)-dict:...classLocalAIClient:defsuggest(self,content):return{title:content[:20],summary:content[:80],tags:[Python]}defget_ai_client():returnLocalAIClient()routerAPIRouter(prefix/api/ai,tags[ai])router.post(/writing-assistant)defwriting_assistant(body:WritingRequest,user:UserDepends(get_current_user),client:AIClientDepends(get_ai_client)):returnclient.suggest(body.content)
返回列表