后面还会持续更新~
Deepsleep深度睡眠镇楼
大模型
首先有几个比较基础的定义先了解一下,token啊
token
大模型他是不认识汉字、英文单词的,它只能处理一串数字。Token 就是把原始文字切分出来的最小处理单元;每一个 token 最后都会转换成一个唯一数字(模型词表编号)送入神经网络。
- 中文经常 1 个汉字 ≈ 1 个 token
- 英文:常常不是完整单词,会切成词根、片段(
running→run+ning) 比如苹果在一个大模型里面可能是一个词 但是在别的大模型里面可能是两个词苹和果 你如果输入苹果进去到不同的大模型里面,在一个词的大模型里面就是一个token 两个词的就对应两个。所以其实大模型就是依靠分词器将一个长长的句子分解成好多个短短的词或者字也就是分为好多好多个token,便于ai去理解,分词器我们后面说 下面这样则表示苹果在词表里面对应的坐标是(1,1 1,2)所以大模型理解的苹果其实就是1,1和1,2。 | 词语 | x | y | | — | — | — | | 苹果 | 1 | 1 | | 香蕉 | 1 | 2 |
词嵌入
在刚刚的例子里,每个词语用两个数字来表示 (比如苹果是1,1)那我们如果使用更多数字是不是就可以表示更精确更多的文字,在Deepseek v3中每个词用7168个数字来表达一个词,也就是7168维 虽然我们想象不出来 但是可以画个二维的 一个词在一个坐标系上都有对应的一个坐标,这样就把词语转化为文字比如下面这样

分词器
分词器质感两件事,第一件事就是将原始文本,切成若干 token也就是若干个词然后转为对应的数字 第二件事就是模型输出的数字 还原成 token ,再拼接成文字给我们看,你可以把他理解为他就是一个翻译的,让我们和大模型能够畅通无阻的沟通。 比如原始句子: 我喜欢吃苹果 步骤 1:Tokenizer 执行切分 可能就会切分成 我 喜 欢 吃 苹 果 一共 6 个 token
分词器再去词表里查找,给每个 token 分配数字,类似:
我 → 1,1
喜 → 2,2
欢 → 3,3
吃 → 4,4
苹 → 5,5
果 → 6,6传给模型的数据就是一串数字:[1,1;2,2;3,3;4,4;5,5;6,6] 这样大模型就容易理解了
机器学习
机器学习我们用一个简单的例子来说 比如我们用代码跟机器说,看到"红色的就都是苹果,看到黄色的就是香蕉",这样不算是机器学习,因为机器只会执行我们以上这两个判断,真正的机器学习是比如我们给机器大量的苹果的图片,跟他说这个就是苹果,以后见到这种就跟我说这是苹果而不是香蕉,它能够自己找出规律并且识别这种就是机器学习,让他自己理解“苹果是什么东西”而不是“红色就是苹果” 我们给他的大量苹果的图片,也就是我们常说的数据集,机器他自己的这个学习过程,就叫训练,我们跟他说这个东西叫“苹果” 这个“苹果”就是我们说的标签
深度学习
深度学习是机器学习的一个分支,他跟机器学习最大的区别就是不需要我们手动提取特征 比如说还是苹果: 直接把整张图片(原始像素)+ 标签【苹果】丢进去训练。 深度学习依靠多层神经网络,分层自动挖掘特征:
- 第一层网络:识别基础单元 → 色块、边缘、线条
- 第二层网络:组合线条 → 弧形、圆形轮廓、小块斑点
- 更深层网络:继续组合 → 完整苹果外形、果蒂、苹果独有的纹理 让机器自己学会:苹果拥有一套独有的多层特征组合。自己总结规律自己学习

强化学习
强化学习就是在原有的机器学习的基础上,加上奖励机制,打分之类的这样能够让机器识别更准确。 比如说你养了一只狗,刚开始养的时候他听不懂你说话,你说“坐下”他不为所动。直到有一次,你对他说了一下“坐下”,刚好他执行了这个坐下的动作,这时候你给他一个零嘴吃,那他就会有这个想法说是不是“坐下”这个指令我就需要坐下,然后多尝试几次之后他就知道“坐下”我就应该坐下,这个零嘴就是一个奖励机制,其实真正的强化学习比这个复杂的多,我们在此只做简单理解而不细讲,后续会单独出一个文章

SpringAI
引入依赖
第一个是管理所有AI依赖的一个工具 第二是ollama的starter,Spring官方提供了很多Starter可以给直接调用,可以去官网查一下需要的 
配置模型
第二步则是配置模型 这个是ollama的Deepseek模型 
配置客户端
首先通过注册一个客户端chatClient,然后使用它的方法.promt()调用 拼接上call()或者是Stream()方法(对应一个String一个Flux<String>返回值)一个是直接拿到所有的返回,一个是流式返回 也就是响应式的 一个字一个字跳 
会话日志
Spring提供了很多会话日志的工具,左边就是Advicor的示意图,即是将用户的输入和模型的输出,也就是我们说的问答将其记录下 来,右边则是使用到的工具
使用的方法也比较简单,则是在创建Client的时候加上,并且在配置文件里面加上Debug的输出即可(这种方法仅限于控制台输出)


会话记忆
定义会话的存储方式
这个可以是一个redis啊一个MongoDB啊之类的,核心其实就是将用户的输入和模型的输出记录下来 然后在下次提问的时候带上 使用的方法就是new一个chatMemory并且在创建Client的时候加上chatMemory 
但是这里就会出现一个问题 我们怎么区分哪一个记忆是哪一个会话的呢 这里就要添加一个会话id,每一个会话都会有一个id,这样存储的记忆就会带个id

然后就是保存和get的方法 这里的type是因为分了多种类型的问答,根据type去查询当前type下有多少个id,然后返回id列表


每次进入页面的时候查询则是

因为每次返回都是以下这种格式的,所以我们定义一个类去包装整合一下所有的返回值
[{role:'"user",content:"xxx"}]

后面还会持续更新~
最后
愿君安康,平安同乐!