欢迎加入开源鸿蒙PC社区:
https://harmonypc.csdn.net/

Atomgit仓库地址:https://gitcode.com/feng8403000/mingshu_ai


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一、系统概述

AI问答问诊系统是基于开源鸿蒙(OpenHarmony)平台构建的智能健康咨询服务,旨在为用户提供专业、便捷的健康问题解答和个性化健康建议。该系统集成了多技能协作机制,通过并行调用多个AI诊断技能,为用户提供全面的健康评估报告。

1.1 系统架构

系统采用模块化设计,主要包含以下核心组件:

组件名称 职责描述 技术实现
QuestionDiagnosisSkill 问题诊断技能,分析用户健康问题 DeepSeek-V3 AI模型
SymptomAnalysisSkill 症状分析技能,评估症状严重程度 DeepSeek-V3 AI模型
HealthAdviceSkill 健康建议技能,提供生活指导建议 DeepSeek-V3 AI模型
DiagnosisModal 诊断模态框,统一展示界面 JavaScript动态DOM构建

1.2 核心工作流程

用户输入健康问题
        ↓
    提交问诊请求
        ↓
┌─────────────────────────────────────┐
│  并行调用三大诊断技能                │
│  ├─ QuestionDiagnosisSkill         │
│  ├─ SymptomAnalysisSkill           │
│  └─ HealthAdviceSkill              │
└─────────────────────────────────────┘
        ↓
    结果聚合处理
        ↓
    生成综合诊断报告
        ↓
    用户界面展示

二、核心技能实现深度解析

2.1 QuestionDiagnosisSkill - 问题诊断核心技能

该技能是系统的核心诊断引擎,负责分析用户的健康问题并生成可能的原因和建议。

核心代码结构:

const QuestionDiagnosisSkill = (function() {
    const API_URL = "https://api-ai.gitcode.com/v1/chat/completions";
    const API_KEY = "qBPRwKM_kHgbBjzzxvW9ws--";

    async function queryAI(prompt) {
        // AI API调用核心逻辑
        const response = await fetch(API_URL, {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${API_KEY}`,
                "Content-Type": "application/json"
            },
            body: JSON.stringify({
                model: "deepseek-ai/DeepSeek-V3",
                messages: [{
                    role: "user",
                    content: prompt
                }],
                stream: false,
                max_tokens: 2048,
                temperature: 0.6,
                top_p: 0.95
            })
        });
        // 响应处理...
    }
    // ...
})();

关键技术点分析:

  1. API调用配置

    • model: 采用DeepSeek-V3大语言模型,具备强大的医疗领域知识
    • max_tokens: 设置为2048,确保能够获取详细的诊断结果
    • temperature: 设置为0.6,平衡回答的准确性和多样性
    • top_p: 设置为0.95,控制生成文本的多样性
  2. Prompt工程设计

const prompt = `你是一位专业的医疗健康顾问,请详细分析以下健康问题并给出专业建议:

${question}

请以JSON格式返回结果,包含以下字段:
- possibleCauses: 可能的原因(字符串数组)
- suggestions: 应对措施(字符串数组)
- medicalAdvice: 是否需要就医及建议(字符串)
- healthTips: 健康小贴士(字符串数组)

请确保 medicalAdvice 是字符串类型,不要是对象或数组。`;

设计思路:

  • 明确角色定位:“专业的医疗健康顾问”
  • 要求结构化输出:JSON格式便于程序解析
  • 字段类型约束:明确指定数据类型避免解析错误
  1. 响应解析与容错机制
function parseResponse(response) {
    try {
        let jsonStr = response.trim();
        
        // 处理代码块格式
        const codeBlockMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
        if (codeBlockMatch) {
            jsonStr = codeBlockMatch[1];
        }

        // 提取JSON结构
        const braceStart = jsonStr.indexOf('{');
        const braceEnd = jsonStr.lastIndexOf('}');
        
        if (braceStart === -1 || braceEnd === -1) {
            throw new Error('No valid JSON found');
        }
        
        jsonStr = jsonStr.substring(braceStart, braceEnd + 1);
        jsonStr = jsonStr.replace(/,\s*([}\]])/g, '$1');  // 移除尾部逗号
        
        return JSON.parse(jsonStr);
    } catch (error) {
        console.error('Parse Error:', error.message);
        return generateFallbackResponse();
    }
}

容错策略:

  • 支持Markdown代码块格式的输出
  • 自动定位JSON边界,处理非标准输出
  • 移除JSON尾部逗号,兼容不规范的输出
  • 解析失败时自动生成降级响应
  1. 数据安全处理
function sanitizeResponse(response) {
    const fallback = generateFallbackResponse();
    return {
        possibleCauses: ensureArray(response.possibleCauses, fallback.possibleCauses),
        suggestions: ensureArray(response.suggestions, fallback.suggestions),
        medicalAdvice: ensureString(response.medicalAdvice, fallback.medicalAdvice),
        healthTips: ensureArray(response.healthTips, fallback.healthTips)
    };
}

数据验证机制:

  • ensureArray: 确保返回值为数组类型
  • ensureString: 确保返回值为字符串类型
  • 提供默认值兜底,防止前端渲染异常

2.2 SymptomAnalysisSkill - 症状分析技能

该技能专注于症状严重程度评估和潜在健康状况识别。

核心实现:

async function analyze(symptoms) {
    console.log('Symptom Analysis Skill - analyzing:', symptoms);
    
    const prompt = `你是一位专业的医学症状分析专家。请分析以下症状描述,给出专业的医学分析:

症状:${symptoms}

请以JSON格式返回分析结果,包含以下字段:
- symptoms: 识别到的具体症状列表(字符串数组)
- severity: 症状严重程度(轻微/中等/严重,字符串)
- possibleConditions: 可能的疾病或健康状况(字符串数组)
- affectedSystems: 可能受影响的身体系统(字符串数组)

请确保 severity 是字符串类型,不要是对象或数组。`;

    const response = await queryAI(prompt);
    
    if (!response) {
        return generateFallbackResponse();
    }

    try {
        const parsed = parseResponse(response);
        return sanitizeResponse(parsed);
    } catch (error) {
        return generateFallbackResponse();
    }
}

关键特性:

特性 说明
症状识别 自动从用户输入中提取具体症状
严重程度评估 将症状分为轻微/中等/严重三个等级
疾病预测 基于症状推断可能的健康状况
系统影响分析 识别可能受影响的身体系统

2.3 HealthAdviceSkill - 健康建议技能

该技能根据用户健康状况提供个性化的生活方式建议。

核心实现:

async function getAdvice(condition) {
    console.log('Health Advice Skill - getting advice for:', condition);
    
    const prompt = `你是一位专业的健康管理顾问。请根据以下健康状况提供详细的生活建议:

健康状况:${condition}

请以JSON格式返回建议,包含以下字段:
- sleepAdvice: 睡眠建议(字符串)
- stressManagement: 压力管理建议(字符串)
- hydration: 饮水建议(字符串)
- restAdvice: 休息与活动建议(字符串)

请确保所有字段都是字符串类型,不要嵌套对象或数组。`;

    const response = await queryAI(prompt);
    
    if (!response) {
        return generateFallbackResponse();
    }

    try {
        const parsed = parseResponse(response);
        return sanitizeResponse(parsed);
    } catch (error) {
        return generateFallbackResponse();
    }
}

建议维度:

  • 睡眠建议:针对不同健康状况的睡眠时长和质量建议
  • 压力管理:提供具体的减压方法和技巧
  • 饮水建议:个性化的饮水量和饮水方式指导
  • 休息建议:合理的休息与活动平衡建议

2.4 DiagnosisModal - 诊断模态框组件

该组件负责统一的UI展示和多技能协同调度。

核心代码解析:

  1. 动态DOM构建
function createModal() {
    if (modalContainer) return;

    modalContainer = document.createElement('div');
    modalContainer.id = 'diagnosisModal';
    modalContainer.className = 'diagnosis-modal-overlay';
    modalContainer.style.cssText = `
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: rgba(0, 0, 0, 0.85);
        z-index: 10000;
        justify-content: center;
        align-items: center;
        overflow: auto;
    `;
    // ...
}

设计要点:

  • 动态创建DOM元素,避免HTML中冗余代码
  • 内联CSS样式,确保样式隔离
  • 高z-index值确保模态框置顶显示
  1. 多技能并行调度
async function submitQuestion() {
    // ... 状态初始化
    
    try {
        const updateStatus = (skillId, status, className) => {
            const statusEl = document.getElementById(status);
            if (statusEl) {
                statusEl.textContent = skillId;
                statusEl.className = 'skill-status ' + className;
            }
        };

        // 三个技能并行执行
        updateStatus('正在分析...', 'status1', 'running');
        const diagnosisPromise = QuestionDiagnosisSkill.diagnose(question).then(result => {
            updateStatus('✓ 完成', 'status1', 'completed');
            return result;
        }).catch(error => {
            updateStatus('✗ 失败', 'status1', 'failed');
            throw error;
        });

        updateStatus('正在分析...', 'status2', 'running');
        const analysisPromise = SymptomAnalysisSkill.analyze(question).then(result => {
            updateStatus('✓ 完成', 'status2', 'completed');
            return result;
        }).catch(error => {
            updateStatus('✗ 失败', 'status2', 'failed');
            throw error;
        });

        updateStatus('正在分析...', 'status3', 'running');
        const advicePromise = HealthAdviceSkill.getAdvice(question).then(result => {
            updateStatus('✓ 完成', 'status3', 'completed');
            return result;
        }).catch(error => {
            updateStatus('✗ 失败', 'status3', 'failed');
            throw error;
        });

        // 等待所有技能完成
        const [diagnosisResult, analysisResult, adviceResult] = await Promise.all([
            diagnosisPromise,
            analysisPromise,
            advicePromise
        ]);

        // 结果聚合
        const combinedResult = combineResults(diagnosisResult, analysisResult, adviceResult);
        displayQuestionAnswer(combinedResult);
    } catch (error) {
        console.error('诊断错误:', error.message);
    }
}

并发设计优势:

  • 使用Promise.all实现三个技能并行调用,减少总响应时间
  • 实时状态更新,提升用户体验
  • 任一技能失败不影响其他技能执行(通过catch处理)
  1. 结果聚合逻辑
function combineResults(diagnosis, analysis, advice) {
    return {
        possibleCauses: diagnosis.possibleCauses || [],
        suggestions: diagnosis.suggestions || [],
        medicalAdvice: diagnosis.medicalAdvice || '',
        healthTips: diagnosis.healthTips || [],
        severity: analysis.severity || '中等',
        possibleConditions: analysis.possibleConditions || [],
        affectedSystems: analysis.affectedSystems || [],
        sleepAdvice: advice.sleepAdvice || '',
        stressManagement: advice.stressManagement || '',
        hydration: advice.hydration || '',
        restAdvice: advice.restAdvice || ''
    };
}

数据整合策略:

  • 合并三个技能的输出
  • 提供默认值,防止空数据导致渲染异常
  • 统一数据结构,便于前端展示
  1. 结果展示
function displayQuestionAnswer(result) {
    const answerContent = document.getElementById('diagnosisAnswerContent');
    if (!answerContent) return;

    let html = '';

    // 症状严重程度
    if (result.severity) {
        const severityColors = {
            '轻微': '#27ae60',
            '中等': '#f39c12',
            '严重': '#e74c3c'
        };
        html += `
            <div class="diagnosis-answer-section">
                <div class="diagnosis-section-title">📊 症状严重程度</div>
                <div class="diagnosis-section-content">
                    <span style="color: ${severityColors[result.severity] || '#fff'};">${result.severity}</span>
                </div>
            </div>`;
    }

    // 可能的健康状况
    if (result.possibleConditions && result.possibleConditions.length > 0) {
        html += `
            <div class="diagnosis-answer-section">
                <div class="diagnosis-section-title">🤒 可能的健康状况</div>
                <div class="diagnosis-section-content">`;
        result.possibleConditions.forEach((condition, index) => {
            html += `<div style="margin: 5px 0;">${index + 1}. ${condition}</div>`;
        });
        html += '</div></div>';
    }

    // ... 其他模块展示
    
    answerContent.innerHTML = html;
}

UI设计特点:

  • 模块化展示,结构清晰
  • 使用颜色编码表示严重程度(绿色=轻微,橙色=中等,红色=严重)
  • 使用emoji图标增强视觉效果
  • 响应式布局,适配不同屏幕尺寸

三、系统工作流程详解

3.1 用户交互流程

┌─────────────────────────────────────────────────────────────────┐
│                     用户交互流程                                 │
├─────────────────────────────────────────────────────────────────┤
│  1. 用户进入问诊页面                                            │
│         ↓                                                       │
│  2. 输入健康问题或选择常见问题                                    │
│         ↓                                                       │
│  3. 点击"提交问诊"按钮                                          │
│         ↓                                                       │
│  4. 显示加载状态,三个技能同时分析                                │
│         ↓                                                       │
│  5. 各技能依次完成,状态更新                                     │
│         ↓                                                       │
│  6. 结果聚合,生成综合诊断报告                                    │
│         ↓                                                       │
│  7. 用户查看诊断结果                                            │
└─────────────────────────────────────────────────────────────────┘

3.2 技能协作时序图

用户          QuestionDiagnosis      SymptomAnalysis      HealthAdvice        AI API
 │                  │                      │                     │              │
 │──submitQuestion──┼──────────────────────┼─────────────────────┼──────────────│
 │                  │                      │                     │              │
 │                  │───diagnose()────────>                      │              │
 │                  │                      │───analyze()────────>              │
 │                  │                      │                     │──getAdvice()>│
 │                  │                      │                     │              │
 │                  │<─────API调用─────────│                     │              │
 │                  │                      │<─────API调用─────────│              │
 │                  │                      │                     │<──API调用────│
 │                  │                      │                     │              │
 │<─displayResult───│<─────combineResults─│<───────combineResults│              │
 │                  │                      │                     │              │

四、API调用机制

4.1 请求配置详解

参数 说明
model deepseek-ai/DeepSeek-V3 采用深度求索公司的V3模型
stream false 非流式响应,等待完整结果
max_tokens 2048 最大生成token数
temperature 0.6 控制随机性,值越高越随机
top_p 0.95 核采样参数,控制生成多样性

4.2 错误处理机制

async function queryAI(prompt) {
    try {
        const response = await fetch(API_URL, {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${API_KEY}`,
                "Content-Type": "application/json"
            },
            body: JSON.stringify({/*...*/})
        });

        if (!response.ok) {
            const errorText = await response.text();
            console.error('HTTP Error:', errorText);
            throw new Error(`HTTP error! status: ${response.status}`);
        }

        const data = await response.json();
        if (data.choices && data.choices[0] && data.choices[0].message) {
            return data.choices[0].message.content;
        }
        return null;
    } catch (error) {
        console.error('Question Diagnosis AI Error:', error.message);
        throw error;
    }
}

错误处理层次:

  1. 网络层错误:捕获fetch请求失败
  2. HTTP错误:检查response.ok状态
  3. 业务层错误:验证响应数据结构
  4. 日志记录:详细记录错误信息便于排查

五、数据安全与隐私保护

5.1 数据处理原则

原则 实现方式
数据最小化 仅收集必要的健康问题输入
传输加密 使用HTTPS协议
本地处理 前端直接调用API,无中间服务器
无持久化 不存储用户健康数据

5.2 输入验证

function setQuestion(question) {
    const input = document.getElementById('diagnosisQuestionInput');
    if (input) {
        input.value = question;
        selectedQuestion = question;
    }
}

async function submitQuestion() {
    const input = document.getElementById('diagnosisQuestionInput');
    const question = input ? input.value.trim() : selectedQuestion;
    
    if (!question) {
        alert('请输入您的健康问题');
        return;
    }
    // ...
}

验证机制:

  • 非空验证:确保用户输入有效内容
  • 前后端双重验证:前端校验 + AI模型处理
  • 输入长度限制:防止恶意超长输入

六、性能优化策略

6.1 并行执行优化

通过Promise.all实现三个AI技能并行调用,理论上可将响应时间降低约60%(从串行的3T变为并行的T)。

6.2 缓存机制

let symptomAnalysisResult = null;

async function analyzeSymptoms() {
    // 使用缓存结果
    if (symptomAnalysisResult) {
        displaySymptomAnalysis(symptomAnalysisResult);
        return;
    }
    
    // ... 实际分析逻辑
    
    symptomAnalysisResult = parsedData;
}

6.3 资源预加载

<script src="../js/question_diagnosis_skill.js"></script>
<script src="../js/symptom_analysis_skill.js"></script>
<script src="../js/health_advice_skill.js"></script>

加载策略:

  • 页面初始化时预加载所有技能脚本
  • 减少用户操作时的等待时间
  • 支持浏览器缓存机制

七、扩展性设计

7.1 技能扩展架构

系统采用插件化设计,新技能可以方便地集成:

// 新增技能示例
const CustomSkill = (function() {
    async function process(input) {
        // 技能处理逻辑
    }
    
    return {
        process: process
    };
})();

// 集成到诊断流程
const customPromise = CustomSkill.process(question).then(result => {
    updateStatus('✓ 完成', 'status4', 'completed');
    return result;
});

7.2 配置化设计

// 技能配置示例
const skillConfig = {
    questionDiagnosis: {
        enabled: true,
        priority: 1,
        apiConfig: {
            max_tokens: 2048,
            temperature: 0.6
        }
    },
    symptomAnalysis: {
        enabled: true,
        priority: 2,
        apiConfig: {
            max_tokens: 1024,
            temperature: 0.5
        }
    },
    healthAdvice: {
        enabled: true,
        priority: 3,
        apiConfig: {
            max_tokens: 1024,
            temperature: 0.55
        }
    }
};

八、用户体验优化

8.1 状态反馈机制

const updateStatus = (skillId, status, className) => {
    const statusEl = document.getElementById(status);
    if (statusEl) {
        statusEl.textContent = skillId;
        statusEl.className = 'skill-status ' + className;
    }
};

// 状态样式
// .skill-status.running { background: #f39c12; color: #1a1a2e; }
// .skill-status.completed { background: #27ae60; color: #fff; }
// .skill-status.failed { background: #e74c3c; color: #fff; }

状态视觉反馈:

  • 等待中:灰色背景
  • 运行中:橙色背景
  • 完成:绿色背景 + ✓ 图标
  • 失败:红色背景 + ✗ 图标

8.2 常见问题快捷选择

<div class="common-questions">
    <h4>💬 常见问题:</h4>
    <div>
        <span class="question-tag" onclick="setQuestion('最近总是失眠怎么办?')">失眠问题</span>
        <span class="question-tag" onclick="setQuestion('经常头痛是什么原因?')">头痛原因</span>
        <span class="question-tag" onclick="setQuestion('如何提高免疫力?')">提高免疫力</span>
        <span class="question-tag" onclick="setQuestion('感冒了应该吃什么药?')">感冒用药</span>
        <span class="question-tag" onclick="setQuestion('如何缓解疲劳?')">缓解疲劳</span>
        <span class="question-tag" onclick="setQuestion('饮食不规律怎么办?')">饮食问题</span>
    </div>
</div>

设计优势:

  • 减少用户输入成本
  • 提供问题模板参考
  • 引导用户提出有效问题

九、部署与集成

9.1 鸿蒙平台集成

系统已集成到开源鸿蒙PC平台,通过Web Engine组件运行Web应用:

┌────────────────────────────────────┐
│      OpenHarmony PC 应用            │
├────────────────────────────────────┤
│  ┌─────────────────────────────┐   │
│  │    Web Engine 组件          │   │
│  │  (Chromium-based)           │   │
│  │                             │   │
│  │  ┌─────────────────────┐    │   │
│  │  │  AI问诊Web应用      │    │   │
│  │  │  (HTML/CSS/JS)      │    │   │
│  │  └─────────────────────┘    │   │
│  └─────────────────────────────┘   │
└────────────────────────────────────┘

9.2 文件结构

web_engine/src/main/resources/resfile/resources/app/
├── js/
│   ├── ai.js                    # 核心AI调用模块
│   ├── question_diagnosis_skill.js  # 问题诊断技能
│   ├── symptom_analysis_skill.js    # 症状分析技能
│   ├── health_advice_skill.js       # 健康建议技能
│   ├── diagnosis_modal.js        # 诊断模态框组件
│   └── ...
├── pages/
│   ├── question_diagnosis.html   # 问诊页面
│   └── ...
└── main.js                      # 应用入口

十、总结

AI问答问诊系统通过模块化设计、并行技能调用、完善的错误处理机制,为用户提供了专业、高效的健康咨询服务。系统具有以下特点:

  1. 多技能协作:三个AI技能并行工作,提供全面诊断
  2. 容错设计:每个技能独立失败不影响其他技能
  3. 用户体验:实时状态反馈,友好的交互界面
  4. 扩展性:插件化架构,易于添加新技能
  5. 数据安全:无持久化存储,保护用户隐私

该系统展示了在开源鸿蒙平台上构建AI应用的最佳实践,为健康管理领域的智能化提供了优秀的参考案例。


欢迎加入开源鸿蒙PC社区:
https://harmonypc.csdn.net/


参考文献:

  1. DeepSeek-V3模型文档:https://platform.deepseek.com/
  2. 开源鸿蒙官方文档:https://gitee.com/openharmony/docs
  3. Web Engine组件参考:OpenHarmony Web Engine API
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐