文章首发于公众号:字节流动,未经作者(微信ID:Byte-Flow)允许,禁止转载
看到一些读者朋友把 ChatGPT 当成搜索引擎使用了,当然这样使用也没有问题,只是并不能发挥出 ChatGPT 背后大型语言模型(LLM)的优势,似乎有一种在"拿斧头切菜"的感觉。
其实 ChatGPT 正确的使用姿势需要结合着清晰、明确的 Prompt ,那 Prompt 又是什么?
Prompt 翻译为"提示词 ",它通常是一段文本或问题,用于引导语言模型生成相应的文本回复或完成某项任务。
通常,当用户输入一个 Prompt 时,ChatGPT 会根据这个 Prompt 生成一段回复文本。
这个回复文本的内容和质量取决于模型的训练数据、模型的结构和参数、以及输入 Prompt 的质量和准确性。
一个好的 Prompt 应该能够清晰地表达用户的意图和需求,同时包含足够的上下文信息,以便模型能够生成准确和有意义的回复。
一个好的 Prompt 至少要包含三个要素:
任务: 明确而简洁地陈述 Prompt 要求模型生成的内容;
指令: 模型在生成文本时应遵循的指令;
角色: 模型在生成文本时应扮演的角色。
举个简单的例子:
Prompt1:请写一篇以环保为主题的文章;
Prompt2:你是一名语文教师,请写一篇以环保为主题 800 字左右的文章。
我们可以对比下这两个提示词哪一个更加完整,更能清晰地表达用户的意图和需求?
很明显,Prompt2 包含了上述三个要素:
任务:写文章;
指令:以环保为主题 800 字左右;
角色:语文教师。
除了上述三个要素之外,在设计 Prompt 时,我结合自己的经验总结了下面几点给你参考:
-
提供足够的上下文:你提出这个问题的背景要尽量交代清楚,比如有一些读者在技术群里提问时完全不交代背景,还期望别人帮他解决问题;
-
同一个对话中要避免频繁切换角色:同一个对话保持上下文的一致性,比如你突然向一个程序员询问医疗方面的问题,很可能得不到最优的回答;
-
避免使使用激烈或具有强烈情感色彩的词语:使用激烈言辞的 Prompt 可能导致生成的文本更加情感化、强烈或争议性(官方解释)。
现在我们基于上面的几个要素来设计一个 Prompt , 让 ChatGPT 帮我们阅读一段代码:
你是一名非常有经验的程序员,对各种编程语言都非常熟练。我将提供给你一段代码,你需要在行内为这段代码添加注释,注释使用中文,并在最后解读这段代码,比如具体完成什么任务,思路是什么。如果代码有错误,你需要指出,并且给出改正的意见。回答中有包含代码的部分,请以代码段的格式显示。我的第一段代码如下:
c
void CoordSystemSample::UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio)
{
// Ensure angles are within the range [0, 359]
angleX = angleX % 360;
angleY = angleY % 360;
// Convert angles to radians
float radiansX = static_cast<float>(MATH_PI / 180.0f * angleX);
float radiansY = static_cast<float>(MATH_PI / 180.0f * angleY);
// Create a perspective projection matrix
glm::mat4 Projection = glm::perspective(45.0f, ratio, 0.1f, 100.f);
// Define the view matrix using glm::lookAt
glm::mat4 View = glm::lookAt(
glm::vec3(0, 0, 4), // Camera is at (0,0,1), in World Space
glm::vec3(0, 0, 0), // and looks at the origin
glm::vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down)
);
// Create a model matrix with scaling, rotation, and translation
glm::mat4 Model = glm::mat4(1.0f);
Model = glm::scale(Model, glm::vec3(m_ScaleX, m_ScaleY, 1.0f));
Model = glm::rotate(Model, radiansX, glm::vec3(1.0f, 0.0f, 0.0f));
Model = glm::rotate(Model, radiansY, glm::vec3(0.0f, 1.0f, 0.0f));
Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 0.0f));
// Calculate the final MVP matrix by multiplying Projection, View, and Model matrices
mvpMatrix = Projection * View * Model;
}
ChatGPT 回答:
c
void CoordSystemSample::UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio)
{
// 确保角度在 [0, 359] 范围内
angleX = angleX % 360;
angleY = angleY % 360;
// 将角度转换为弧度
float radiansX = static_cast<float>(MATH_PI / 180.0f * angleX);
float radiansY = static_cast<float>(MATH_PI / 180.0f * angleY);
// 创建透视投影矩阵
glm::mat4 Projection = glm::perspective(45.0f, ratio, 0.1f, 100.f);
// 使用 glm::lookAt 定义视图矩阵
glm::mat4 View = glm::lookAt(
glm::vec3(0, 0, 4), // 相机位置在 (0,0,1),在世界坐标系中
glm::vec3(0, 0, 0), // 朝向原点
glm::vec3(0, 1, 0) // 头部朝上 (设置为 0,-1,0 以倒置视图)
);
// 使用缩放、旋转和平移变换矩阵创建模型矩阵
glm::mat4 Model = glm::mat4(1.0f);
Model = glm::scale(Model, glm::vec3(m_ScaleX, m_ScaleY, 1.0f));
Model = glm::rotate(Model, radiansX, glm::vec3(1.0f, 0.0f, 0.0f));
Model = glm::rotate(Model, radiansY, glm::vec3(0.0f, 1.0f, 0.0f));
Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 0.0f));
// 将投影矩阵、视图矩阵和模型矩阵相乘,得到最终的 MVP 矩阵
mvpMatrix = Projection * View * Model;
}
解读:
这段代码定义了一个名为CoordSystemSample的类的成员函数 UpdateMVPMatrix,该函数用于更新一个传入的 glm::mat4 类型的矩阵mvpMatrix,以实现模型视图投影(MVP)矩阵的计算。
具体而言,函数接受三个参数:angleX 和 angleY 表示绕 X 轴和 Y 轴的旋转角度(以度为单位),ratio 表示投影矩阵的宽高比。
在函数内部,首先确保角度在 [0, 359] 的范围内,然后将角度转换为弧度。接着,创建透视投影矩阵Projection 和视图矩阵 View,其中视图矩阵使用 glm::lookAt 函数定义了一个相机位置在 (0,0,4),朝向原点,上方朝向 y 轴正方向的视图。
然后,通过组合缩放、旋转和平移的变换矩阵,构建了模型矩阵Model。最后,将投影矩阵、视图矩阵和模型矩阵相乘,得到最终的 MVP 矩阵,存储在传入的 mvpMatrix中。
从整体看,ChatGPT 这个回答水平已经可以了。
到这里,估计会有读者觉得自己设计 Prompt 竟然要考虑那么多细节,感觉有点麻烦。
没有问题,其实一些生活中常用的 Prompt 模版早已经有人设计好并共享出来了,直接复制粘贴拿过来用就好了。
推荐网站:prompts.chat/
网站搜集了很多种类的 Prompt 模版,支持在线编辑和复制,使用起来非常方便。
关于 ChatGPT 的高效使用,你有什么心得不妨也分享一下吧。
技术交流
技术交流群/职场困惑解答,可以添加我的微信:Byte-Flow