678 字
3 分钟
AI模块设计进阶:健康计划生成与解析逻辑完善
2025-05-30
无标签

1. 模块概述#

模块定位

本次迭代聚焦于 AI 模块功能的进阶开发,核心任务包括:

  • 接入 DeepSeek API 并实现接口调用封装
  • 实现健康计划的标准格式输出
  • 完善计划解析模型,支持健壮性输入处理
  • 规范 API 密钥管理与环境隔离

2. 核心设计#

2.1 环境变量管理#

安全封装

为提升安全性,系统将敏感信息如 API Key 存储于 .env 文件中,并使用 python-dotenv 加载。

# 安装依赖
pip install python-dotenv
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1

配置加载:

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

client = OpenAI(
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_BASE_URL")
)

2.2 接口封装与调用#

def chat(user_id, information):
    try:
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": prompt},
                {"role": "user", "content": f"User ID: {user_id}, Information: {information}"}
            ],
            stream=False,
            temperature=0.7
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"[Error] Chat request failed: {e}")
        return None

2.3 提示词标准构建#

from openai import OpenAI

def build_prompt():
    today = datetime.date.today()
    intro = f"今天是{today}。"
    role_description = (
        "你是一个健康助手,下面我将给你用户的信息,你需要给出从今天开始一周的健康和饮食计划,"
        "要求有7天,每天有三个饮食规划和两个运动规划。要求标准化输出,其他额外内容不要。"
    )
    format_guide = (
        "请按照以下格式提供计划回复:每个任务以分号 (;) 分隔,任务的格式如下:"
        "p<day>: <starttime>; <endtime>; <task_name>; <task_description>; "
        "- <day>: 任务的天数标识,例如 \"p1\" 表示第 1 天。"
        "- <starttime>: 任务的开始时间,例如 \"08:00\"。"
        "- <endtime>: 任务的结束时间,例如 \"10:00\"。"
        "- <task_name>: 任务的名称,例如 \"晨跑\"。"
        "- <task_description>: 任务的详细描述,例如 \"在公园跑步 5 公里\"。"
        "示例回复:p1: 08:00; 10:00; 晨跑; 在公园跑步 5 公里; p2: 14:00; 16:00; 阅读; 阅读一本书;"
    )
    return intro + role_description + format_guide

2.4 健康计划数据结构与解析函数#

# response2plan.py
from typing import Optional, List
from datetime import datetime

class Plan:
    def __init__(self, thing, description, day, start_date, end_date):
        self.thing = thing
        self.description = description
        self.day = day
        self.start_date = start_date
        self.end_date = end_date

def parse_plans(input_text: Optional[str]) -> List[Plan]:
    if not input_text:
        return []

    plans = []
    lines = input_text.strip().split("\n")
    for line in lines:
        if line.startswith("p"):
            _, content = line.split(":", 1)
            day = int(line[1])
            parts = [p.strip() for p in content.split(";") if p.strip()]
            if len(parts) >= 4:
                start = datetime.strptime(parts[0], "%H:%M").time()
                end = datetime.strptime(parts[1], "%H:%M").time()
                plans.append(Plan(parts[2], parts[3], day, start, end))
    return plans

3. 工作流程#

更新后的流程

前端提交用户健康信息

构建完整 Prompt 调用 DeepSeek 模型

返回内容按行格式拆解,交由解析函数转为 Plan 实例

4. 测试验证#

# 启动虚拟环境
.venv\Scripts\activate

# 启动 Django 服务器
python manage.py runserver

5. 总结#

本次迭代在 v0.4 基础上完善了核心 AI 服务的调用、响应与结构化能力,为健康助手系统的智能决策模块打下了坚实基础。