大模型系列21-AI聊天机器人
聊天机器人
- 背景
- 机器学习基础
- 监督学习(Supervised Learning)
- 概念
- 应用场景
- 主要问题
- 无监督学习(Unsupervised Learning)
- 概念
- 常见方法
- 应用场景
- 强化学习(Reinforcement Learning)
- 概念
- 关键要素
- 应用场景
- 模型优化
- Transformer:现代 NLP 的核心
- Transformer 的特点
- 大语言模型(LLM)的应用
- Token 统计工具
- 大语言模型的优化流程
- 步骤 1:监督微调(Supervised Fine - Tuning)
- 步骤 2:训练奖励模型(Training a Reward Model)
- 步骤 3:优化策略(Optimize Policy)
- Streamlit 介绍
- 安装 Streamlit
- 示例代码(helloworld)
- 运行应用
- 运行结果示例
- 聊天机器人
- OpenAI API 参考
- 运行代码和效果
- 代码
- 界面运作原理
- 动画效果
背景
学习大模型已经有一两个月了,为了加深理解,最近开始了一些实践。通过跟随一个bilibili的教程,逐步实现了一个最simple的 AI 聊天机器人。本篇文章主要梳理看视频过程中的机器学习的基础知识,并介绍一些其他的基础知识,只为备忘。
机器学习基础
监督学习(Supervised Learning)
概念
监督学习是指使用标注数据进行训练,并通过测试数据集来检验模型效果。
应用场景
- 分类(Classification):如垃圾邮件分类、图片识别等。
- 回归(Regression):如房价预测、天气预测等。
主要问题
- 标注数据成本高昂:标注数据需要大量人工干预,且成本较高。
- 泛化能力有限:模型容易在训练数据上表现良好,但在新数据上效果差,容易发生过拟合。
- 无法处理无标签数据:监督学习方法依赖标签,因此不能直接应用于无标签数据的场景。
无监督学习(Unsupervised Learning)
概念
无监督学习无需依赖标注数据,模型通过分析数据本身的结构和规律进行学习,主要用于挖掘数据中潜在的模式。
常见方法
- 聚类(Clustering):如 K-means、层次聚类。
- 关联规则(Association Rules):如市场购物篮分析(购买电动牙刷后推荐牙膏)。
应用场景
- 推荐系统:根据用户行为推荐商品。
- 数据降维:如 PCA(主成分分析)优化数据特征。
- 医疗分析:从患者数据中发现潜在的疾病关联。
强化学习(Reinforcement Learning)
概念
强化学习通过与环境的交互学习最优策略,以最大化奖励。它不像监督学习那样需要标注数据,而是通过试错过程不断优化决策策略。
关键要素
- 状态(State):描述环境的当前情况。
- 动作(Action):智能体可以选择的操作。
- 奖励(Reward):智能体执行某个动作后从环境中获得的反馈,通常用于评估该动作的效果。
应用场景
- 自动驾驶:通过与环境交互来不断优化驾驶策略,提高决策能力。
- 游戏 AI:例如 AlphaGo 通过自我对弈学习最优策略,最终战胜顶级围棋选手。在游戏的每个步骤中根据当前的环境状态,考虑当前随后的不同操作(还需要同时兼顾所有历史的操作),不同的操作有不同的得分反馈。
模型优化
在机器学习中,模型的效果通常受到以下三种情况的影响:
- 欠拟合(Underfitting):模型过于简单,无法捕捉数据中的规律,导致训练误差和测试误差都较高。
- 过拟合(Overfitting):模型在训练数据上表现良好,但对未见数据的泛化能力差,测试误差较大。
- 最佳拟合(Optimal Fit):模型在训练集和测试集上都能保持较好的表现,具备良好的泛化能力。
Transformer:现代 NLP 的核心
Transformer 的特点
- 全局注意力机制:相比于 RNN,Transformer 能够更好地捕捉长距离的依赖关系,不再依赖顺序性,显著提高了训练效率。
- 并行计算:Transformer 支持并行计算,极大地提升了训练和推理的速度,特别是在大规模数据集上。
大语言模型(LLM)的应用
基于 Transformer 的大语言模型(LLM)具有强大的文本处理能力,能够在以下任务中发挥作用:
- 特征提取:从大量文本中提取有用的特征。
- 文本生成(AIGC):生成高质量的自然语言文本。
- 问答系统(QA):自动回答用户提出的问题。
- 文本分类:对文本进行类别分类。
- 文本摘要:从长篇文本中提取出核心信息。
- 机器翻译:自动将一种语言翻译成另一种语言。
Token 统计工具
在处理 LLM 任务时,Token 统计是必不可少的。推荐使用以下工具来进行 Token 计算:
GPT Tokenizer
大语言模型的优化流程

训练一个强大的 LLM 需要经历以下三个步骤:
步骤 1:监督微调(Supervised Fine - Tuning)
- 数据收集:收集人类示范数据(Collect human demonstration data),即人类针对特定提示(Prompt)给出的答案。
- 模型微调:使用这些人类示范数据对基础大语言模型(Base LLM)进行监督微调,得到监督微调模型(SFT,Supervised Fine - tune)。这一步属于监督学习的范畴。
步骤 2:训练奖励模型(Training a Reward Model)
- 偏好数据收集:模型(SFT)针对提示生成多个答案(Answer 1、Answer 2 等),由人类对这些答案进行偏好排序,收集人类偏好数据(Collect human preference data)。
- 奖励模型训练:基于收集到的人类偏好数据,训练一个独立的奖励模型(RM,Reward Model)。这个过程同样是在基础大语言模型的基础上进行微调。
步骤 3:优化策略(Optimize Policy)
- 策略更新:使用强化学习算法(如近端策略优化算法 PPO,Proximal Policy Optimization),在奖励模型(RM)的反馈下更新模型策略(Policy)。模型根据提示(Prompt)生成答案(Answer),奖励模型会根据答案的质量给予奖励(Reward),强化学习算法根据奖励信号来优化模型,使其生成更符合人类偏好的答案。
通过这三个步骤,RLHF 使得模型能够更好地理解和满足人类的需求与偏好,提升生成内容的质量和适用性。
作为一个学习 LLM 的新人,上述逻辑还是让我感觉到很牛的。我们只需要训练好一个BaseLM,这个BaseLM可以作为积木的基础,用以实现模型进化。它的思想是先使用BaseLM(命名为 A A A) SFT一个微调模型 B B B,利用微调模型对预定的每个问题得到多个答案,然后利用人类对答案进行打分,这些问题和打分过的答案又可以作为数据源对BaseLM进行微调,以得到一个奖励模型(其实就是打分模型,命名为 C C C);最后我们利用奖励模型 C C C来对微调模型 B B B的输出进行自动打分,利用强化学习的思想使得微调模型 B B B不断进化。
A → S F T → B A → 人类打分 S F T → C B → R L → B + ( 利用 C 来打分反馈 ) \begin{split} & A \rightarrow SFT \rightarrow B \\ & A \rightarrow 人类打分SFT \rightarrow C \\ & B \rightarrow RL \rightarrow B^+ ( 利用 C 来打分反馈) \\ \end{split} A→SFT→BA→人类打分SFT→CB→RL→B+(利用C来打分反馈)
Streamlit 介绍
Streamlit 是一个用于构建快速、交互式 Web 应用的 Python 库,特别适用于机器学习和数据科学项目。通过简单的 Python 代码,Streamlit 可以让你快速展示数据可视化、创建交互式界面和展示机器学习模型的结果。总的来说是可以用于快速验证思路,进行demo展示。
安装 Streamlit
你可以通过以下命令安装 Streamlit:
pip install streamlit
示例代码(helloworld)
以下是一个简单的 Streamlit 示例,展示了如何快速创建一个简单的 Web 应用:
import streamlit as stst.title("Streamlit 示例应用")
st.write("""# My First Go ProgramHello World!""")
运行应用
运行以下命令启动 Streamlit 应用:
streamlit run streamlit_app.py
运行结果示例

聊天机器人
下面不到100行的代码,就实现了聊天机器人的web应用,简单、高效。
其中一个注意的地方是:这里我使用本地的ollama+qwen2.5:0.5b来实现,你可以替换为 deepseek 或者 openai 的官方API。
client = OpenAI(api_key=“ollama”, base_url=“http://localhost:11434/v1/”)
OpenAI API 参考
使用 OpenAI 提供的 API 可以方便地调用大语言模型:OpenAI API 文档

运行代码和效果
streamlit run chatbot.py

代码
import streamlit as st
from openai import OpenAIclient = OpenAI(api_key="ollama",base_url="http://localhost:11434/v1/")# 定义左侧边栏
with st.sidebar:st.markdown(f"""<center><img src='https://vip.helloimg.com/i/2024/07/02/66841f6f4a3a5.png' width='100'/><h1>MoBot <sup>®</sup></h1></center>""", unsafe_allow_html=True)# 角色定义输入框 System Messagesystem_message = st.text_area("角色定义", "你是一个能帮助用户的 AI 助手。")# 创造力调节 Temperaturetemperature = st.slider("创造力调节", min_value=0.0, max_value=2.0,value=1.0, step=0.1, help='值越大越具有创造力', format="%.1f")# 清除历史消息记录按钮if st.button("清除历史消息记录"):st.session_state.messages = [{"role": "system","content": system_message},{"role": "assistant","content": "Hi. 我是 Mobot~ 很高兴遇见你!有问必答,专注于懂你的 AI 🤗"}]# 定义右边的 chatbot 对话窗口标题
st.title("🤖 AI 聊天机器人")# 初始化界面的聊天列表
if "messages" not in st.session_state:st.session_state.messages = [{"role": "system","content": system_message},{"role": "assistant","content": "Hi. 我是 Mobot~ 很高兴遇见你!有问必答,专注于懂你的 AI 🤗"}]# Display chat messages from history on app rerun
for message in st.session_state.messages:with st.chat_message(message["role"]):st.markdown(message["content"])# 用户输入
user_query = st.chat_input("说点什么...")
if user_query:# 正确更新 system messagest.session_state.messages[0] = {"role": "system","content": system_message}# 显示用户输入的内容到聊天窗口with st.chat_message("user"):st.write(user_query)# 在聊天窗口输出用户输入的问题st.session_state.messages.append({"role": "user", "content": user_query})with st.chat_message("assistant"):with st.spinner("AI 正在思考..."):print("---------------\n", st.session_state.messages)# 发送请求到APIresponse = client.chat.completions.create(model="qwen2.5:0.5b",messages=st.session_state.messages,temperature=temperature,stream=True)message_placeholder = st.empty()ai_response = ''for chunk in response:chunk_message = chunk.choices[0].delta.content if chunk.choices and chunk.choices[0].delta.content else ''ai_response += chunk_messagemessage_placeholder.markdown(ai_response)# 将AI的回复添加到消息历史st.session_state.messages.append({"role": "assistant", "content": ai_response})
界面运作原理
- 初始化:应用启动时,会初始化侧边栏、聊天窗口标题和聊天记录。
- 显示历史记录:将 st.session_state.messages 中的历史聊天记录显示在聊天窗口中。
- 等待用户输入:用户在输入框中输入消息,点击发送后,消息会显示在聊天窗口中,并添加到 st.session_state.messages 列表中。
- 获取 AI 回复:应用将包含用户输入的完整聊天记录发送到 OpenAI API,获取 AI 的回复,并将回复显示在聊天窗口中,同时添加到 st.session_state.messages 列表中。
- 清除历史记录:用户点击侧边栏的 “清除历史消息记录” 按钮,将 st.session_state.messages 重置为初始状态,聊天窗口中的历史记录被清空。
通过这种方式,用户可以持续与 AI 进行对话,并且可以随时调整角色定义和创造力参数,或者清除历史记录。
动画效果

备注:过去该文章有一段关于 RAG 描述,相关内容已经全部汇总到另外一篇文章RAG实践,欢迎移步。
相关文章:
大模型系列21-AI聊天机器人
聊天机器人 背景机器学习基础监督学习(Supervised Learning)概念应用场景主要问题 无监督学习(Unsupervised Learning)概念常见方法应用场景 强化学习(Reinforcement Learning)概念关键要素应用场景 模型优…...
Apache Iceberg数据湖技术在海量实时数据处理、实时特征工程和模型训练的应用技术方案和具体实施步骤及代码
Apache Iceberg在处理海量实时数据、支持实时特征工程和模型训练方面的强大能力。Iceberg支持实时特征工程和模型训练,特别适用于需要处理海量实时数据的机器学习工作流。 Iceberg作为数据湖,以支持其机器学习平台中的特征存储。Iceberg的分层结构、快照…...
25.2.3 【洛谷】作为栈的复习不错(学习记录)
今天学习的东西不算多,放了一个星期假,感觉不少东西都没那么清楚,得复习一下才行。今天搞个栈题写,把栈复习一下,明天进入正轨,边复习边学习新东西,应该会有二叉树的学习等等... 【洛谷】P1449 …...
Windows 中的 WSL:开启你的 Linux 之旅
今天在安装windows上安装Docker Desktop的时候,遇到了WSL。下面咱们就学习下。 欢迎来到涛涛聊AI 一、什么是 WSL? WSL,全称为 Windows Subsystem for Linux,是微软为 Windows 系统开发的一个兼容层,它允许用户在 Win…...
二维前缀和:高效求解矩阵区域和问题
在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵,时间复杂度较高。当矩阵非常大且有大量的查询时,直接计算将变得低效。为了提高效率,我们可以通过 二维前缀和 技巧在常数时间内解决这个…...
音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现
一、引言 FFmpeg源码中通过ff_sdp_parse函数解析SDP。该函数定义在libavformat/rtsp.c中: int ff_sdp_parse(AVFormatContext *s, const char *content) {const char *p;int letter, i;char buf[SDP_MAX_SIZE], *q;SDPParseState sdp_parse_state { { 0 } }, *s1…...
Android开发工作经历整理
一.无人机应用软件开发 集成大疆官网的DJIMobileSDK到AS中编写软件,操控无人机执行多个航点任务。集成OpenCV库进行图像识别,通过获取参数,根据算法执行sdk,使无人机降落到机库,并执行后续的换电操作。待无人机就绪后…...
C++中常用的十大排序方法之4——希尔排序
成长路上不孤单😊😊😊😊😊😊 【😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C中常用的排序方法之4——希尔排序的相…...
解决注入线程池的栈溢出问题
文章目录 1.问题产生2.问题解决 1.问题产生 在使用sleuth的时候,需要注入线程池,他才会自动包装,实现traceId的传递,但是突然启动时出现了栈溢出的问题 2.问题解决 根据报错,发现是Gson序列化相关的问题,…...
自动驾驶---两轮自行车的自主导航
1 背景 无人驾驶汽车最早出现在DARPA的比赛中,从那个时刻开始,逐渐引起全球学者的注意,于是从上个世纪开始各大高校院所开始了无人汽车的研发。直到这两年,无人驾驶汽车才开始走进寻常百姓家,虽然目前市面上的乘用车还…...
哈夫曼树并查集
(1)哈夫曼树 特殊概念: 1.结点的权:表示结点树的重要性 2.带权路径长度:从树的根到该节点的路径长度(经过的边数)与该节点上权值的乘积 2.树的带权路径长度:该树的所有叶子节点的…...
PyTorch数据建模
回归分析 import torch import numpy as np import pandas as pd from torch.utils.data import DataLoader,TensorDataset import time strat = time.perf_counter()...
在 Ubuntu 上安装 Node.js 23.x
在 Ubuntu 上安装 Node.js 23.x 前提条件安装步骤1. 下载设置脚本2. 运行设置脚本3. 安装 Node.js4. 验证安装 参考链接总结 在现代 web 开发中,Node.js 是一个不可或缺的工具。它提供了一个强大的 JavaScript 运行时环境,使得开发人员可以在服务器端使用…...
SQL范式与反范式_优化数据库性能
1. 引言 什么是SQL范式 SQL范式是指数据库设计中的一系列规则和标准,旨在减少数据冗余、提高数据完整性和一致性。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 什么是SQL反范式 SQL反范式是指在满足范式要求的基础上,有…...
hunyuan 混元学习
使用了5个subset,也是用了text-image和text-video进行训练的 也是进行了复杂的视频选择。同movie gen. 也进行了模型切断,用拉普拉斯算子找到最清晰的一帧作为训练的起始 训练了不同的模型去选择数据,比如用Dover去选择美观度比较好的数据,…...
四、GPIO中断实现按键功能
4.1 GPIO简介 输入输出(I/O)是一个非常重要的概念。I/O泛指所有类型的输入输出端口,包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO(General-Purpose Input/Output)则是一个常见的术语,…...
.Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
版本号 Nuget 搜索 “OpenCCNET”, 注意别找错, 好多库的名字都差不多 支持 “繁,简” 的互相转换, 支持多个地区常用词汇的转换, 还支持 日文的新旧转换. OpenCC 在 .Net 中的实现 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…...
一元函数微积分的几何应用:二维平面光滑曲线的曲率公式
文章目录 前言曲率和曲率半径的定义曲率计算公式参数方程形式直角坐标显式方程形式极坐标形式向量形式 前言 本文将介绍二维平面光滑曲线的曲率定义以及不同形式的曲率及曲率半径公式的推导。 曲率和曲率半径的定义 (关于二维平面光滑曲线的定义以及弧长公式请参…...
数据结构与算法之异步: LeetCode 1114. 按序打印 (Ts版)
按序打印 https://leetcode.cn/problems/print-in-order/description/ 描述 给你一个类: public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third&qu…...
python:求解爱因斯坦场方程
在物理学中,爱因斯坦的广义相对论(General Relativity)是描述引力如何作用于时空的理论。广义相对论由爱因斯坦在1915年提出,并被阿尔伯特爱因斯坦、纳森罗森和纳尔逊曼德尔斯塔姆共同发展。广义相对论的核心方程是爱因斯坦场方程…...
PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践
title: PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践 date: 2025/1/28 updated: 2025/1/28 author: cmdragon excerpt: 在数据库管理中,备份与恢复是确保数据安全和业务连续性的关键措施。PostgreSQL 提供了一系列工具,以便于数据库管理员对数据进行…...
位运算的概念
文章目录 整数在计算机中的表示二进制表示有符号类型和无符号类型机器数和真值原码、反码和补码原码、反码和补码的表示方法计算机中的表示 位运算与、或、异或和取反移位运算移位运算与乘除法的关系位运算的性质 目录 整数在计算机中的表示 二进制表示 程序中的所有数在计算…...
自主Shell命令行解释器
什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令,都是在命令行上输入的,我们之前对于命令行的理解: 命令行是干啥的?是为我们做命令行解释的。 命令行这个东西实际上是我们…...
Vue.js 的介绍与组件开发初步
Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...
XCCL、NCCL、HCCL通信库
XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑,实现的是不同的优化算法的(不同CCL库最大的区别就是这) 不同CCL库还会根据自己的硬件、系统,在底层上面对一些相对应的改动; 但是对上的API接口…...
Python教学:文档处理及箱线图等
代码1: import os import pandas as pd import numpy as py import os.path from os import listdir import openpyxl from openpyxl import Workbook import re import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化 cwdos.getcwd…...
【Redis】安装配置Redis超详细教程 / Linux版
Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频:黑马程序员Redis入门到…...
【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive
本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…...
springboot 启动原理
目标: SpringBootApplication注解认识了解SpringBoot的启动流程 了解SpringFactoriesLoader对META-INF/spring.factories的反射加载认识AutoConfigurationImportSelector这个ImportSelector starter的认识和使用 目录 SpringBoot 启动原理SpringBootApplication 注…...
llama.cpp GGUF 模型格式
llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名规则)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…...
