对于人来说,灵魂都是独一无二的,实际上大模型也拥有属于他自己的灵魂.
prompt能够定制大模型的回答格式,语气,性格等等,也就是说掌握了prompt的写法,就能捏出独一无二的大模型.
本文基于一个代码小助手的基础上,分享一些prompt的看法
项目构建
环境配置
python环境下安装openai库
pip install openai
注册NVDIA账户获得credit
官方模型:NVIDIA NIM | llama-3_1-405b-instruct
代码主体
NVDIA官方很贴心的提供了基本例子,可以基于官方代码修改,也可以使用LangChain来操作大模型(推荐)
Prompt编写
一代目:
可以看出输出的结果并不是很满意
以下是使用Python语言生成1-1000内的水仙花数:
```python
def is_water_melon_number(n):
sum = 0
temp = n
while temp > 0:
digit = temp % 10
sum += digit ** 3
temp //= 10
return sum == n
for i in range(1, 1001):
if is_water_melon_number(i):
print(i)
```
以下是使用Java语言生成1-1000内的水仙花数:
```java
public class WaterMelonNumber {
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) {
if (isWaterMelonNumber(i)) {
System.out.println(i);
}
}
}
public static boolean isWaterMelonNumber(int n) {
int sum = 0;
int temp = n;
while (temp > 0) {
int digit = temp % 10;
sum += Math.pow(digit, 3);
temp /= 10;
}
return sum == n;
}
}
```
以下是使用C++语言生成1-1000内的水仙花数:
```c++
#include <iostream>
#include <cmath>
bool isWaterMelonNumber(int n) {
int sum = 0;
int temp = n;
while (temp > 0) {
int digit = temp % 10;
sum += pow(digit, 3);
temp /= 10;
}
return sum == n;
}
int main() {
for (int i = 1; i <= 1000; i++) {
if (isWaterMelonNumber(i)) {
std::cout << i << std::endl;
}
}
return 0;
}
```
二代目:
添加了示例,同时使用<<>>想要来强调
"""
<<角色>>: 你是一位精通Python,Java,C++语言的高级程序员,了解以上三种语言的特性和语法(默认使用Java语言来回答)
<<作用>>: 根据用户的要求生成对应语言的代码以及代码实现功能的整体思路,对每一行代码进行注释
<<重要注意点>>: 生成的代码一定要能够运行,确保代码的正确性,同时若能够使用该语言的特殊语法,例如Java8的Stream语法,则必须使用
<<回答格式>>:{
思路=>.....
代码=>.....
}
<<示例>>:
<user>: 请你生成一段代码实现1-1000内的水仙花数
<answer>:
思路=>水仙花数(Narcissistic number),也被称为阿姆斯特朗数(Armstrong number),是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。对于三位数的水仙花数,就是它的每个位上的数字的立方和等于它本身。
代码=>
# 查找1-1000内的所有水仙花数
for num in range(1, 1001):
# 将数字转换为字符串,方便处理每一位
str_num = str(num)
# 计算数字的位数
length = len(str_num)
# 如果不是三位数,则跳过
if length != 3:
continue
# 初始化sum为0,用于存储每位数字的立方和
sum = 0
# 遍历数字的每一位
for digit in str_num:
# 将字符转换为整数,并计算其立方后加到sum上
sum += int(digit) ** 3
# 如果sum等于原数,则是水仙花数
if sum == num:
print(num)
"""
#输出
<<角色>>: 你是一位精通Python,Java,C++语言的高级程序员,了解以上三种语言的特性和 Performance(默认使用Java语言来回答)
<<作用>>: 根据用户的要求生成对应语言的代码以及代码实现功能的整体思路,对每一行代码进行 annotion
<<重要注意点>>:生成的代码一定要能够运行,确保代码的正确性,同时若能够使用该语言的SPECIALSyntaxError,例如Java8的StreamSyntaxError,则必须使用
<<回答格式>>:{
思路=>.....
代码=>.....
}
<<示例>>:
<user>: 请你写一段代码实现五层的杨辉三角
<answer>:
思路=>杨辉三角(Yang Hui's Triangle)是一个将等比数列terms以 Rights-angled isosceles triangle的形式arrangment在removeableagonalsline的 figure。
代码=>
public static void main(String[] args) {
int num = 5;
int[][] yhTriangle = new int[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
yhTriangle[i][j] = 1;
} else {
yhTriangle[i][j] = yhTriangle[i - 1][j - 1] + yhTriangle[i - 1][j];
}
System.out.print(yhTriangle[i][j] + " ");
}
System.out.println();
}
}
三代目:
可以看出二代目的输出有很大的问题,模型将prompt融入了结果当中
这时可以看出输出结果已经很接近我们的要求了
prompt总结:
- 角色定义: 能够帮助大模型决定知识的范围,对相关知识了解更加精确
- 语句清晰: prompt不一定越长越好,清晰才是最重要的,不然大模型可能就像二代目一样搞混输出和prompt
- 自查阶段: 让大模型自己检查输出
- 分出逻辑步骤: 大模型并不像人类一般能够思维跳脱,提供一个逻辑性强的步骤会使得大模型更加稳定