看到一些读者朋友把 ChatGPT 当成搜索引擎使用了,当然这样使用也没有问题,只是并不能发挥出 ChatGPT 背后大型语言模型(LLM)的优势,似乎有一种在“拿斧头切菜”的感觉。
其实 ChatGPT 正确的使用姿势需要结合着清晰、明确的 Prompt ,那 Prompt 又是什么?
Prompt 翻译为“提示词”,它通常是一段文本或问题,用于引导语言模型生成相应的文本回复或完成某项任务。
通常,当用户输入一个 Prompt 时,ChatGPT 会根据这个 Prompt 生成一段回复文本。
这个回复文本的内容和质量取决于模型的训练数据、模型的结构和参数、以及输入 Prompt 的质量和准确性。
一个好的 Prompt 应该能够清晰地表达用户的意图和需求,同时包含足够的上下文信息,以便模型能够生成准确和有意义的回复。
一个好的 Prompt 至少要包含三个要素:
任务:明确而简洁地陈述 Prompt 要求模型生成的内容; 指令:模型在生成文本时应遵循的指令; 角色:模型在生成文本时应扮演的角色。
举个简单的例子:
Prompt1:请写一篇以环保为主题的文章;
Prompt2:你是一名语文教师,请写一篇以环保为主题 800 字左右的文章。
我们可以对比下这两个提示词哪一个更加完整,更能清晰地表达用户的意图和需求?
很明显,Prompt2 包含了上述三个要素:
任务:写文章; 指令:以环保为主题 800 字左右; 角色:语文教师。
除了上述三个要素之外,在设计 Prompt 时,我结合自己的经验总结了下面几点给你参考:
- 提供足够的上下文:你提出这个问题的背景要尽量交代清楚,比如有一些读者在技术群里提问时完全不交代背景,还期望别人帮他解决问题;
- 同一个对话中要避免频繁切换角色:同一个对话保持上下文的一致性,比如你突然向一个程序员询问医疗方面的问题,很可能得不到最优的回答;
- 避免使使用激烈或具有强烈情感色彩的词语:使用激烈言辞的 Prompt 可能导致生成的文本更加情感化、强烈或争议性(官方解释)。
现在我们基于上面的几个要素来设计一个 Prompt , 让 ChatGPT 帮我们阅读一段代码:
代码语言:javascript复制你是一名非常有经验的程序员,对各种编程语言都非常熟练。我将提供给你一段代码,你需要在行内为这段代码添加注释,注释使用中文,并在最后解读这段代码,比如具体完成什么任务,思路是什么。如果代码有错误,你需要指出,并且给出改正的意见。回答中有包含代码的部分,请以代码段的格式显示。我的第一段代码如下:
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 回答:
代码语言:javascript复制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 模版早已经有人设计好并共享出来了,直接复制粘贴拿过来用就好了。
推荐网站:https://prompts.chat/
网站搜集了很多种类的 Prompt 模版,支持在线编辑和复制,使用起来非常方便。
关于 ChatGPT 的高效使用,你有什么心得不妨也分享一下吧。
-- END --