上交荣昶杯昇腾AI赛道优秀作品分享——智慧伴学系统
收藏回复举报
上交荣昶杯昇腾AI赛道优秀作品分享——智慧伴学系统
新人帖
发表于2025-08-30 18:10:56
0 查看

项目背景

传统专注度监测方案以惩罚性为主,缺乏对学生生理需求的反馈。容易引发学生的抵触情绪,削弱学生自主培养专注力的内在动力,抑制自律意识的自然养成。我们提出一种更具人文关怀的创新思路:将学生日常作息中紧密关联的”学习”、 “用餐”、”睡眠”三大场景深度融合。通过香橙派运行多模态Agent动态采集多维度参数,生成专注度分析报告和个性化食谱建议。通过科学膳食调节学生的身体状态以提升学习效能,并通过餐前餐后数据分析对比,最终实现从 “被动约束” 到 “主动优化” 的学习状态升级。 true

系统功能

我们将学生日常作息中“学习”、“用餐”、“睡眠”三大主要场景深度融合。 运用香橙派,通过视频采集学生的课堂分心度数据,结合当日天气状况,学生身高、体重、睡眠情况等多维度参数,根据菜谱生成个性化食谱建议和分析报告。既能针对性展现学生课堂专注度不足的时间段,又可科学膳食调节学生身体状态,在提升学生学习效率的同时缓解当前学生普遍面临的压力问题。 true

作为智慧伴学系统,其终极目标是实现一个智能桌面可交互机器人,作为学生的小助手和帮助学生衣食住行并学习的伴随伙伴,鉴于比赛时间的限制,我们小组只挑选了系统最核心的主业务工作流程在香橙派AiPro 20T上面进行了概念性的实现。

整个系统通过摄像头捕捉人脸信息,长时间持续的记录学生状态,分析该学生的学习状态尤其是专注度变化曲线,结合学生身高、体重、BMI以及睡眠时间,外加天气情况等因素,利用人工智能大语言模型进行分析并推荐菜谱,希望通过食补的方式部分改善学生的学习状态。虽然目前仅限于推荐菜单,但是后续可以延伸到其他生活学习方面的内容,甚至后续可以畅想用于医疗康复,健身健康管理等方面。整个系统未来也可以进一步支持多人识别,利用人脸识别自动记录不同人的信息,影响整个学校整个区域的饮食计划,配合国家目前推广的瘦身减肥战略计划,提升全民身体健康素质。详细随着华为昇腾计算架构能力的不断提升,将来有一天终将有能力实现整个设想。

系统架构

true

当前整个系统已经从初赛时候CS架构转向了决赛时候的BS架构,其变化原因在于未来的设想可以利用服务器强大的中心计算资源。香橙派的算力AIPro20T可能在边缘计算方面算力还是略显不足,最佳设想是未来可以同时利用到服务器计算资源扩展性并结合利用边缘计算的便捷性,两者形成互补性优势。本次的概念性实现都是在香橙派AIPro 20T上面集中部署及演示。

系统架构基于24GB的昇腾NPU,3CPU+1(Ai内核)的arm64硬件平台,基于定制化的ubuntu香橙派操作系统;整体运行环境基于Python3.9的华为Mindspore和CANN8.0.0框架的大语言应用。经过尝试,目前Mindnlp只能支持Qwen2.5:0.5b模型,Qwen2.5:1.5b模型重启之后勉强能跑,但是容易导致内存不足。换成Ollama的Qwen2.5:0.5b和Qwen3:0.6b也可以跑,但是速度比较慢,毕竟Ollama无法利用Mindspore的NPU进行计算,纯CPU的条件下速度偏慢,哪怕是调整到4CPU ctrl的模式也是偏慢。(限于小组知识储备的限制,还请论坛里面的各位老师提出宝贵的改善意见) 大语言模型的应用利用LangChain进行了Agent调用并生成相关结果,人脸识别使用MediaPipe,整个浏览器前段框架则使用Gradio,此外,图表框架引入了Plotly以及数据库使用了JSON结构的TinyDB。

系统开发回顾小结:

  • 建立一个基于Json的TinyDB 数据库
  • 运用Mediapipe获得采集的人脸信息,处理并存储
  • 笔记本上用Ollama运行大模型,香橙派则中使用Mindspore和Mindnlp运行大模型
  • 使用LangChain框架 构建模型逻辑链,编写相应Prompt
  • 在数据库中,我们存储了菜谱信息和营养元素
  • 使用Gradio和HTML快速构建可视化网页进行视频交互,推荐食谱展示和最终各类信息图表展示
  • 本系统在香橙派上运行

挑选几个问题与解决方案分享

  1. 香橙派AIPro 20T环境下Python3.10不兼容怎么解决?

尝试升级为Python3.10下面的CANN toolkit以及Mindspore以便支持最新的Mindnlp,最终得到的结论是无法找到匹配的CANN算子,哪怕降级回Python3.9版本,还是无法从华为官方网站获取能够运行的CANN。再三证实之后,最佳解决方案只能使用香橙派官方的镜像重新烧录,官方的镜像中有能够运行的Python3.9的Mindspore版本和CANN算子。

  1. 怎样安装SSD?

购买256GB的SSD硬盘,通过香橙派官方手册的里面提供的信息256GB的支持可能兼容性比较好。香橙派翻过来,螺丝拧开之后就可以轻松安装硬盘。此外,还需要调整跳线,因为交大提供的机器,操作系统其实是烧录在TF卡上的,所以需要调整跳线,方法还是翻过来,其中有一个橡胶脚中间比较松软,可以用力拨开橡胶脚之后就可以看到主板上面的跳线。SSD是左左右。 true

  1. 兼容性问题怎么解决?

为了能够在香橙派AiPro 20T上面运行Mindspore和Mindnlp,就不能破坏原有的环境,那么对应的Langchain,Mindspore,Mindnlp,Gradio,Tokenizers以及Protobuf都需要向Python3.9进行调整,记得做好备份。

absl-py==2.1.0
aclruntime @ file:///opt/complete/download/aclruntime-0.0.2-cp39-cp39-linux_aarch64.whl
addict==2.4.0
aiofiles==23.2.1
aiohappyeyeballs==2.4.3
aiohttp==3.10.10
aiosignal==1.3.1
ais-bench @ file:///opt/complete/download/ais_bench-0.0.2-py3-none-any.whl
albumentations==1.3.1
annotated-types==0.6.0
anyio==4.2.0
appdirs==1.4.4
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==2.4.1
astunparse==1.6.3
async-lru==2.0.4
async-timeout==4.0.3
attrs==23.2.0
auto_tune @ file:///root/selfgz21698932307/compiler/lib64/auto_tune-0.1.0-py3-none-any.whl
Babel==2.14.0
backcall==0.2.0
beautifulsoup4==4.12.3
bleach==6.1.0
boltons @ file:///croot/boltons_1677628695607/work
brotlipy==0.7.0
certifi @ file:///croot/certifi_1700501676087/work/certifi
cffi @ file:///tmp/abs_2eqak_bqcf/croots/recipe/cffi_1659598644692/work
charset-normalizer @ file:///tmp/build/80754af9/charset-normalizer_1630003229654/work
click==8.1.7
cloudpickle==3.1.0
coloredlogs==15.0.1
comm==0.2.1
conda-content-trust @ file:///tmp/abs_d9e8d879-c7bd-425e-87af-59f595eb114bfmj_f2_x/croots/recipe/conda-content-trust_1658126375626/work
conda-package-handling @ file:///croot/conda-package-handling_1672865005623/work
conda_package_streaming @ file:///croot/conda-package-streaming_1670508156500/work
construct==2.10.70
contourpy==1.2.0
croniter==2.0.1
cryptography @ file:///croot/cryptography_1673298758482/work
cycler==0.12.1
dataclasses-json==0.6.7
dataflow @ file:///root/selfgz21698932307/compiler/lib64/dataflow-0.0.1-py3-none-any.whl
datasets==3.0.1
debugpy==1.8.0
decorator==5.1.1
defusedxml==0.7.1
dill==0.3.8
distro==1.9.0
download==0.3.5
evaluate==0.4.3
exceptiongroup==1.2.0
fastapi==0.115.2
fastjsonschema==2.19.1
ffmpeg-python==0.2.0
ffmpy==0.4.0
filelock==3.13.1
flatbuffers==25.2.10
fonttools==4.47.2
fqdn==1.5.1
frozenlist==1.4.1
fsspec==2023.12.2
future==0.18.3
gradio==4.44.0
gradio_client==1.3.0
greenlet==3.2.4
h11==0.14.0
hccl @ file:///root/selfgz2324398868/hccl/lib64/hccl-0.1.0-py3-none-any.whl
hccl_parser @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/hccl_parser-0.1-py3-none-any.whl
httpcore==1.0.6
httpx==0.27.2
httpx-sse==0.4.1
huggingface-hub==0.25.2
humanfriendly==10.0
hypothesis==6.115.2
idna @ file:///croot/idna_1666125574438/work
ifaddr==0.2.0
imageio==2.33.1
importlib-metadata==7.0.1
importlib-resources==6.1.1
iniconfig==2.0.0
ipykernel==6.29.0
ipython==7.34.0
ipywidgets==8.1.1
isoduration==20.11.0
jax==0.4.30
jaxlib==0.4.30
jedi==0.19.1
jieba==0.42.1
Jinja2==3.1.3
jiter==0.10.0
joblib==1.3.2
json5==0.9.14
jsonpatch==1.33
jsonpointer==2.1
jsonschema==4.21.1
jsonschema-specifications==2023.12.1
jupyter-events==0.9.0
jupyter-lsp==2.2.2
jupyter_client==8.6.0
jupyter_core==5.7.1
jupyter_server==2.12.5
jupyter_server_terminals==0.5.2
jupyterlab==4.0.11
jupyterlab-widgets==3.0.9
jupyterlab_pygments==0.3.0
jupyterlab_server==2.25.2
kiwisolver==1.4.5
langchain==0.3.27
langchain-community==0.3.27
langchain-core==0.3.74
langchain-ollama==0.3.6
langchain-text-splitters==0.3.9
langgraph==0.3.27
langgraph-checkpoint==2.1.1
langgraph-prebuilt==0.1.8
langgraph-sdk==0.1.74
langsmith==0.4.14
lazy_loader==0.3
llm_datadist @ file:///root/selfgz21698932307/compiler/lib64/llm_datadist-0.0.1-py3-none-any.whl
markdown-it-py==3.0.0
MarkupSafe==2.1.4
marshmallow==3.26.1
matplotlib==3.8.2
matplotlib-inline==0.1.6
mdurl==0.1.2
mediapipe==0.10.9
micloud==0.6
mindnlp @ git+https://gitee.com/mindspore-lab/mindnlp.git@9ea7a9971ad68a99045bfbb2022b4eb125adcfe6
mindspore @ https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.4.10/MindSpore/unified/aarch64/mindspore-2.4.10-cp39-cp39-linux_aarch64.whl
mindspore-lite @ https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.2.11/MindSpore/lite/release/linux/aarch64/cloud_fusion/python39/mindspore_lite-2.2.11-cp39-cp39-linux_aarch64.whl
mistune==3.0.2
ml_dtypes==0.5.0
mpmath==1.3.0
msobjdump @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/msobjdump-0.1.0-py3-none-any.whl
multidict==6.1.0
multiprocess==0.70.16
mypy_extensions==1.1.0
narwhals==2.0.1
nbclient==0.9.0
nbconvert==7.14.2
nbformat==5.9.2
nest-asyncio==1.6.0
networkx==3.2.1
notebook_shim==0.2.3
numpy==1.26.4
ollama==0.5.3
onnxruntime-cann==1.18.0
op_compile_tool @ file:///root/selfgz21698932307/compiler/lib64/op_compile_tool-0.1.0-py3-none-any.whl
op_gen @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/op_gen-0.1-py3-none-any.whl
op_test_frame @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/op_test_frame-0.1-py3-none-any.whl
opc_tool @ file:///root/selfgz21698932307/compiler/lib64/opc_tool-0.1.0-py3-none-any.whl
openai==1.55.0
opencv-contrib-python==4.11.0.86
opencv-python-headless==4.9.0.80
opt_einsum==3.4.0
orjson==3.10.7
ormsgpack==1.10.0
overrides==7.6.0
packaging==25.0
pandas==2.2.3
pandocfilters==1.5.1
parso==0.8.3
pathlib2==2.3.7.post1
pexpect==4.9.0
pickleshare==0.7.5
pillow==10.2.0
platformdirs==4.1.0
plotly==6.2.0
pluggy @ file:///opt/conda/conda-bld/pluggy_1648109264631/work
prometheus-client==0.19.0
prompt-toolkit==3.0.43
propcache==0.2.0
protobuf==3.20.3
psutil==5.9.8
ptyprocess==0.7.0
pyarrow==17.0.0
pycocotools==2.0.7
pycosat @ file:///croot/pycosat_1666805506522/work
pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work
pycryptodome==3.20.0
pyctcdecode==0.5.0
pydantic==2.9.2
pydantic-settings==2.10.1
pydantic_core==2.23.4
pydub==0.25.1
Pygments==2.17.2
pygtrie==2.5.0
pyOpenSSL @ file:///opt/conda/conda-bld/pyopenssl_1643788558760/work
pyparsing==3.1.1
PySocks @ file:///root/miniconda3/conda-bld/pysocks_1614704957454/work
pytest==7.2.0
python-dateutil==2.8.2
python-dotenv==1.1.1
python-json-logger==2.0.7
python-miio @ git+https://github.com/rytilahti/python-miio.git@658ee2e82e54233372f19e4f67bbf055b60eaee4
python-multipart==0.0.12
pytz==2023.3.post1
PyYAML==6.0.1
pyzmq==25.1.2
qudida==0.0.4
referencing==0.32.1
regex==2024.9.11
requests==2.32.3
requests-toolbelt==1.0.0
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rich==13.9.2
rpds-py==0.17.1
ruamel.yaml @ file:///croot/ruamel.yaml_1666307131939/work
ruamel.yaml.clib @ file:///croot/ruamel.yaml.clib_1666302244777/work
ruff==0.6.9
safetensors==0.4.5
schedule_search @ file:///root/selfgz21698932307/compiler/lib64/schedule_search-0.1.0-py3-none-any.whl
scikit-image==0.22.0
scikit-learn==1.4.0
scikit-video==1.1.11
scipy==1.12.0
semantic-version==2.10.0
Send2Trash==1.8.2
sentencepiece==0.2.0
shellingham==1.5.4
show_kernel_debug_data @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/show_kernel_debug_data-0.1.0-py3-none-any.whl
six @ file:///tmp/build/80754af9/six_1644875935023/work
sniffio==1.3.0
sortedcontainers==2.4.0
sounddevice==0.5.2
soupsieve==2.5
SQLAlchemy==2.0.43
starlette==0.40.0
sympy==1.12
te @ file:///root/selfgz21698932307/compiler/lib64/te-0.4.0-py3-none-any.whl
tenacity==9.1.2
terminado==0.18.0
threadpoolctl==3.2.0
tifffile==2023.12.9
tinycss2==1.2.1
tinydb==4.8.2
tokenizers==0.19.1
tomli==2.0.1
tomlkit==0.12.0
toolz @ file:///croot/toolz_1667464081129/work
torch==2.1.0
torch-npu @ file:///root/torch_npu-2.1.0.post2%2Bgit64bdab5-cp39-cp39-linux_aarch64.whl
torchaudio==2.1.0
torchvision==0.16.0
tornado==6.4
tqdm==4.66.5
traitlets==5.14.1
typer==0.12.5
types-python-dateutil==2.8.19.20240106
typing-inspect==0.9.0
typing-inspection==0.4.1
typing_extensions==4.14.1
tzdata==2024.2
tzlocal==5.2
uri-template==1.3.0
urllib3==2.2.3
uvicorn==0.32.0
wcwidth==0.2.13
webcolors==1.13
webencodings==0.5.1
websocket-client==1.7.0
websockets==12.0
widgetsnbextension==4.0.9
xxhash==3.5.0
yarl==1.15.3
zeroconf==0.131.0
zipp==3.17.0
zstandard==0.23.0
  1. 怎样使用Gradio通过浏览器采集信息?

Gradio整合Mediapipe使用webcam通过浏览器采集人脸信息,远程访问需要Gradio开启HTTPS才行,本地单机开启通过127.0.0.1或者localhost则只需要HTTP即可。经过尝试采集速度目前是2s效果较好,毕竟考虑到是在OrangePi AiPro 20T运行CPU进行的计算的

  1. OrangePi AiPro 20T选择什么样的大模型运行较好?

经过尝试,Ollama arm版可以在香橙派AiPro 20T上面运行,但是运行速度不是很快。使用Mindspore框架,Qwen2.5:0.5b和Qwen2.5:1.5b都可以运行,包括deepseek-r1 1.5B也是可以运行的,考虑到执行效率项目最终选择了Qwen2.5:0.5b

  1. 最大的挑战是提示词

驱动LLM运行的Prompt还需要进一步改进,分享目前截止比赛结束日之前的最佳调整,请各位老师指正

prefix = f"""你是一个营养专家,为了改善这个学生的上课表现,你需要根据以下信息提供食谱建议:
    1. 学生个人信息(身高、体重、睡眠时长)
    2. 上海天气情况
    3. 学生的专注度得分(分心情况0%-100%)
    4. 要来自dish_names.json中的菜谱名称

    推荐规则:
    - 必须选择dish_names.json中存在的菜品
    - 每次推荐3道不同菜品
    - 推荐理由需包含:
        • 天气关联建议
        • 健康指标改善方案
        • 营养需求匹配说明
    食谱中的菜一定要根据dish_names.json中的菜名,不能使用其他菜名,应当有3道菜,并给出3点理由,说明为什么这些菜适合该学生。

    安全策略:
    - 拒绝生成违反伦理的内容
    - 只使用提供的工具获取信息
    - 确保推荐的食谱适合学生的健康状况

    输出格式要求:
    1. 首先要根据使用StudyDataQ工具返回的结果,该结果是一个菜谱的数组,其中每个元素包含
        - name 是菜名
        - calories 是卡路里
        - suitable_for 是该菜适合改善内容
        - description 是菜谱描述
        - nutrients 是营养成分
    2. 根据上一步的结果,推荐其中的3道菜(名称和简短描述).
    3. 然后给出3点理由,每点理由都要具体说明与上述因素的关联.
    4. 最后回答格式要求参考:"{sample_result}"

    """
    
    suffix = """记住:
    - 食谱中的菜一定要使用SelectDishes工具返回的结果中的菜名,不能使用其他菜名,该结果是一个菜谱的数组,其中每个元素包含name 是菜名
    - 如果用户要求获取天气,必须使用WeatherQuery工具,得到用户给定城市的天气情况,作为菜谱的参考
    - 如果用户要求获取学生的专注度,必须使用StudyDataQ工具,得到用户上课的分心程度的百分比,作为菜谱的参考
    - 如果用户要求获取学生的个人信息,必须使用PersonalInfo工具,得到用户的个人信息(包括身高、体重、睡眠时长),作为最终菜谱的参考
    - 如果用户要求获取菜谱,必须使用SelectDishes工具,选择菜品名称并输出
    {chat_history}
    问题: {input}
    {agent_scratchpad}
    
    同时,你必须严格按照下面格式回答,不得省略任何一行:
    Thought: 你的推理
    Action: 工具名
    Action Input: 输入
    """

MileStone

true

本帖最后由 匿名用户2025/08/31 21:47:52 编辑

我要发帖子