当前位置: 首页 > news >正文

ubuntu24.0离线安装Ollama和纯cpu版本以及对接Spring AI

文章目录

    • 一.官网下载 0.3.13版本
    • 二.将文件包上传至ubuntu服务器
    • 三.下载安装脚本
    • 四.剔除GPU相关下载ROCM等,纯CPU运行脚本
    • 五.ollama常用命令
    • 六. 远程测试
  • 七.对接spring AI


一.官网下载 0.3.13版本

ollama离线安装包下载地址
在这里插入图片描述


二.将文件包上传至ubuntu服务器

在这里插入图片描述


三.下载安装脚本

curl -fsSL https://ollama.com/install.sh

修改远程拉取ollama代码为本地解压
源需要修改的脚本代码如下

if curl -I --silent --fail --location "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" >/dev/null ; thenstatus "Downloading Linux ${ARCH} bundle"curl --fail --show-error --location --progress-bar \"https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \$SUDO tar -xzf - -C "$OLLAMA_INSTALL_DIR"BUNDLE=1if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; thenstatus "Making ollama accessible in the PATH in $BINDIR"$SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"fi
elsestatus "Downloading Linux ${ARCH} CLI"curl --fail --show-error --location --progress-bar -o "$TEMP_DIR/ollama"\"https://ollama.com/download/ollama-linux-${ARCH}${VER_PARAM}"$SUDO install -o0 -g0 -m755 $TEMP_DIR/ollama $OLLAMA_INSTALL_DIR/ollamaBUNDLE=0if [ "$OLLAMA_INSTALL_DIR/ollama" != "$BINDIR/ollama" ] ; thenstatus "Making ollama accessible in the PATH in $BINDIR"$SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"fi
fi

新改后代码

status "Downloading Linux ${ARCH} bundle"
#    curl --fail --show-error --location --progress-bar \
#        "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
$SUDO tar -xzf ./ollama-linux-amd64.tgz -C "$OLLAMA_INSTALL_DIR"
BUNDLE=1
if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; thenstatus "Making ollama accessible in the PATH in $BINDIR"$SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
fi

四.剔除GPU相关下载ROCM等,纯CPU运行脚本

在题目3的基础上,又剔除了GPU部分,即从wls2注释将下面全部删除

完整版 离线基于CPU的运行脚本

#!/bin/sh
# This script installs Ollama on Linux.
# It detects the current operating system architecture and installs the appropriate version of Ollama.set -eustatus() { echo ">>> $*" >&2; }
error() { echo "ERROR $*"; exit 1; }
warning() { echo "WARNING: $*"; }TEMP_DIR=$(mktemp -d)
cleanup() { rm -rf $TEMP_DIR; }
trap cleanup EXITavailable() { command -v $1 >/dev/null; }
require() {local MISSING=''for TOOL in $*; doif ! available $TOOL; thenMISSING="$MISSING $TOOL"fidoneecho $MISSING
}[ "$(uname -s)" = "Linux" ] || error 'This script is intended to run on Linux only.'ARCH=$(uname -m)
case "$ARCH" inx86_64) ARCH="amd64" ;;aarch64|arm64) ARCH="arm64" ;;*) error "Unsupported architecture: $ARCH" ;;
esacIS_WSL2=falseKERN=$(uname -r)
case "$KERN" in*icrosoft*WSL2 | *icrosoft*wsl2) IS_WSL2=true;;*icrosoft) error "Microsoft WSL1 is not currently supported. Please use WSL2 with 'wsl --set-version <distro> 2'" ;;*) ;;
esacVER_PARAM="${OLLAMA_VERSION:+?version=$OLLAMA_VERSION}"SUDO=
if [ "$(id -u)" -ne 0 ]; then# Running as root, no need for sudoif ! available sudo; thenerror "This script requires superuser permissions. Please re-run as root."fiSUDO="sudo"
fiNEEDS=$(require curl awk grep sed tee xargs)
if [ -n "$NEEDS" ]; thenstatus "ERROR: The following tools are required but missing:"for NEED in $NEEDS; doecho "  - $NEED"doneexit 1
fifor BINDIR in /usr/local/bin /usr/bin /bin; doecho $PATH | grep -q $BINDIR && break || continue
done
OLLAMA_INSTALL_DIR=$(dirname ${BINDIR})status "Installing ollama to $OLLAMA_INSTALL_DIR"
$SUDO install -o0 -g0 -m755 -d $BINDIR
$SUDO install -o0 -g0 -m755 -d "$OLLAMA_INSTALL_DIR"
status "Downloading Linux ${ARCH} bundle"
#    curl --fail --show-error --location --progress-bar \
#        "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
$SUDO tar -xzf ./ollama-linux-amd64.tgz -C "$OLLAMA_INSTALL_DIR"
BUNDLE=1
if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; thenstatus "Making ollama accessible in the PATH in $BINDIR"$SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
fiinstall_success() {status 'The Ollama API is now available at 127.0.0.1:11434.'status 'Install complete. Run "ollama" from the command line.'
}
trap install_success EXIT# Everything from this point onwards is optional.configure_systemd() {if ! id ollama >/dev/null 2>&1; thenstatus "Creating ollama user..."$SUDO useradd -r -s /bin/false -U -m -d /usr/share/ollama ollamafiif getent group render >/dev/null 2>&1; thenstatus "Adding ollama user to render group..."$SUDO usermod -a -G render ollamafiif getent group video >/dev/null 2>&1; thenstatus "Adding ollama user to video group..."$SUDO usermod -a -G video ollamafistatus "Adding current user to ollama group..."$SUDO usermod -a -G ollama $(whoami)status "Creating ollama systemd service..."cat <<EOF | $SUDO tee /etc/systemd/system/ollama.service >/dev/null
[Unit]
Description=Ollama Service
After=network-online.target[Service]
ExecStart=$BINDIR/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"[Install]
WantedBy=default.target
EOFSYSTEMCTL_RUNNING="$(systemctl is-system-running || true)"case $SYSTEMCTL_RUNNING inrunning|degraded)status "Enabling and starting ollama service..."$SUDO systemctl daemon-reload$SUDO systemctl enable ollamastart_service() { $SUDO systemctl restart ollama; }trap start_service EXIT;;esac
}if available systemctl; thenconfigure_systemd
fiinstall_success

在这里插入图片描述

五.ollama常用命令

# 关闭ollama服务
service ollama stopollama serve # 启动ollama
ollama create # 从模型文件创建模型
ollama show  # 显示模型信息
ollama run qwen2.5:3b-instruct-q4_K_M  # 运行模型,会先自动下载模型
ollama pull  # 从注册仓库中拉取模型
ollama push  # 将模型推送到注册仓库
ollama list  # 列出已下载模型
ollama ps  # 列出正在运行的模型
ollama cp  # 复制模型
ollama rm  # 删除模型

六. 远程测试

建议生产不开启,因为没有token等限制,必须注意接口调用安全
1.首先停止ollama服务:

systemctl stop ollama

2.修改ollama的service文件:

vim /etc/systemd/system/ollama.service

3.新增Environment="OLLAMA_HOST=0.0.0.0:11434"

[Unit]
Description=Ollama Service
After=network-online.target[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"[Install]
WantedBy=default.target
  1. 启动ollama
systemctl daemon-reload
systemctl start ollama
# 若启动失败可以使用 ollama serve测试

七.对接spring AI

    <dependencyManagement><dependencies><!--spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>runtime</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-ollama-spring-boot-starter --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency></dependencies><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories>

若以上代码无法拉取,可能被setting.xml全局拦截到镜像站。 以上spring ai还未发布到maven中央仓库请参考maven多仓库私库模板配置

spring:application:name: spring-ai-ollamaai:ollama:base-url: http://192.168.200.94:11434chat:# 为了使模型输入内容拥有更多的多样性或随机性,应当增加temperature。#在 temperature 非零的情况下,从 0.95 左右的 top-p(或 250 左右的 top-k )开始,根据需要降低 temperature。# 如果有太多无意义的内容、垃圾内容或产生幻觉,应当降低 temperature 和 降低top-p/top-k。# 如果 temperature 很高而模型输出内容的多样性却很低,应当增加top-p/top-k。# 为了获得更多样化的主题,应当增加存在惩罚值。# 为了获得更多样化且更少重复内容的模型输出,应当增加频率惩罚。options:# 配置文件指定时,现在程序中指定的模型,程序没有指定模型在对应查找配置中的模型#          model: qwen:0.5b-chatmodel: qwen2.5:3b-instruct-q4_K_M# 支持的最大字符数max_tokens: 2048# 温度值越高,准确率下降,温度值越低,准确率上升# 对于每个提示语只需要单个答案:零。#对于每个提示语需要多个答案:非零。temperature: 0.4# 随机采样 值越大,随机性越高# 在 temperature 为零的情况下:输出不受影响。# 在 temperature 不为零的情况下:非零。top_p: 0.2# 贪心解码 值越大,随机性越高top-k: 40# 频率惩罚 让token每次在文本中出现都受到惩罚。这可以阻止重复使用相同的token/单词/短语,同时也会使模型讨论的主题更加多样化,更频繁地更换主题# 当问题仅存在一个正确答案时:零。# 当问题存在多个正确答案时:可自由选择。frequency-penalty: 0# 存在惩罚 如果一个token已经在文本中出现过,就会受到惩罚 使其讨论的主题更加多样化,话题变化更加频繁,而不会明显抑制常用词的重复presence-penalty: 0
@RestController
public class QianWenController {@Resourceprivate OllamaChatModel ollamaChatModel;@RequestMapping(value = "/ai/ollama")public Object ollama(@RequestParam(value = "msg") String msg) {String called = ollamaChatModel.call(msg);System.out.println(called);return called;}@RequestMapping(value = "/ai/ollama2")public Map<String, Object> ollama2(@RequestParam(value = "msg") String msg) {Map<String, Object> map = new HashMap<String, Object>();long start = System.currentTimeMillis();ChatResponse chatResponse = ollamaChatModel.call(new Prompt(msg, OllamaOptions.create().withModel("qwen2.5:3b-instruct-q4_K_M")//使用哪个大模型.withTemperature(0.4D)));//温度,温度值越高,准确率下降,温度值越低,准确率上升String content = chatResponse.getResult().getOutput().getContent();long end = System.currentTimeMillis();map.put("content", content);map.put("time", (end - start) / 1000);return map;}@RequestMapping(value = "/ai/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String>  stream(@RequestParam(value = "msg") String msg) {return ollamaChatModel.stream(new Prompt(msg)).flatMapSequential(chunk -> Flux.just(chunk.getResult().getOutput().getContent()));}
}

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

相关文章:

ubuntu24.0离线安装Ollama和纯cpu版本以及对接Spring AI

文章目录 一.官网下载 0.3.13版本二.将文件包上传至ubuntu服务器三.下载安装脚本四.剔除GPU相关下载ROCM等&#xff0c;纯CPU运行脚本五.ollama常用命令六. 远程测试 七.对接spring AI 一.官网下载 0.3.13版本 ollama离线安装包下载地址 二.将文件包上传至ubuntu服务器 三.下…...

机器学习核心:监督学习与无监督学习

个人主页&#xff1a;chian-ocean 文章专栏 监督学习与无监督学习&#xff1a;深度解析 机器学习是现代人工智能的核心支柱&#xff0c;已广泛应用于从数据挖掘到计算机视觉再到自然语言处理的诸多领域。作为机器学习最主要的两大类型&#xff0c;监督学习&#xff08;Super…...

服务器托管的优缺点有哪些?

由于数字化程度不断提高&#xff0c;服务器在日常业务中发挥着越来越重要的作用。在大多数情况下&#xff0c;服务器由公司自己维护和管理。但对于一些公司来说&#xff0c;托管服务器(将这些任务交给专业人员)是更好的选择。 关于服务器的优缺点&#xff0c;有一点是明确的&am…...

RestClient查询文档排序、分页和高亮

目录 排序、分页 高亮 高亮请求构建 高亮结果解析 排序、分页 搜索结果的排序和分页是与query同级的参数&#xff0c;因此同样是使用request.source()来设置。 对应的API如下&#xff1a; 完整代码示例&#xff1a; Test void testPageAndSort() throws IOException {// …...

API项目5:申请签名 在线调用接口

开发申请签名 现在用户已经能看到这个接口了&#xff0c;也能看到这个接口文档&#xff0c;接下来就要在线调用 现在我们可以给每个新注册的用户自动分配一个签名和密钥&#xff0c;去修改一下注册流程&#xff1a; backend 项目&#xff0c;找到 UserServiceImpl.java 中的…...

Google FabricDiffusion:开启3D虚拟试穿新篇章

随着数字化转型的步伐不断加快,时尚界也在探索如何利用最新技术为消费者带来更加沉浸式的购物体验。在这一背景下,Google 推出了一项名为 FabricDiffusion 的新技术,这项技术能够将2D服装图像中的高质量织物纹理转移到任意形状的3D服装模型上,从而为3D虚拟试穿提供了更为真…...

【开发语言】c++的发展前景

C作为一种历史悠久且功能强大的编程语言&#xff0c;在软件开发领域一直保持着其独特的地位和广泛的应用前景。尽管近年来出现了许多新的编程语言和技术趋势&#xff0c;但C由于其高性能、低层访问能力以及广泛的生态系统&#xff0c;在多个领域依然具有不可替代的优势。以下是…...

【机器学习】图像识别——计算机视觉在工业自动化中的应用

1. 引言 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的快速发展&#xff0c;计算机视觉已成为工业自动化中的核心技术之一。图像识别&#xff0c;作为计算机视觉领域的重要分支&#xff0c;能够通过分析和理解图像或视频数据来识别、分类或检…...

lstm基础知识

lstm前言 LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题&#xff0c;是一种特殊的RNN。长时间记住信息实际上是 LSTM 的默认行为&#xff0c;而不是需要努力学习的东西&#xff01; 在标准的RNN中&#xff0c;这个重复模块具有非常简单的结构&#xff0c;例…...

Linux :at crontab简述

at命令 在指定的日期、时间点自动执行预先设置的一些命令操作&#xff0c;属于一次性计划任务系统服务的名称&#xff1a;/etc/init.d/atd存放一次性计划任务的文件&#xff1a;/var/spool/at/^a 依靠 /etc/at.allow&#xff08;白名单&#xff09;和 /etc/at.deny&#xff08…...

Python,Swift,Haskell三种语言在使用正则表达式上的方法对比

这里插入图片描述](https://i-blog.csdnimg.cn/direct/fea1494d0d0c4c9880881493929a8b91.png)在讨论 Python、Swift 和 Haskell 在正则表达式处理字符串方面的优缺点时&#xff0c;可以从它们对正则表达式的支持、灵活性和性能进行比较。以下通过具体的正则表达式字符串匹配例…...

leetcode力扣刷题系列——【三角形的最大高度】

题目 给你两个整数 red 和 blue&#xff0c;分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形&#xff0c;满足第 1 行有 1 个球&#xff0c;第 2 行有 2 个球&#xff0c;第 3 行有 3 个球&#xff0c;依此类推。 每一行的球必须是 相同 颜色&#xff0c;且相…...

工业相机解决方案

工业相机是一种特殊类型的相机&#xff0c;适用于恶劣条件&#xff08;如高温、高压和振动&#xff09;下的工作&#xff0c;在控制生产周期、跟踪输送机上的单元、检测超小零件等方面发挥着重要作用。针对工业相机的解决方案&#xff0c;朗观视觉小编认为&#xff0c;可以从以…...

设计一个高效的日志分析系统:自动检测错误日志的实用指南

设计一个高效的日志分析系统:自动检测错误日志的实用指南 在现代软件开发和运维中,日志分析是确保系统稳定性和性能的重要环节。通过对日志的分析,开发者和运维人员可以快速定位问题、优化性能并提高用户体验。本文将介绍如何设计一个日志分析系统,重点关注错误日志的自动…...

英语学习--如果你的父母不听你的话

所有的 Eng中文Eng中文children小孩儿们opposite…在…对面maths数学to take带走&#xff1b;接受&#xff1b;乘坐a way方法&#xff0c;道brave勇敢的few很少more很多more更多able能够when什么时候&#xff1b;…的时候to own拥有a child孩子later一会儿to feel感觉to find找…...

LeetCode:3258.统计满足k约束的子串数量 I(滑动窗口 Java)

目录 3258.统计满足k约束的子串数量 I 题目描述&#xff1a; 实现代码与解析&#xff1a; 滑动窗口 原理思路&#xff1a; 3258.统计满足k约束的子串数量 I 题目描述&#xff1a; 给你一个 二进制 字符串 s 和一个整数 k。 如果一个 二进制字符串 满足以下任一条件&#…...

如果用Java设计MySQL中表级锁、行级锁和间歇锁会是怎么的?

在 MySQL 中&#xff0c;锁机制是确保数据一致性和并发控制的重要手段。MySQL 支持多种锁类型&#xff0c;包括表级锁、行级锁等&#xff0c;每种锁的适用场景、影响范围和实现机制各不相同。我们将逐一介绍它们&#xff0c;并通过模拟代码展示不同锁的实现。 1. 锁类型及其影…...

GIT batch的支持中文的方法和系统建议

GIT batch是window下原生的GIT命令行终端&#xff0c;兼顾了GIT的命令特性&#xff0c;同时也支持很多UNIX的原生的bash交互方法。但是由于编码问题&#xff0c;在使用GIT bach的时候&#xff0c;用户可能会遇到中文支持的问题。这里简单介绍一下GIT batch在Windows系统下如何有…...

骑砍霸主MOD天芒传奇Ⅱ·前传-序章

基于少年包青天第一到三部的闯关夺宝MOD,故事发生在北宋仁宗年间,玩家需要代替包拯寻找天芒,最终完成统一大业.开局可尝试使用暴雨梨花针神器. MOD下载地址: 【免费】PLReminiscence资源-CSDN文库https://download.csdn.net/download/qq_35829452/89851155效果演示: 骑砍2霸…...

神经网络量化基础

1&#xff0c;模型量化概述 1.1&#xff0c;模型量化优点1.2&#xff0c;模型量化的方案 1.2.1&#xff0c;PTQ 理解 1.3&#xff0c;量化的分类 1.3.1&#xff0c;线性量化概述 2&#xff0c;量化算术 2.1&#xff0c;定点和浮点2.2&#xff0c;量化浮点2.2&#xff0c;量化算…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...