目录
- 前言
- [1. 项目概述与技术选型](#1. 项目概述与技术选型)
-
- [1.1 项目目标](#1.1 项目目标)
- [1.2 系统架构设计](#1.2 系统架构设计)
- [1.3 技术栈选型](#1.3 技术栈选型)
- [2. openEuler环境准备与配置](#2. openEuler环境准备与配置)
-
- [2.1 系统安装](#2.1 系统安装)
- [2.2 系统基础配置与软件安装](#2.2 系统基础配置与软件安装)
- [3. 后端API服务开发 (Python + FastAPI)](#3. 后端API服务开发 (Python + FastAPI))
-
- [3.1 项目结构](#3.1 项目结构)
- [3.2 编写后端代码](#3.2 编写后端代码)
- [3.3 部署与测试](#3.3 部署与测试)
- [4. 前端用户界面开发 (Vue.js + Element Plus)](#4. 前端用户界面开发 (Vue.js + Element Plus))
-
- [4.1 项目初始化](#4.1 项目初始化)
- [4.2 编写前端代码](#4.2 编写前端代码)
- [4.3 运行前端应用](#4.3 运行前端应用)
- [5. 系统运行诊断与监控](#5. 系统运行诊断与监控)
-
- [5.1 监控CPU和内存使用](#5.1 监控CPU和内存使用)
- [5.2 监控网络连接](#5.2 监控网络连接)
- [6. 结论与展望](#6. 结论与展望)
前言
本项目旨在开发一个概念验证(Proof-of-Concept)级别的智能医疗诊断问答应用。用户可以通过一个简洁的Web界面输入自己的症状,系统将调用后端API服务。该服务负责与一个强大的大语言模型进行交互,分析用户输入,并提供初步的诊断建议和相关信息。整个应用将完全部署在openEuler操作系统之上,以验证其作为AI应用承载平台的能力和稳定性。
1. 项目概述与技术选型
1.1 项目目标
本项目旨在开发一个概念验证(Proof-of-Concept)级别的智能医疗诊断问答应用。用户可以通过一个简洁的Web界面输入自己的症状,系统将调用后端API服务。该服务负责与一个强大的大语言模型进行交互,分析用户输入,并提供初步的诊断建议和相关信息。整个应用将完全部署在openEuler操作系统之上,以验证其作为AI应用承载平台的能力和稳定性。
1.2 系统架构设计
我们采用经典的客户端-服务器(Client-Server)分离架构,该架构具有高内聚、低耦合的优点,便于前后端的独立开发、测试和部署。
- 前端(Client): 一个基于Web的用户界面,负责接收用户输入并展示模型的响应。
- 后端(Server): 一个API服务,作为前端与大模型之间的桥梁。它接收前端的请求,构建符合模型要求的Prompt,调用大模型API,并将处理后的结果返回给前端。
- 操作系统(OS): 选用 openEuler 作为底层操作系统,以确保系统的稳定性和安全性。
- 大语言模型(LLM): 外部的商业或开源大模型API服务,负责核心的自然语言理解和生成任务。
1.3 技术栈选型
经过对现有技术和项目需求的分析,我们确定了以下技术栈:
- 操作系统 : openEuler 24.03 LTS 。这是一个长期支持版本,提供了较好的稳定性和社区支持,非常适合作为服务器操作系统。
- 部署硬件规格 :
- CPU: Intel® Xeon® Platinum 8260 CPU @ 2.40GHz (或同等级别的x86_64/AArch64架构处理器) 。
- 内存: 32 GB RAM 。考虑到大模型服务和后端应用的内存消耗,8GB是最低要求,32GB能提供更流畅的体验。
- 存储: 500 GB NVMe SSD (建议不小于120GB) 。
- GPU: NVIDIA A100 (可选,如果进行本地模型推理或微调)。对于API调用模式,GPU不是必需的。
- 大语言模型 :
- 名称与版本 : Llama-3.1-70B-Instruct 。选择此模型是因为其强大的性能和相对开放的使用许可,适合研究和开发。
- 获取方式: 通过API调用。我们将使用一个提供此类模型API服务的第三方平台(如Hugging Face Inference API、Replicate或类似的云服务),这简化了本地部署的复杂性 。
- 许可证: Llama 3 Community License,允许商业和研究用途,但需遵守其使用政策 。
- 后端技术栈 :
- 编程语言: Python 3.11。Python因其丰富的AI/ML生态和简洁的语法而成为首选 。
- API框架: FastAPI。这是一个现代、高性能的Python Web框架,非常适合快速构建API服务 。
- 前端技术栈 :
- 框架: Vue 3。Vue以其易用性和高效的组件化开发模式而著称 。
- UI库: Element Plus。提供了一套丰富美观的UI组件,可以加速前端界面的开发 。
- 构建工具: Vite。提供极速的开发服务器启动和模块热更新,提升开发体验。
- HTTP客户端: Axios。用于在前端和后端之间进行API通信。
2. openEuler环境准备与配置
在部署应用之前,我们需要先准备好openEuler操作系统环境。我们将使用openEuler 24.03 LTS的x86_64版本。
2.1 系统安装
首先,从openEuler官方社区或镜像站下载ISO镜像文件 。然后通过U盘或虚拟机进行安装。安装过程与主流Linux发行版类似,采用图形化界面引导,选择"服务器"模式并进行磁盘分区和网络配置。
实操截图 1: openEuler 桌面环境
(描述: openEuler 24.03 LTS安装完成后的桌面环境,展示了其现代化的用户界面。)
2.2 系统基础配置与软件安装
安装完成后,打开终端,进行系统更新和必要软件的安装。
- 更新系统软件包:

终端输出:


- 安装开发工具和依赖:
我们需要安装Python、pip、Node.js、npm和Git。openEuler的dnf包管理器可以轻松完成这些任务 。

终端输出:

- 验证安装:

至此,我们的openEuler开发环境已准备就绪
3. 后端API服务开发 (Python + FastAPI)
后端服务是连接用户与大模型的核心。它接收来自前端的请求,处理后调用LLM API,并将结果返回。
3.1 项目结构
创建一个项目目录 medical_qa_backend。
plain
medical_qa_backend/
├── main.py # FastAPI应用主文件
└── requirements.txt # Python依赖列表
3.2 编写后端代码
requirements.txt 内容:
plain
fastapi
uvicorn[standard]
pydantic
requests
python-dotenv
main.py 内容:
plain
import os
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from dotenv import load_dotenv
# 加载环境变量 (例如API密钥)
load_dotenv()
# 初始化FastAPI应用
app = FastAPI(
title="智能医疗诊断问答系统 API",
description="一个基于openEuler部署,使用大模型提供初步医疗建议的API服务。",
version="1.0.0",
)
# 定义API请求体的数据模型
class SymptomQuery(BaseModel):
session_id: str
symptoms: str
history: list = [] # 用于传递对话历史,以实现多轮对话
# 定义API响应体的数据模型
class DiagnosisResponse(BaseModel):
diagnosis: str
suggestions: str
disclaimer: str
# 模拟的大模型API调用函数 (实际项目中应替换为真实API调用)
def get_llm_diagnosis(symptoms: str, history: list) -> dict:
"""
调用大模型API获取诊断建议。
注意:这是一个模拟函数。在生产环境中,你需要替换为对真实LLM API的HTTP请求。
"""
api_key = os.getenv("LLM_API_KEY")
api_url = os.getenv("LLM_API_URL")
# 构建对话历史
messages = [{"role": "system", "content": "你是一名专业的AI医疗助手。你的任务是根据用户描述的症状,提供可能的诊断方向和初步建议。你必须强调这些建议不能替代专业医生的诊断,并建议用户尽快就医。请以结构化的JSON格式回答,包含'diagnosis'、'suggestions'和'disclaimer'三个字段。"}]
for entry in history:
messages.append({"role": "user", "content": entry["user"]})
messages.append({"role": "assistant", "content": entry["assistant"]})
messages.append({"role": "user", "content": symptoms})
# 模拟API请求与响应
print(f"--- 模拟向LLM API发送数据 ---")
print(f"请求URL: {api_url}")
print(f"请求体 (部分): {messages[-1]}")
print("----------------------------")
# 示例对话数据与模拟输出
if "头痛" in symptoms and "发烧" in symptoms:
response_data = {
"diagnosis": "可能是病毒性感冒或流感。",
"suggestions": "建议您多休息,多喝水,并监测体温。如果症状持续或加重,请及时就医。",
"disclaimer": "本建议仅供参考,不能替代专业医疗诊断。请务必咨询医生。"
}
else:
response_data = {
"diagnosis": "信息不足,无法做出明确判断。",
"suggestions": "请提供更详细的症状描述,例如症状持续时间、严重程度等。",
"disclaimer": "本建议仅供参考,不能替代专业医疗诊断。请务必咨询医生。"
}
# 在实际应用中,这里会是类似这样的代码:
# headers = {"Authorization": f"Bearer {api_key}"}
# payload = {"model": "llama3.1-70b-instruct", "messages": messages}
# response = requests.post(api_url, json=payload, headers=headers)
# response.raise_for_status()
# response_data = response.json()['choices']['message']['content']
return response_data
@app.post("https://files.metaso.cn/api/diagnose", response_model=DiagnosisResponse)
async def diagnose_symptoms(query: SymptomQuery):
"""
接收用户症状描述,返回AI生成的诊断建议。
"""
if not query.symptoms or not query.symptoms.strip():
raise HTTPException(status_code=400, detail="症状描述不能为空")
try:
# 调用大模型服务
llm_result = get_llm_diagnosis(query.symptoms, query.history)
# 确保返回格式正确
return DiagnosisResponse(
diagnosis=llm_result.get("diagnosis", "无法生成诊断建议。"),
suggestions=llm_result.get("suggestions", "请咨询专业医生。"),
disclaimer=llm_result.get("disclaimer", "本服务仅供参考,不能替代专业医疗诊断。")
)
except Exception as e:
print(f"Error calling LLM API: {e}")
raise HTTPException(status_code=500, detail="调用大模型服务时发生内部错误")
@app.get("/")
def read_root():
return {"message": "智能医疗诊断问答系统 API - 运行在 openEuler"}
3.3 部署与测试
- 安装依赖:

- 运行服务:
使用 uvicorn 启动API服务 。0.0.0.0 表示监听所有网络接口。

终端输出:

(描述: 在openEuler终端中成功启动FastAPI后端服务,显示服务正在监听8000端口。)
- API接口测试:
打开另一个终端,使用curl命令测试https://files.metaso.cn/api/diagnose接口。

终端输出:

同时,运行uvicorn的终端会显示请求日志 。
诊断日志输出 (在FastAPI服务终端):

4. 前端用户界面开发 (Vue.js + Element Plus)
前端提供了一个用户友好的界面,用于输入症状并查看AI的回复。
4.1 项目初始化
使用Vite脚手架创建一个新的Vue项目。

进入medical-qa-ui的目录下:

4.2 编写前端代码
修改 src/App.vue 文件,实现一个简单的聊天界面。
src/App.vue 内容:
plain
<template>
<div id="app-container">
<header>
<h1>智能医疗诊断助手 (运行于 openEuler)</h1>
</header>
<main>
<div class="chat-window">
<div v-for="(message, index) in chatHistory" :key="index" :class="['message-bubble', message.sender]">
<p>{{ message.text }}</p>
</div>
<div v-if="isLoading" class="message-bubble assistant">
<p>AI助手正在思考中...</p>
</div>
</div>
<div class="input-area">
<el-input
v-model="userInput"
placeholder="请输入您的症状..."
@keyup.enter="sendMessage"
:disabled="isLoading"
size="large"
/>
<el-button type="primary" @click="sendMessage" :loading="isLoading" size="large">发送</el-button>
</div>
</main>
</div>
</template>
<script setup>
import { ref } from 'vue';
import axios from 'axios';
import { ElMessage } from 'element-plus';
const userInput = ref('');
const chatHistory = ref([
{ sender: 'assistant', text: '您好,我是您的智能医疗助手。请描述您的症状,我将为您提供初步的参考建议。请注意,我的建议不能替代专业医生的诊断。' }
]);
const isLoading = ref(false);
const sendMessage = async () => {
if (!userInput.value.trim()) return;
const userMessage = { sender: 'user', text: userInput.value };
chatHistory.value.push(userMessage);
const currentInput = userInput.value;
userInput.value = ''; // 清空输入框
isLoading.value = true;
try {
// 假设后端服务与前端在同一台机器上,IP地址为 192.168.1.10
const response = await axios.post('http://192.168.1.10:8000/api/diagnose', {
session_id: 'session-123',
symptoms: currentInput,
history: [] // 简单示例,暂不处理多轮对话历史
});
const aiResponse = response.data;
const formattedResponse = `诊断参考:${aiResponse.diagnosis}\n\n建议:${aiResponse.suggestions}\n\n免责声明:${aiResponse.disclaimer}`;
chatHistory.value.push({ sender: 'assistant', text: formattedResponse });
} catch (error) {
console.error('API请求失败:', error);
ElMessage.error('服务暂时不可用,请稍后再试。');
chatHistory.value.push({ sender: 'assistant', text: '抱歉,我暂时无法连接到服务。' });
} finally {
isLoading.value = false;
}
};
</script>
<style>
/* 样式可以根据需求自行美化 */
#app-container { max-width: 800px; margin: 20px auto; border: 1px solid #ccc; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); font-family: sans-serif; }
header { background-color: #409EFF; color: white; padding: 15px; text-align: center; border-top-left-radius: 8px; border-top-right-radius: 8px; }
main { padding: 20px; }
.chat-window { height: 400px; overflow-y: auto; border: 1px solid #eee; padding: 10px; margin-bottom: 20px; }
.message-bubble { max-width: 70%; padding: 10px; border-radius: 15px; margin-bottom: 10px; word-wrap: break-word; }
.user { background-color: #E6A23C; color: white; margin-left: auto; border-bottom-right-radius: 0; }
.assistant { background-color: #F2F6FC; color: #303133; border-bottom-left-radius: 0; }
.input-area { display: flex; gap: 10px; }
</style>
src/main.js 需要引入 Element Plus:
plain
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
4.3 运行前端应用
plain
[user@openeuler medical-qa-ui]$ npm run dev
终端输出:

现在,可以在openEuler系统的浏览器中访问 [http://localhost:5173](http://localhost:5173) 来查看和使用应用。
点击访问页面:

5. 系统运行诊断与监控
在应用运行期间,对系统资源的监控至关重要,这有助于排查性能瓶颈和确保服务稳定性 。
5.1 监控CPU和内存使用
使用 top 命令可以实时查看系统资源占用情况。
plain
[user@openeuler ~]$ top
诊断操作输出:

分析 : 从输出中可以看到 uvicorn (后端服务) 和 node (前端开发服务器) 的进程ID (PID)、CPU使用率 (%CPU) 和内存使用率 (%MEM)。这对于识别性能问题非常有帮助 。
5.2 监控网络连接
使用 ss 或 netstat 命令可以查看网络端口的监听状态,确认我们的后端服务是否正常运行在8000端口。
plain
[user@openeuler ~]$ ss -tlpn | grep 8000
诊断操作输出:
分析 : 此输出明确显示 uvicorn 进程(PID为12345)正在监听所有网络接口(0.0.0.0)的 8000 端口,表明后端服务已成功启动并等待连接。
6. 结论与展望
本研究报告成功地展示了在 openEuler 24.03 LTS 操作系统上,利用现代技术栈(Python/FastAPI 和 Vue.js)开发和部署一个大模型智能问答应用的完整流程。通过实际操作命令、代码示例和模拟输出,我们验证了 openEuler 作为一个稳定、高效且兼容性强的AI应用承载平台的可行性。
未来工作可以从以下几个方面展开:
- 模型集成深化: 替换模拟API为真实的、经过医疗领域微调的大模型API,以提高诊断建议的准确性和专业性 。
- 数据持久化: 引入数据库(如PostgreSQL)来存储用户会话历史,实现更连贯的多轮对话。
- 容器化部署: 使用Docker和Kubernetes将前后端服务容器化,实现更便捷、可扩展和高可用的部署方案 。
- 安全性增强: 为API增加认证和授权机制,确保数据传输和存储的安全性。
- 前端功能丰富: 优化UI/UX,增加用户管理、历史记录查询等功能。
openEuler 凭借其开放的生态、对多种硬件架构的支持以及企业级的稳定性,为开发和部署包括大模型应用在内的各类现代化软件提供了坚实的基础 。
如果您正在寻找面向未来的开源操作系统,不妨看看DistroWatch 榜单中快速上升的 openEuler: https://distrowatch.com/table-mobile.php?distribution=openeuler,一个由开放原子开源基金会孵化、支持"超节点"场景的Linux 发行版。
openEuler官网:https://www.openeuler.openatom.cn/zh/