听说你把 ChatGPT 当成搜索引擎用了?

647次阅读  |  发布于1年以前

看到一些读者朋友把 ChatGPT 当成搜索引擎使用了,当然这样使用也没有问题,只是并不能发挥出 ChatGPT 背后大型语言模型(LLM)的优势,似乎有一种在“拿斧头切菜”的感觉。

其实 ChatGPT 正确的使用姿势需要结合着清晰、明确的 Prompt ,那 Prompt 又是什么?

Prompt 翻译为“提示词”,它通常是一段文本或问题,用于引导语言模型生成相应的文本回复或完成某项任务。

通常,当用户输入一个 Prompt 时,ChatGPT 会根据这个 Prompt 生成一段回复文本。

这个回复文本的内容和质量取决于模型的训练数据、模型的结构和参数、以及输入 Prompt 的质量和准确性

一个好的 Prompt 应该能够清晰地表达用户的意图和需求,同时包含足够的上下文信息,以便模型能够生成准确和有意义的回复。

一个好的 Prompt 至少要包含三个要素:

任务:明确而简洁地陈述 Prompt 要求模型生成的内容; 指令:模型在生成文本时应遵循的指令; 角色:模型在生成文本时应扮演的角色。

举个简单的例子:

Prompt1:请写一篇以环保为主题的文章;

Prompt2:你是一名语文教师,请写一篇以环保为主题 800 字左右的文章。

我们可以对比下这两个提示词哪一个更加完整,更能清晰地表达用户的意图和需求?

很明显,Prompt2 包含了上述三个要素:

任务:写文章; 指令:以环保为主题 800 字左右; 角色:语文教师。

除了上述三个要素之外,在设计 Prompt 时,我结合自己的经验总结了下面几点给你参考:

现在我们基于上面的几个要素来设计一个 Prompt , 让 ChatGPT 帮我们阅读一段代码:

你是一名非常有经验的程序员,对各种编程语言都非常熟练。我将提供给你一段代码,你需要在行内为这段代码添加注释,注释使用中文,并在最后解读这段代码,比如具体完成什么任务,思路是什么。如果代码有错误,你需要指出,并且给出改正的意见。回答中有包含代码的部分,请以代码段的格式显示。我的第一段代码如下:

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 回答:

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 的高效使用,你有什么心得不妨也分享一下吧。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8