← 返回文章列表

Linux操作,Ollama部署及AI应用开发

给虚拟机的Linux安装SSH服务(用于远程连接) 连接成功 Linux的目录结构 基础命令 命令基础格式 ls命令 参数的作用 …

给虚拟机的Linux安装SSH服务(用于远程连接)

  1. 打开终端,在虚拟机Linux桌面右键后点击 open in terminal
  2. 输入命令: sudo apt install openssh-server
  3. 执行命令 ip addr 查看IP地址
  4. 使用MobaXterm连接Linux

连接成功

Linux的目录结构

基础命令

命令基础格式

image-20250724181242949

  • command 命令本体,必写
  • options可选选项,控制命令的细节
  • parameter,可选参数,控制命令的指向目标

ls命令

ls [-a -l -h] [参数]

参数的作用

决定ls命令要查看的目标

ls / 查看根目录内容

ls /usr 查看/usr目录内容

-a选项

查看全部文件,包括隐藏文件,都显示

在Linux中以.开头的文件是隐藏文件和隐藏文件夹

-l选项

以列表形式查看内容

不用-l 以平铺形式查看

-h选项

以更容易理解的方式显示文件大小(以K M G为单位)

HOME目录

在Linux系统中每一个用户都有的专属文件夹,有全部操作权限

默认路径是:/home/用户名

比如用户名:caoyu则路径是:/home/caoyu

当前工作目录

终端软件当前所在的目录,可以通过pwd 命令查看

隐藏文件

.开头的文件和文件夹是默认隐藏的需要用ls -a 的模式查看

cd命令

更改工作目录

语法:

cd 路径
  • 绝对、相对路径都可以

pwd命令

查看当前的工作目录

语法:

pwd

没有选项、没有参数

相对、绝对路径

  • 相对:以当前所在文件夹为路径起点
  • 绝对:以根目录所在文件夹为路径起点

路径符号

  • . ,当前目录
  • .. ,上一目录
  • ~ ,用户的家目录
  • - ,上一的目录

mkdir命令

语法:

mkdir [-p] 路径

功能:创建指定文件夹

  • -p 连续创建多层级的文件夹,如mkdir -p 111/222/333

touch

功能:创建空文件

语法:

touch 文件路径

cat

功能:查看文件内容

语法:

cat 文件路径

more

功能:查看文件内容

语法:

more 文件路径
  • 可以翻页查看,按空格翻页,按q 退出查看

cp

功能:复制文件和文件夹

语法:

cp -r 参数1 参数2
  • -r 选项用于文件夹复制
  • 参数1 被复制的
  • 参数2 要复制去的地方

mv

功能:移动文件和文件夹(Windows中的剪切)

语法:

mv 参数1 参数2
  • 参数1 被移动的
  • 参数2 要移动去的地方 如果不存在则改名
  • 不需要-r 选项

rm

功能:删除文件和文件夹

语法:

rm [-r -f] 参数1 参数2 ... 参数N
  • 参数,被删除的文件或文件夹
  • -r 删除文件夹用
  • -f 强制删除(不提示,直接删除)

可以写rm -rf *.txt * 表示通配符,表示 删除全部以.txt结尾的

注意,不要以root用户执行:rm -rf /*

which

功能:查看在Linux系统中所有可执行的命令的文件本地所在。

在Linux系统中执行的命令,本身是一个程序,即一个程序文件。

语法

which 命令

find

功能:查找符合条件的文件所在

按文件名

语法:

find 起始路径 -name "被查找的文件名"

起始路径如果是/ 表示全盘搜索。

这样需要管理权限,即root权限。

可以通过执行:

  • sudo su - 切换到root管理员用户去执行,
  • sudo find ... 在find命令前加入sudo临时获得管理员权限

被查找的文件名,支持通配符,如:

  • find / -name "test*" 是在全盘搜索,以test开头的文件
  • find / -name "*test" 搜索以test 结尾的文件
  • find / -name "*test*" 搜索包含test 的文件

即,* == 任何 的结果都是True

按文件大小

语法:

find 起始路径 -size +|-n(k|M|G)
  • + 表示大于,- 表示小于
  • n表示数字
  • k M G 表示大小单位,k KB M MB G GB

示例

  • +10k 大于10KB
  • -10M 小于10MB
  • +1G 大于1G

grep

功能:在指定的内容(输入)中过滤包含关键字的行(仅保留包含关键字的行)

语法:grep [-n] "关键字" 输入内容

  • -n 显示过滤后的内容,在原始输入内容中的行号

示例:

  • grep hello a.txt 在a.txt文件中,过滤hello关键字(仅保留包含hello关键字的行)
  • grep -n hello a.txt 在a.txt文件中,过滤hello关键字(仅保留包含hello关键字的行),并显示行号

一般搭配管道符使用,如:ls /usr/bin | grep gst 查看/usr/bin下,带有gst关键字的内容

wc

功能:用来统计输入中的如:字节数量、字符数量、单词数量、行数量

语法:

wc [-c -m -l -w] 输入内容
  • -c 统计字节
  • m 统计字符
  • -l 统计行
  • -w 统计单词数

如果不提供选项,则wc本身统计:字节、单词、行数

一般搭配管道符使用

管道符

功能:将管道符的左侧的结果,作为管道符右侧程序的输入。管道符本身是:|

示例

  • ls -l /usr/bin | wc -lls -l /usr/bin的结果作为wc命令的输入,含义就是:
    • 统计/usr/bin文件夹下的内容数量

管道符可以写多个,如下:

  • ls -l /usr/bin | grep gst | wc -l
    • ls -l /usr/bin的结果作为grep gst 的输入
    • ls -l /usr/bin | grep gst的结果作为wc -l的输入
    • 含义:统计/usr/bin 下带有gst关键字的内容的数量

echo

功能:和Python的print一样,将内容输出到屏幕中。

语法:

echo 内容

反引号 `

在Linux中,被`包围的内容,将作为命令去执行。

如:

tail

功能:查看文件尾部或跟踪文件更改

语法:

tail [-f | -num] 文件路径
  • -f 表示持续跟踪文件更改,如需退出按ctrl + c退出
  • -num 表示查看文件尾部多少行,默认是-10

功能:查看文件头部内容

语法:

head [-num] 文件路径
  • -num 表示查看头部多少行,默认是-10

重定向符号

含义:将输出的内容重新定向到文件中记录 Linux中有2个:

  • > 将符号左侧内容的结果,重新定向即覆盖写入右侧的文件中
  • >> 将符号左侧内容的结果,重新定向即追加写入右侧的文件中

如果右侧提供的文件不存在,则新建

vi/vim编辑器

image-20250726120123230

VI编辑器是命令行下面的类似文本编辑器的程序,可以在命令行下完成文件的编辑。

有3个工作模式:

  1. 命令模式,可以输入各类快捷指令,如删除行、跳转光标等等
  2. 输入模式,可以正常输入你想要的内容,即开始编辑文件
  3. 底线命令模式,可以完成对整个文件的控制,如保持、退出等

语法:

vi 文件

即可进入vi编辑器界面

命令模式

当进入vi编辑器,就是命令模式,此模式下可以通过快捷键完成对文件内容的控制,如下:

image-20250726120344057

输入模式

输入模式可以在这个模式下正常编写内容

如果要进入输入模式,必须在命令模式下,通过快捷键进入:

  1. i 在当前光标位置,开始编辑
  2. o 在光标下一行开启新行进行编辑
  3. O 在光标上一行开启新行进行编辑
  4. a在光标右侧开始编辑
  5. A 在光标所在行的尾部开始编辑

一般就用:i 立刻编辑 或 o 下一行开始编辑

输入模式要回退到命令模式,按esc 即可

底线命令模式

可以对整个文件做控制。

进入方式为:在命令模式下,输入: 进入底线命令模式。

常见的控制指令有:

  • w 保存更改
  • q 退出vi程序
  • ! 强制(强制退出、强制保存)
  • set nu 显示文件行号

组合使用:

  • wq 保存并退出
  • q! 忽略更改强制退出
  • wq! 强制保存并退出

apt

Linux系统的应用商店,在命令行模式下是:apt 命令

通过这个命令可以联网安装软件

语法:

apt install | remove  程序名 [-y]

必须联网

  • install 安装程序
  • remove 删除程序
  • -y 可选,表示不要提示直接执行

此命令需要root权限,普通用户无权执行。

解决方式:

  1. 通过sudo su - 切换到root用户执行
  2. 通过sudo apt install xxx 以root权限执行这个命令
    1. sudo 表示不切换用户,但是此命令以root身份执行

更换apt的网址为国内网站

专业说法:更换APT程序的源

国内有很多公司提供了镜像网站,使用和官方的完全一致,但是网络条件好非常多,常见有:阿里云源、163源、清华源等

步骤:

  1. 打开清华源官网:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu

  2. 选择Ubuntu版本,我们是20.04 ,复制下图红框中的文本内容

  3. image-20250726150202034
  4. 备份原有文件,命令是:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

  5. 编辑文件:sudo vim /etc/apt/sources.list 将原有内容清空,粘贴刚刚在网站复制的文本,保存

  6. 执行sudo apt update 即可

  7. 后续的apt 命令将从清华大学网站下载内容

后台运行程序

命令:

nohup 你要执行的命令 >> 日志记录文件 2>&1 &

比如启动ollama命令:ollama serve 这个会前台运行(终端关闭或ctrl + c关闭后,程序会停止)

我们需要转入后台运行:

nohup ollama serve >> ollama.log 2>&1 &
  • nohup 表示进入后台执行,linux自带程序
  • >> 将程序运行的日志记录到文件内
  • 2>&1 & 将标准输出和标准错误都记录到日志文件内并后台执行

WSL 安装

首先先在Windows系统中完成了WSL 功能的开启

image-20250726154700832

如果这个功能无法开启,请尝试更新Windows系统到最新

通过应用商店图形化安装即可,注意如果网络条件不好,可以用热点,大概消耗500MB流量。

image-20250726160114403

打开提示这个,需要开启虚拟机平台特性

需要确认:

首次打开需要等待一会,如下图

image-20250726160838753

之后可以设置用户名

image-20250726160903956

image-20250726160959857

自行设置密码,完成后即可使用。

image-20250726161015213

如图一切完事。

通过命令提示符安装WSL Ubuntu发行版

  1. 打开命令提示符程序,执行wsl --update 即更新到最新版
  2. 执行命令查看有那些Linux可以装:wsl --list --online
  3. 执行命令安装:wsl --install Ubuntu-20.04

AI大模型开发-聊天机器人重点笔记

Ollama 的部署

Ollama介绍

Ollama是一个开源软件,主要作用就是:部署大语言模型。

我们课上主要运行的模型就是:deepseek-r1:1.5b

Windows系统

找到资料中提供的:Ollama-setup.exe 双击打开后,点击Install 即可。

image-20250726180025521

安装好后找到Ollama 软件运行,正常会在右下角出现图表,点击图表选择Settings

image-20250726180103518

更改模型的安装目录即可。

MacOS系统

Linux系统

只需要在命令行下执行一条命令,如下:

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

即可自动化完成安装。

开启系统代理

使用自己的:

export http_proxy="http://ip地址:端口"
export https_proxy="https://ip地址:端口"

使用老师的:

export http_proxy="http://192.168.40.85:7890"
export https_proxy="https://192.168.40.85:7890"

手动安装Ollama

  1. 下载安装包:ollama-linux-amd64.tgz 已经在课堂同步的资料文件夹中有
  2. 打开WSL Ubuntu,通过cd /mnt 找到你的Windows系统中存放这个安装包的地方
  3. 找到安装包后执行:cp ollama-linux-amd64.tgz ~ 将这个安装包从Windows系统复制到Linux系统的用户家目录
  4. 回到家目录:cd ~
  5. 解压Ollama:sudo tar -xvf ollama-linux-amd64.tgz -C /usr (注意-C是大写的C)
  6. 执行:ollama serve 启动
    1. 或后台启动:nohup ollama serve >> ollama.log 2>&1 &

后续就可以正常用了。

运行模型

无论什么操作系统,都可以在终端中运行:

ollama run deepseek-r1:1.5b

即可运行1.5b参数的deepseek-r1蒸馏模型。

首次运行需要联网下载,大概1.1GB空间。

蒸馏模型

我们运行的模式都是蒸馏模型,即非完整模型。

蒸馏:按照需求进行模型提纯(保留核心网络并进行简化)

我们选择的1.5b参数就是蒸馏后的(提纯和简化),为了方便低性能设备的运行。

完整的DeepSeek模型,简单来说显卡不花个20W基本没啥体验。

模型运行是基于GPU(显卡),因为GPU特点:核多(并行计算能力超强)

  • CPU:核心少,比如i7-13650HX 仅仅有20个核心,这些核心每一个都超强,CPU适合通用计算
  • GPU(显卡):核心超多,动辄上千的流处理器(核心),每个核心都垃圾(对比CPU),GPU适合做并行计算

因为模型的神经网络计算,一般来说是量大,而非计算难度高。

量大的计算,用显卡超爽(核多)

Ollama客户端命令

当安装好Ollama后就可以在命令行中运行ollama命令。

查看帮助

ollama --help

可以给出命令执行的帮助信息

image-20250728095604660

启动Ollama

前台启动

ollama serve

后台启动(推荐)

nohup ollama serve >> ollama.log 2>&1 &

其它控制命令

运行模型:

ollama run 模型名称

ollama run deepseek-r1:7b

查看本地有那些模型

ollama list

查看当前正在运行的模型

ollama ps

image-20250728095738280

查看模型的详细信息

ollama show 模型名称

image-20250728095810102

复制一个模型

ollama cp 模型名称 新模型名称

image-20250728095947681

删除模型(慎用)

ollama rm 模型名称

image-20250728100016432

下载模型

ollama pull 模型名称

模型名称可以在Ollama官网查询你想要的

image-20250728100151509

此命令,仅下载模型,并不会运行。

ChatBoxAI工具连接Ollama

我们可以安装ChatboxAI 软件在自己电脑中提供一个对话工具,和我们电脑的Ollama进行连接。

安装:略(找到安装包,一路下一步即可)

前置要求

使用ChatBoxAI软件之前,必须启动你电脑的Ollama

  • 启动你Windows版的Ollama
    • Windows的Ollama默认无法调用显卡的CUDA计算加速
  • WSL Linux版的Ollama都可以用 (推荐使用WSL)
    • Linux下CUDA加速性能更好

配置

image-20250728101339469

使用

image-20250728101401778

Streamlit

Streamlit是一个Python的第三方库,可以通过很少的代码,开发功能丰富的网页应用。

安装

打开Windows系统的cmd ,运行:

pip install streamlit -i https://pypi.tuna.tsinghua.edu.cn/simple

测试Streamlit

打开Windows系统的cmd ,运行:

streamlit hello

会自动打开一个网页,可以看到丰富的官方demo 效果。

看完了就可以关了,没啥用。

运行Python代码

使用streamlit编写的Python代码无法直接在PyCharm中执行,需要用cmd执行。

打开系统的命令提示符(CMD)程序,执行:

streamlit run python代码

session_state

Streamlit工具编写的网页会定期刷新,等同于每隔一段时间,重新执行整个Python代码。

比如:

import streamlit as st

st.....
st.....

d = {}

while True:
    d[key] = xxx    # 每次循环的Key 假设永不重复

我们代码写的无限循环,不停的给字典添加信息,但是这个字典能够记录的信息永远只有1个key

因为这段代码被Streamlit执行起来,相当于每隔一段时间都定期执行。

则每一次执行字典d 都会被赋值为空字典。原有记录信息会丢失。

如果想要在网页运行的过程中存储下来信息,可以用Streamlit内置的字典,这个字典将不会丢失内容。

即将代码改为:

import streamlit as st

st.....
st.....


while True:
    st.session_state[key] = xxx # 每次循环的Key 假设永不重复

st.session_state 就是一个字典,我们用这个字典,记录的内容就不会丢失。

Python调用Ollama

Python有一个第三方库叫做:ollama

要注意我们现在电脑有2个Ollama:

  • WSL Linux中运行的Ollama:软件程序
  • Python的第三方库Ollama

安装Ollama Python库

pip install ollama -i https://pypi.tuna.tsinghua.edu.cn/simple

使用Python调用Ollama

"""
演示使用Python调用Ollama进行模型对话
先确保Ollama已经启动
"""

import ollama

# 建立和Ollama的连接(代码和Ollama程序)
client = ollama.Client(host="http://127.0.0.1:11434")

# 准备用户的提问
prompt = input("请输入你的问题:")

# 封装要提问的格式
# [{"role":"user", "content": "提问的内容"}]
message = [{"role": "user", "content": prompt}]


# 调用ollama进行回答
result = client.chat(
    model="deepseek-r1:7b",     # 模型名
    messages=message            # 封装好的列表(内含提问信息)
)

# 只输出回答信息
print(result['message']['content'])

在云平台使用模型

获取云平台API KEY

需要在阿里云百炼平台注册账户,创建应用,创建API KEY

https://bailian.console.aliyun.com

image-20250728180325906

如图点击新增应用,选择智能体应用。

image-20250728180408444

获取API KEY

image-20250728180438383

通过LangChain完成Python代码连接阿里云通义模型

pip安装库

pip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dashscope -i https://pypi.tuna.tsinghua.edu.cn/simple

示例

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_community.llms import Tongyi

memory = ConversationBufferMemory(return_message=True)


def get_response(prompt, api_key):
    model = Tongyi(model="qwen-max", api_key=api_key)
    chain = ConversationChain(llm=model, memory=memory)

    # 发送请求
    response = chain.invoke({"input": prompt})

    return response["response"]


if __name__ == '__main__':

    print(get_response("请python 1-100的输出", "sk-fa5b080ac78b4323b13f733b50f1d5c0"))

抄一遍即可,无需理解代码含义,因为有很多基础知识还未学,目前仅仅体验一下。

Streamlit结合LangChain完成聊天机器人

"""
通过Streamlit完成聊天机器人页面开发
"""
import streamlit as st
import langchain_util as utils

# 添加标题
st.title("黑马聊天机器人(阿里云通义千问模型版)")

# 添加分割线
st.divider()


# 输出第一条消息 机器人欢迎语
if "message" not in st.session_state:
    st.session_state["message"] = [{"role": "assistant", "content": "你好我是人工智能机器人,有什么可以帮到您!"}]
    # st.session_state["message"].append({"role": "assistant", "content": "你好我是人工智能机器人,有什么可以帮到您!"})

# list.append({"role": "user", "content": "内容"})
# state["message"]  =   [ {"role": "user", "content": "内容"} , {"role": "user", "content": "内容"}]
# 每一个消息的对话分为2部分: 角色,内容
# 机器人  角色:assistant   内容:说的话
# 人     角色:user         内容:说的话
for message in st.session_state["message"]:
    st.chat_message(message["role"]).write(message["content"])

# 用户输入 在页面下方添加用户输入栏
prompt = st.chat_input()

if prompt:          # 如果prompt有内容 表示用户提问

    # 首先将用户的提问在页面输出
    st.chat_message("user").write(prompt)

    # 把用户提问这个对话保存到session_state内
    st.session_state["message"].append({"role": "user", "content": prompt})

    # 调用AI回答
    with st.spinner("正在思考中..."):        # 转圈圈的加载框
        res = utils.get_response(prompt, "sk-fa5b080ac78b4323b13f733b50f1d5c0")

    # 将AI回答信息写到屏幕上
    st.chat_message("assistant").write(res)

    # 将AI回答的消息记录到session_state内
    st.session_state["message"].append({"role": "assistant", "content": res})

抄一遍即可