ChatGPT交互单位:Token

Token:这个指的是OpenAI处理文本的基本单位,可以是单词或者字符的片段、一个标点符号或数字。

  • 1个token大约相当于四个字符或者0.75个单词。例如,“hamburger”被分成“ham”、“bur”和“ger”三个Token,而“pear”是一个Token。
  • 一个汉字会被拆成大约Token。

OpenAI的模型有一个固定长度的Token限制。

  • 例如:GPT-3的Davinci模型最多可以处理2049个Token,大约1500个单词。最新Turbo模型大约是4096个Token,大约是3000个单词。
  • Token限制的计数包含输入和输出的文本。也就是说,比如“输入+输出”总共不能超过3000个英文单词。

训练语料的截至时间

ChatGPT、GPT-4的数据仅有2022年1月以前的,如果你问这个时间以后的问题,它就不能提供有效信息了。

AIGC、PGC、UGC

AIGC即AI Generate Content,是指利用人工智能技术来生成内容,AIGC也被认为是继PGC(专业生产内容)、UGC(用户生产内容)之后的新型内容生产方式,AI绘画、AI写作等都属于AIGC的分支。

进一步理解时,AIGC有狭义和广义概念之分。

  • 狭义的AIGC与普通用户更为贴近,更关注图像、文本、音频、视频等,和Generative AI(生成式AI)Aynthetic media(合成式媒体)等概念类似。
  • 论广义概念,还包含策略生成(如Game AI中游戏策略生成)、代码生成(GitHub Copilot)、蛋白质结构生成等。

Prompt

Prompt(提示)工程师的理解

1.何为提示工程师

提示工程师的职责是创建和完善人们向人工智能输入的文本提示,希望从中能获得最佳结果。有时候,一行精准、专业且完美的prompt,甚至可以价值千金。

有时候同一提示的不同表述,对大众来说,可能听起来很相似,但却能让AI产生完全不同的结果。而一个成功的提示工程师将找到一种方法来引导模型产生有用的输出

五大原则

想要让ChatGPT产出有效的回答,需要遵循以下五个原则:

  • 提问清晰:请尽可能清晰地描述你的问题
  • 简明扼要:请尽量使用简单的语言和简洁的句子来表达你的问题
  • 确认问题:请确认您的问题是清晰、明确和完整
  • 单一提问:请一个一个地问,而不是把所有问题放在一个问题中
  • 不要提供敏感信息:请不要在您的问题中提供任何个人敏感信息

基本三要素:

提示的特定格式,一般包含3个主要元素:

  • 角色:在生成文本时,模型应该扮演什么
  • 任务:一份清晰简洁的陈述,提示要求模型生成的内容。确保输出的相关、高质量。
    • 动词:编写、总结、分类、翻译、排序、查找、分析、评估、改进、开发、优化等
    • 名词(输出载体):句子、段落(或摘要)、文章、邮件、表格、代码/程序、求职信、论文、案例研究、合同、指南、剧本、歌词/诗歌、商业/运营/财务/营销计划等
  • 指示:在生成文本时,模型应该遵循什么。越直接,信息越有效。
    • 形容词:300字xxx,20个xx的,正式或非正式的、通俗易懂的、严肃的、幽默的、有说服力的、鼓舞人心的、讽刺的、强烈的、深思熟虑的…
    • 前导信息/上下文:提供来自xx的数据或研究报告、客户数据、目前已有的代码、我已完成的工作内容等

Open进行程序开发(这里需要魔法,只需打开魔法就行,代码里stater我已做处理)

1.首先拉去下面的代码到自己本地

git仓库地址:https://github.com/wcw-001/chatgpt-3-5-spring-starter

目录结构如下:image-20240414150711007

image-20240414150725492

3.将此stater打包到maven仓库中

image-20240414150925564

在这里我拿我自己做的数据分析平台为例引入chatgpt(简化)

1.在pom文件下引入以下依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.mrli</groupId>
<artifactId>chatgpt-3-5-springboot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>

2.在配置文件下配置如下:

1
2
3
4
5
6
7
chatgpt:
token: 填自己chatgpt密钥
timeout: 1000
username:
password:
ip: 127.0.0.1
port: 7890(有自己使用的魔法工具决定)

3.在dto层创建一个数据传输类

1
2
3
4
5
@Data
public class RequestDto {
@NotBlank(message="消息不能为空")
private String message;
}

4.创建chatGPT包,在包下创建如下类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Service
public class AiManager {
@Resource
private YuCongMingClient client;
public String doChat(Long biModelId,String message){
DevChatRequest devChatRequest = new DevChatRequest();
devChatRequest.setModelId(biModelId);
devChatRequest.setMessage(message);
BaseResponse<DevChatResponse> response = client.doChat(devChatRequest);
if(response == null){
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"AI 响应错误");
}
return response.getData().getContent();
}
private final ChatGptConfig config;

public AiManager(ChatGptConfig config) {
this.config=config;
}

public String doChatGPT(RequestDto requestDto){
OpenAiService service = new OpenAiService(config);
String message = requestDto.getMessage();
List<ChatMessage> messages = new ArrayList<>();
ChatMessage e = new ChatMessage();
e.setRole("user");
e.setContent(message);
messages.add(e);
ChatCompletionRequest completionRequest = ChatCompletionRequest.builder()
.model("gpt-3.5-turbo")
.messages(messages)
.build();
ChatCompletionResult completion = service.createChatCompletion(completionRequest);
List<ChatCompletionChoice> choices = completion.getChoices();
StringBuilder content = new StringBuilder();
for (ChatCompletionChoice choice : choices){
content.append(choice.getMessage().getContent());
}
return content.toString();
}
}

5.只需要在controller,引入相关的数据,在调用我们上面写的类里调用chatgpt方法就行了

1
2
3
4
5
6
7
@Resource
private AiManager aiManager;
@PostMapping("/genHh")
public String genChartByAi(@RequestBody RequestDto requestDto) {
String result = aiManager.doChatGPT(requestDto);
return result;
}

我们测试一下接口(可以使用工具ApiPost工具,我这里使用的是接口文档):

image-20240414151218086

总结(在这里的总结与我个人最近做的数据分析平台相关):

1、A提词技巧1:持续输入,持续优化

第一次问:我给你三行数据,请帮我分析网站的增长趋势,数据如下:第一行:日期:1号,用户数:10人第二行:日期:2号,用户数:20人第三行:日期:3号,用户数:30人

AI答:根据给出的数据,我们可以看出这个网站的用户数在三天内呈现快速增长的趋势。具体来说,该网站用户数从第一天的10人增长到第二天的20人,增勖加了10人,增长率100%;相比之下,第三天用户数从第二天的20人增长到第三天的30人,增加了同样的10人,增长率降至50%。如果这种增长趋势特续下去,我们可以预期该网站在未来几天内还会继续吸引更多用户。当然,若要得出更加准确的结论,需要更多数据的支持。

2、AI提词技巧2:数据压缩(内容压缩,比如把很长的内容提取关键词,也可以让AI来故)

我给你三行数据,请帮我分析网站的增长趋势,数据如下:表头:日期,用户数1号,102号,203号,30

AI回答:根据给出的数据,我们可以计算出每日用户增长量:

  • 第一天增长了10个新用户;

  • 第二天增长了20-10=10个新用户;

  • 第三天增长了30-20=10个新用户。

可以看出,每天的用户增长量都相等,呈现一个线性增长趋势。如果这个网站在未来的时间里能够保持现在的增长速度和策略不变,预计每过一天会增勖加10个用户。但需要注意的是,这个预测是基于目前的数据情况,实际情况会受到许多因素的响,不完全准确预测未来用户增长。

使用AI来压缩:问:我给你三行数据,请帮我用最少的字数压缩这设数据第一行:日期:1号,用户数:10人第二行:日期:2号,用户数:20人第三行:日期:3号,用户数:30人答:日期1-3号,用户数分别为10/20/30人。

3、AI 提词技巧3:在系统(模型)层面做妤预设效果一股来说,会比直接拼接在用户消息里效果更好一些。

4、AI提词技巧4:除了系统预设外,额外关联一问一答两条消息,相当于给A!一个提示。

1.1.1 AI提问技巧

如果得要让 AI 更好地理解我们的输入,给我们预期的、精确格式的输出,我们就需要严格控制咱们的提问词。

  1. 使用系统预设

先对chatgpt指定角色

  1. 控制输入格式(便于A!精确地理解我们的需求)
1
2
3
4
5
6
你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容: 
分析需求:
{数据分析的需求或者目标}
原始数据:
{csv格式的原始数据,用,作为分隔符}
请根据以上内容,帮我生成数据分析结论和可视化图表代码

用户提问:

​ 3.控制输出格式(便于AI返回的内容能够更加方便地为我们所用)Prompt预设:

1
2
3
4
5
6
7
8
9
10
你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容:
分析需求:
{数据分析的需求或者目标}
原始数据:
{csv格式的原始数据,用,作为分隔符}
请根据这两部分内容,按照以下指定格式生成内容(此外不要输出任何多余的开头、结尾、注释)
【【【【【
{前端 Echarts V5 的 option 配置对象的json格式代码,合理地将数据进行可视化,不要生成任何多余的内容,比如注释}
【【【【【
{明确的数据分析结论、越详细越好,不要生成多余的注释}

用户输入:

生成的内容:

将上面的代码复制到Echarts执行:

image-20240414151547434

image-20240414151606252

​ 4.指定一个示例问答,one-shot或者few-shot