【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录

1、语言模型

1.1、训练过程:

1..2、大型语言模型分类:

1.3、指令微调模型训练过程:

2、Tokens

3、Helper function辅助函数 (提问范式)

4、计算token数量


 

1、语言模型

大语言模型(LLM)是通过预测下一个词的监督学习方式进行训练的。具体来说,

1.1、训练过程:

1)首先准备一个包含数百亿甚至更多词的大规模文本数据集。

2)从这些文本中提取句子或句子片段作为模型输入。模型会根据当前输入 Context 预测下一个词的概率分布。

3)通过不断比较模型预测和实际的下一个词,并更新模型参数最小化两者差异,语言模型逐步掌握了语言的规律,学会了预测下一个词。

这种以预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力

 

1..2、大型语言模型分类:

1)基础语言模型(Base LLM)通过反复预测下一个词来训练的方式进行训练,没有明确的目标导向。可能给出与问题无关的回答。

例如,给它一个 Prompt ,比如”中国的首都是哪里?“,很可能它数据中有一段互联网上关于中国的测验问题列表。这时,它可能会用“中国最大的城市是什么?中国的人口是多少?”等等来回答这个问题。

2)指令微调的语言模型(Instruction Tuned LLM)则进行了专门的训练,以便更好地理解问题并给出符合指令的回答。

例如,对“中国的首都是哪里?”这个问题,经过微调的语言模型很可能直接回答“中国的首都是北京”,而不是生硬地列出一系列相关问题。

指令微调使语言模型更加适合任务导向的对话应用。它可以生成遵循指令的语义准确的回复,而非自由联想。

 

1.3、指令微调模型训练过程:

1)在大规模文本数据集上进行无监督预训练,获得基础语言模型。需要大量数据集

2)使用包含指令及对应回复示例的小数据集对基础模型进行有监督 fine-tune,这让模型逐步学会遵循指令生成输出

3)为了提高语言模型输出的质量,常见的方法是让人类对许多不同输出进行评级,例如是否有用、是否真实、是否无害等。

4)增加生成高评级输出的概率。这通常使用基于人类反馈的强化学习(RLHF)技术来实现。

 

import openaiopenai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"def get_completion(messages, model="chatglm3-6b", temperature=0.7):completion = openai.ChatCompletion.create(model=model,messages=[{"role": "user", "content": messages}],temperature=temperature)# print(str(response.choices[0].message))return completion.choices[0].message.contentresponse = get_completion("中国的首都是哪里?")
print(response)

 

2、Tokens

LLM 实际上并不是重复预测下一个单词,而是重复预测下一个 token 。

对于一个句子,语言模型会先使用分词器将其拆分为一个个 token ,而不是原始的单词。

对于生僻词,可能会拆分为多个 token 。这样可以大幅降低字典规模,提高模型训练和推断效率。

对于 "Learning new things is fun!" 这句话,每个单词都被转换为一个 token ,

对于较少使用的单词,如 "Prompting as powerful developer tool",单词 "prompting" 会被拆分为三个 token,即"prom"、"pt"和"ing"。

# 设置温度系数=0,确保每次生成一致
response = get_completion("Take the letters in lollipop \
and reverse them", temperature=0)
print(response)

16f0592768ee4427a07488c767bb7cc1.png

实际"lollipop" 反过来应该是 "popillol"。

分词方式也会对语言模型的理解能力产生影响

当您要求颠倒 "lollipop" 的字母时,由于分词器(tokenizer) 将 "lollipop" 分解为三个 token,即 "l"、"oll"、"ipop"

 

3、Helper function辅助函数 (提问范式)

a425ce86d2d74e7582d2920e0f91e983.png

 

提问格式区分了“系统消息”和“用户消息”两个部分。

通过设置助手角色,减少无效输出,帮助其生成针对性强的回复。

import openaiopenai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"def get_completion(messages, model="chatglm3-6b", temperature=0.7,max_tokens=500):completion = openai.ChatCompletion.create(model=model,messages=messages,temperature=temperature,max_tokens=max_tokens ,)# print(str(response.choices[0].message))return completion.choices[0].message.content# 由于我的模型在返回结果中出现了英文、繁体中文,所以添加了额外提示词内容
messages =  [{'role':'system','content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。回答结果中不要出现英文,仅使用简体中文'},{'role':'user','content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response = get_completion(messages, temperature=1)
print(response)

9142899203f74934a7e89d0fe0a99437.png

# 长度控制
messages =  [{'role':'system','content':'你的所有答复只能是一句话'},{'role':'user','content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion(messages, temperature =1)
print(response)

小鲸鱼快乐地在水中游,因为它喜欢这份自由和轻松的感觉。

messages =  [{'role':'system','content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答,只回答一句话'},{'role':'user','content':'写一个关于快乐的小鲸鱼的故事'},
]
response = get_completion(messages, temperature =1)
print(response)

快乐的小鲸鱼每天在海底漫游,与朋友们玩耍,享受着美好的生活。

 

4、计算token数量

import openaiopenai.api_key = "EMPTY"
openai.api_base = "http://192.168.20.113:20000/v1"def get_completion(messages, model="chatglm3-6b", temperature=0.7,max_tokens=500):completion = openai.ChatCompletion.create(model=model,messages=messages,temperature=temperature,max_tokens=max_tokens ,)content = completion.choices[0].message.contenttokens = {'提示词prompt_tokens': completion['usage']['prompt_tokens'],'生成回复completion_tokens': completion['usage']['completion_tokens'],'总total_tokens': completion['usage']['total_tokens'],}return content, tokens# 长度控制
messages =  [{'role':'system','content':'你是一个助理, 并以 Seuss 苏斯博士的风格作出回答。'},{'role':'user','content':'就快乐的小鲸鱼为主题给我写一首短诗'},
]
response,token_dict = get_completion(messages, temperature =1)
print(response,'\n', token_dict)

 {'提示词prompt_tokens': 35, '生成回复completion_tokens': 133, '总total_tokens': 168}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/385530.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn(简称sklearn)是一个非常流行的Python机器学习库,提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述: 1. 安装scikit-learn 首先,确保你已经安装了Python和…

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…

Kettle下载安装

环境说明 虚拟机:Win7;MySql8.0 主机:Win11;JDK1.8;Kettle 9.4(Pentaho Data Integration 9.4)(下载方式见文末) 安装说明 【1】解压后运行Spoon.bat 【2】将jar包 复…

【Linux C | 网络编程】进程池退出的实现详解(五)

上一篇中讲解了在进程池文件传输的过程如何实现零拷贝,具体的方法包括使用mmap,sendfile,splice等等。 【Linux C | 网络编程】进程池零拷贝传输的实现详解(四) 这篇内容主要讲解进程池如何退出。 1.进程池的简单退…

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量,这些新变量称为主成分&…

7月24日JavaSE学习笔记

序列化版本控制 序列化:将内存对象转换成序列(流)的过程 反序列化:将对象序列读入程序,转换成对象的方式;反序列化的对象是一个新的对象。 serialVersionUID 是一个类的序列化版本号 private static fin…

算法通关:006_1二分查找

二分查找 查找一个数组里面是否存在num主要代码运行结果 详细写法自动生成数组和num,利用对数器查看二分代码是否正确 查找一个数组里面是否存在num 主要代码 /*** Author: ggdpzhk* CreateTime: 2024-07-27*/ public class cg {//二分查找public static boolean …

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售,我早早到官网预订了一台。选择必要的配件,输入视力信息,定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐,要3万6,比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类? 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

Q238. 除自身以外数组的乘积

思路 一开始想到的是按位乘 看了题解,思路是存i左边的乘积和 与 i右边的乘积和 代码一: 需要三次循环,需要额外空间 left和right数组 代码: public int[] productExceptSelf(int[] nums) {int[] left new int[nums.length];int[] right …

【爱上C++】list用法详解、模拟实现

文章目录 一:list介绍以及使用1.list介绍2.基本用法①list构造方式②list迭代器的使用③容量④元素访问⑤插入和删除⑥其他操作image.png 3.list与vector对比 二:list模拟实现1.基本框架2.节点结构体模板3.__list_iterator 结构体模板①模板参数说明②构…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前,仍然是先来个视频,以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击: 痕即鼠标点击器可以设定每秒点击次数,让您轻松应对高频点击需求。 切换时长,即每次动作之间的间…

大数据的数据质量有效提升的研究

大数据的数据质量有效提升是一个涉及多个环节和维度的复杂过程。以下是从数据采集、处理、管理到应用等方面,对大数据数据质量有效提升的研究概述: 一、数据采集阶段 明确采集需求:在数据采集前,需明确数据需求,包括…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下: leetcode102二叉树的层序遍历 我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。 具体题目 给你一棵…

把 网页代码 嵌入到 单片机程序中 2 日志2024/7/26

之前不是说把 网页代码 嵌入到 单片机程序中 嘛! 目录 之前不是说把 网页代码 嵌入到 单片机程序中 嘛! 修改vs的tasks.json配置 然后 测试 结果是正常的,可以编译了 但是:当我把我都html代码都写上去之后 还是会报错!!! 内部被检测到了,没辙,只有手动更新了小工具代码 …

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

JAVAWeb实战(前端篇)

项目实战一 0.项目结构 1.创建vue3项目,并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由,axios,pinia相关的对象 文件(.js) 2.1路由(.js) import {cre…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

nodeselector

1.概述 在创建pod资源是,k8s集群系统会给我们将pod资源随机分配到不同服务器上。我们通过配置nodeSelector可以将pod资源指定到拥有某个标签的服务器上 使用nodeselector前我们要先给每个节点打上标签,在编辑pod资源的时候选择该标签 2.示例 给节点打标…