人工智能大模型黑话解释
模型到底是如何生成答案的?
大语言模型并非通常理解的,简单地从数据库中找答案。而是通过数学计算,推测出最符合上下文的下一个字或词。
本质上,它是一个统计和概率驱动的工具。模型并不“理解”问题,而是利用训练数据中的语言模式,推测后续内容的概率分布。例如,输入“今天天气”,它可能预测“很”(30%)、“不”(20%)等,并从中选择输出。这种预测能力源于海量文本训练,通过调整数十亿参数,使其概率分布贴近真实语言规律。
模型的运作通常可以分为如下步骤:
模型接受输入,作为预测的起点,这个输入就是所谓的【上下文】
模型内部有一个巨大的神经网络,它根据训练时见过的海量文本,计算出在当前上下文的前提下,下一个字或词的概率分布。以【今天天气】为例,假设概率为:
很
30%
不
20%
好
15%
其他
……
模型会从这个概率分布中,根据策略挑选一个结果
循环重复,直到生成完整的句子
总结:模型通过大量文本数据学习。比如,它看到过无数次“今天天气很好”,就会记住“今天天气”后面接“很”的概率很高。训练时,模型调整内部参数(几十亿个权重),让预测的概率分布 ...
微服务实现代码执行
写在前面
今天算是阳康了,没精力整那个思维导图,凑合一下水水。
另外这篇文章也是网上抄的。
这次是实现贪吃蛇的自动化操作。具体原理就是把用户前端输入的代码存储到后端,经过一系列的通信走到一个微服务里,该微服务的功能就是编译并执行这段代码然后将值返回。再经过一系列的通信返回到前端。
有一大堆在配置和项目重构的准备也懒得搞了。
目前只能使用Java代码。
对于 Bot 的服务,整体处理在 BotRunningSystem 中。在 BotRunningSystem 中有一个单独的线程 Botpool,这个线程会不断的执行代码,每次执行一次代码就去把执行的结果 (移动的过程) 返回给处理移动的 nextstep,如果在等待时间之内 nextstep 函数没有能够接收到处理的指令,那么游戏就结束,如果两名 Bot 的下一步操作都有获取到,那么就进入到 Judge 来判断合法性,直到结束
在这里面用到了一个依赖,依赖为 joor 用它来接收一段代码,将代码插入到队列当中,每次从队列里取出代码运行,运行结束后将代码返还给用户
消费者线程
消费者线程中需要处理 Bot 的代码,因此要求有任务立即执 ...
微服务实现匹配功能
思维导图
更改项目结构
查看该历史版本
实现匹配池类
进入matchingsystem这个子项目里面。
在service/impl/utils/新建玩家类,因为匹配系统匹配的是玩家,需要这个辅助类。
123456789101112import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Player { private Integer userId; private Integer rating; private Integer waitingTime;}
匹配池:匹配分数最接近的玩家,根据匹配时间增长,匹配范围逐渐增大。
操作:包括添加玩家,删除玩家,匹配玩家,发送给后端匹配成功的结果。
策略:为了防止匹配时间过长,优先将先匹配的玩家优先匹配,防止用户流失。
在matchingsystem/service/impl/u ...
实现联机对战
思维导图
同步玩家
后端
在backend/consumer/utils下定义玩家类,存储玩家信息。
12345678910111213141516import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.List;@Data@AllArgsConstructor@NoArgsConstructorpublic class Player { private Integer id; private Integer sx; private Integer sy; // 蛇每个球的方向 private List<Integer> steps; }
在游戏类中导入玩家。
123456789101112131415161718private final Player playerA, playerB; public Game(Integer rows, Integer co ...
实现更改头像页面
思维导图
写在前面
这个模块的功能不是网课里的内容,全部都是我自己实现的。前端的界面参考了之前的web大作业和机器人界面的代码,后端都是一些很基础的东西。
后端编写更改图像API
新建service/user/account/GetphotoService接口
1234567package com.example.backend.service.user.account;import java.util.Map;public interface GetphotoService { public Map<String, String> getPhoto(Map<String, String> data);}
在service/impl/user/account/GetphotoImpl中实现该接口
123456789101112131415161718192021222324252627282930313233343536373839package com.example.backend.service.impl.user.acc ...
实现匹配功能
思维导图
实现匹配的原理
要实现匹配系统起码要有两个客户端 client1,client2, 当客户端打开对战页面并开始匹配时,会给后端服务器 server 发送一个请求,而匹配是一个异步的过程,什么时候返回结果是不可预知的,所以我们要写一个专门的匹配系统,维护一堆用户的集合,当用户发起匹配请求时,请求会先传给后端服务器,然后再传给匹配系统处理,匹配系统会不断地在用户里去筛选,将 rating 较为相近的的用户匹配到一组。当成功匹配后,匹配系统就会返回结果给 springboot 的后端服务器,继而返回给客户端即前端。然后我们就能在前端看到匹配到的对手是谁啦。
举个例子,两个客户端请求两个链接,新建两个类:
1234567891011121314151617181920212223public class WebSocketServer { @OnOpen public void onOpen(Session session, @PathParam("token") String token) { // 建立连接 ...
前端实现Bot页面
思维导图
写在前面
由于是前端内容,不想花费太多时间。把本次做的东西列举出来,去和Git历史版本一一比对下就好了。
Bot页面布局
从store中获取头像
实现创建Bot
实现删除Bot
实现展示Bot
实现修改Bot
使用代码编辑器替换表单中的代码textarea
历史版本
点击进入该历史版本
后端实现Bot相关API
思维导图
写在前面
这块是要实现,在项目中添加一个类Bot。和之前添加user的过程几乎一模一样,所以会写得非常精简。在这篇文章非常详细地介绍了Springboot关于后端数据处理的部分。
新建表bot
在数据库中新建表bot。
表中包含的列有:
id: int:非空、自动增加、唯一、主键
user_id: int:非空,用于存放创建该bot的用户。
注意:在 pojo 中需要定义成 userId,在 queryWrapper 中的名称仍然为 user_id
title: varchar(100):用于存放bot名称。
description: varchar(300):用于存放bot的描述。
content:varchar(10000):用于存放bot的执行代码。
rating: int:默认值为 1500:用于存放该bot的天梯分。
createtime: datetime:用于存放该bot的创建时间
modifytime: datetime:用于存放该bot的最近修改时间
实现pojo层
在pojo包下新建一个类Bot,用于映射bot的数据表
12345678910 ...
前端实现注册界面
思维导图
写在前面
前端部分就不想废太多时间了,总结一下干了什么然后去和历史节点一一对照看下就行了。
当我们登录网站的时候,如果没有登录,强制让用户重定向到 登录界面
实现注册页面,实现方法类似于UserAccountLoginView.vue
实现:登录状态的持久化。在当前代码版本下,一刷新就退出登录了;访问404界面也会退出登录,这都是因为没做到登录持久化。当我们的用户重定向到登陆页面的时候,我们需要把用户的 token 存储到浏览器的 local storage,这样就可以实现登录状态持久化。
修改 store 目录下的 -> user.js 文件
修改 view -> user -> account 下的 UserAccountLoginView.vue 文件
优化前端性能。在实现前端登录状态持久化之后,不断的刷新会显得网页非常的不自然,所以下面对前端页面进行优化。
在 store 目录下的 user.js 中添加全局变量和下拉函数。
修改 UserAccountLoginView.vue
修改 NavBar.vue
改动历史
点击这里 ...
前端实现登录登出界面
写在前面
前端部分就不想废太多时间了,总结一下干了什么然后去和历史节点一一对照看下就行了。
实现两个页面–登陆、注册的前端样式
在 router 目录下的 index.js 中加入路径
在 store 下的 user.js 存储用户信息
把 user 加入到全局 module
在user.js中利用ajax实现登录。为了方便,在user.js中添加辅助函数 login ,并在 UserAccountLoginView.vue 中实现
修改NavBar.vue,将内容和变量绑定起来
实现:用户名和密码输入正确,点击提交跳到主页面。在 UserAccountLoginView.vue 中实现
实现: 登陆成功后获取用户的信息。在 user.js 中添加辅助函数,并在UserAccountLoginView.vue 中实现
实现:登录成功后修改导航栏信息。修改NavBar.vue。利用v-if和v-else来实现。
实现:退出登录。具体逻辑就是把用户存储的token令牌删掉并更改导航栏。修改NavBar.vue,并在user.js中添加辅助函数来清空 ...