鸿蒙Electron框架下鸿蒙PC——AI问答问诊系统深度解析与实现
AI问答问诊系统摘要 基于开源鸿蒙(OpenHarmony)的智能健康咨询系统,集成三大AI技能: 问题诊断:DeepSeek-V3模型分析病因,结构化输出JSON结果 症状评估:识别症状严重程度及潜在疾病 健康建议:提供个性化生活指导 技术亮点: 并行调用多技能,聚合生成综合报告 强化API容错机制,自动处理非标准JSON响应 严格数据校验确保前端渲染安全 开源地址:Atomgit仓库 系统通过
欢迎加入开源鸿蒙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
})
});
// 响应处理...
}
// ...
})();
关键技术点分析:
-
API调用配置
model: 采用DeepSeek-V3大语言模型,具备强大的医疗领域知识max_tokens: 设置为2048,确保能够获取详细的诊断结果temperature: 设置为0.6,平衡回答的准确性和多样性top_p: 设置为0.95,控制生成文本的多样性
-
Prompt工程设计
const prompt = `你是一位专业的医疗健康顾问,请详细分析以下健康问题并给出专业建议:
${question}
请以JSON格式返回结果,包含以下字段:
- possibleCauses: 可能的原因(字符串数组)
- suggestions: 应对措施(字符串数组)
- medicalAdvice: 是否需要就医及建议(字符串)
- healthTips: 健康小贴士(字符串数组)
请确保 medicalAdvice 是字符串类型,不要是对象或数组。`;
设计思路:
- 明确角色定位:“专业的医疗健康顾问”
- 要求结构化输出:JSON格式便于程序解析
- 字段类型约束:明确指定数据类型避免解析错误
- 响应解析与容错机制
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尾部逗号,兼容不规范的输出
- 解析失败时自动生成降级响应
- 数据安全处理
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展示和多技能协同调度。
核心代码解析:
- 动态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值确保模态框置顶显示
- 多技能并行调度
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处理)
- 结果聚合逻辑
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 || ''
};
}
数据整合策略:
- 合并三个技能的输出
- 提供默认值,防止空数据导致渲染异常
- 统一数据结构,便于前端展示
- 结果展示
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;
}
}
错误处理层次:
- 网络层错误:捕获fetch请求失败
- HTTP错误:检查response.ok状态
- 业务层错误:验证响应数据结构
- 日志记录:详细记录错误信息便于排查
五、数据安全与隐私保护
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问答问诊系统通过模块化设计、并行技能调用、完善的错误处理机制,为用户提供了专业、高效的健康咨询服务。系统具有以下特点:
- 多技能协作:三个AI技能并行工作,提供全面诊断
- 容错设计:每个技能独立失败不影响其他技能
- 用户体验:实时状态反馈,友好的交互界面
- 扩展性:插件化架构,易于添加新技能
- 数据安全:无持久化存储,保护用户隐私
该系统展示了在开源鸿蒙平台上构建AI应用的最佳实践,为健康管理领域的智能化提供了优秀的参考案例。
欢迎加入开源鸿蒙PC社区:
https://harmonypc.csdn.net/
参考文献:
- DeepSeek-V3模型文档:https://platform.deepseek.com/
- 开源鸿蒙官方文档:https://gitee.com/openharmony/docs
- Web Engine组件参考:OpenHarmony Web Engine API
更多推荐

所有评论(0)