前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ChatGPT学习之旅 (3) Prompt进阶用法

ChatGPT学习之旅 (3) Prompt进阶用法

作者头像
Edison Zhou
发布2024-06-01 08:05:11
1090
发布2024-06-01 08:05:11
举报
文章被收录于专栏:EdisonTalkEdisonTalk

复习Prompt用法

还记得上一篇学到的黄金公式吗?

这里,我们先来复习一下,假如我们想要ChatGPT来扮演一个【私人营养师】为我们给出好的建议,编写一个Prompt如下:

“你是一个私人营养师,帮我推荐一些美味的食谱,要求包括营养有益健康但又简单不费时的食物,适合像我这样即忙碌又考虑成本的人,整体菜肴既健康又经济。”

调教AI之奖惩指令

如果你希望你的孩子达到你理想的行为标准,那么你就需要对他进行教育,如果孩子做得好,我们就需要及时的夸奖,鼓励他变得更好。而如果孩子做得差劲,老是一本正经的胡说八道,我们也需要对他进行一定的惩罚,让孩子知道你的底线。

同理,面对现阶段的AI模型也一样,通过不断地 惩罚 和 奖励反复纠正,AI模型就会形成一套我们所期望的行为标准

这里,我们再以【旅游攻略】为例,看看如何通过奖惩指令来反复纠正ChatGPT的回答,因为ChatGPT可能会一直一本正经的胡说八道。

第一轮:初步回答

Prompt:

假如你是一名资深导游,我想要去四川省西昌市旅游,预算四千元,旅行人数4大1小,行程3天,乘坐高铁从成都出发,请帮我生成一份3天的旅游攻略。 请注意:1.我不太喜欢行程太紧凑,我喜欢休闲游;2.我喜欢品尝当地的美食,也请推荐一些美食;3.推荐景点时请附上各个景点的价格以及链接;

AI回答:

第二轮:指出错误的地方

第三轮:给予肯定,但要求重新生成第二天计划

总之,感觉大语言模型还是需要把小红书之类的学习一遍,才能更好地生成旅游攻略啊,哈哈。

Prompt生成SQL查询

之前我们说到,在基于文本的生成式AI应用场景中,编码是一个应用比较多的领域。

这里,我们以【创建SQL查询】为例演示一下,看看如何使用Prompt来帮我们声场一个SQL查询。

Prompt1:

你是一个DBA,维护了一张数据表 customers, columns = [CustomerId, FirstName, LastName, Company, Address, City, State, Country, PostalCode],请创建一个SQL查询,以获得所有在弗洛里达州名为Jason的顾客。

Prompt2:

请在上面的SQL查询基础上,按照顾客的Id进行升序排序。

最终生成的SQL查询:

代码语言:javascript
复制
SELECT * FROM customers 
WHERE State = 'Florida' AND FirstName = 'Jason' 
ORDER BY CustomerId ASC;

Prompt生成C#示例代码

之前在开发过程中,会使用百度谷歌等搜索引擎搜索很多的示例代码,在AIGC时代,我们也可以先问问ChatGPT,看看它是否能帮我们生成一个高质量的示例代码供我们参考使用。

Prompt1:

代码语言:javascript
复制
你是一个上位机开发工程师,请帮我们生成一个使用C#读写西门子S7-1500 PLC数据块数据的示例代码。
要求:
- 使用OPC UA协议和PLC进行通信;
- PLC数据块编号为DB10;
- 使用Windows Form进行数据展现;

AI回答:

代码语言:javascript
复制
当使用C#与西门子S7-1500 PLC进行通信时,可以使用OPC UA协议来实现。以下是一个示例代码,展示了如何使用OPC UA读写PLC数据块数据,并使用Windows Forms进行数据展示:

首先,确保已安装NuGet包 "Opc.UaFx",它提供了OPC UA功能。

csharp
using Opc.UaFx;
using Opc.UaFx.Client;

// 创建一个Windows Forms应用程序,例如Form1类

public partial class Form1 : Form
{
    private OpcClient opcClient;
    
    public Form1()
    {
        InitializeComponent();
        
        // 创建OPC UA客户端
        opcClient = new OpcClient();
        
        // 连接到PLC
        opcClient.Connect("opc.tcp://PLC_IP_Address:4840"); // 替换为实际的PLC IP地址
        
        // 订阅数据变化事件
        opcClient.SubscribeDataChange("ns=2;s=DB10", HandleDataChange); // 替换为实际的PLC数据块编号
        
        // 启动循环读取数据
        ReadDataPeriodically();
    }
    
    private void HandleDataChange(object sender, OpcDataChangeReceivedEventArgs e)
    {
        // 处理数据变化事件,更新UI展示
        Invoke(new Action(() =>
        {
            textBox1.Text = e.Item.Value.ToString(); // 替换为实际的UI元素,用于展示PLC数据
        }));
    }
    
    private void ReadDataPeriodically()
    {
        Task.Run(async () =>
        {
            while (true)
            {
                var result = await opcClient.ReadNodeAsync("ns=2;s=DB10.Tag1"); // 替换为实际的PLC数据项路径
                
                if (result.Status.IsGood)
                {
                    // 处理读取的数据
                    
                    // 更新UI展示
                    Invoke(new Action(() =>
                    {
                        textBox2.Text = result.Value.ToString(); // 替换为实际的UI元素,用于展示PLC数据
                    }));
                }
                
                await Task.Delay(1000); // 每秒读取一次数据,根据实际需求调整间隔时间
            }
        });
    }
    
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        
        // 断开与PLC的连接并释放资源
        opcClient.Disconnect();
        opcClient.Dispose();
    }
}
请注意,在上述代码中,需要将"opc.tcp://PLC_IP_Address:4840"替换为实际的PLC IP地址,并将"ns=2;s=DB10"替换为实际的PLC数据块编号。另外,根据需要,可以添加更多的UI元素来展示更多的PLC数据。

这只是一个简单的示例代码,你可以根据自己的需求进行扩展和定制。希望对你有帮助!如果有任何问题,请随时提问。

Prompt2:

很好,如果我不想使用OPC UA协议,而是使用ModBus协议,请重新给我一个示例代码。

AI回答:

代码语言:javascript
复制
如果你想使用Modbus协议与西门子S7-1500 PLC进行通信,可以使用第三方库NModbus来实现。以下是一个示例代码,展示了如何使用C#读写PLC数据块数据并使用Windows Forms进行数据展示:

首先,确保已安装NuGet包 "NModbus",它提供了Modbus功能。

csharp
using System;
using System.Windows.Forms;
using Modbus.Device;

// 创建一个Windows Forms应用程序,例如Form1类

public partial class Form1 : Form
{
    private ModbusIpMaster modbusMaster;
    
    public Form1()
    {
        InitializeComponent();
        
        // 创建Modbus主站
        var ipAddress = "PLC_IP_Address"; // 替换为实际的PLC IP地址
        var port = 502; // Modbus默认端口号
        modbusMaster = ModbusIpMaster.CreateIp(new System.Net.IPAddress(System.Net.IPAddress.Parse(ipAddress).GetAddressBytes()), port);
        
        // 启动循环读取数据
        ReadDataPeriodically();
    }
    
    private void ReadDataPeriodically()
    {
        Task.Run(async () =>
        {
            while (true)
            {
                try
                {
                    ushort startAddress = 0; // 起始地址,根据实际需求修改
                    ushort numRegisters = 1; // 读取的寄存器数量,根据实际需求修改
                    
                    // 读取数据
                    var data = modbusMaster.ReadHoldingRegisters(startAddress, numRegisters);
                    
                    // 处理读取的数据
                    
                    // 更新UI展示
                    Invoke(new Action(() =>
                    {
                        textBox1.Text = data[0].ToString(); // 替换为实际的UI元素,用于展示PLC数据
                    }));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error reading data: " + ex.Message);
                }
                
                await Task.Delay(1000); // 每秒读取一次数据,根据实际需求调整间隔时间
            }
        });
    }
    
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        
        // 关闭Modbus连接并释放资源
        modbusMaster.Dispose();
    }
}
请注意,在上述代码中,需要将"PLC_IP_Address"替换为实际的PLC IP地址。另外,根据需要,可以添加更多的UI元素来展示更多的PLC数据。

这只是一个简单的示例代码,你可以根据自己的需求进行扩展和定制。希望对你有帮助!如果有任何问题,请随时提问。

通过多轮与ChatGPT的对话,你就可以得到一个较好的示例代码了,可能比查多篇技术博客来得快一丢丢。

Prompt双语混打

对于ChatGPT而言,使用中文获取的效果目前来看是不及英文的,可能也就是70分 和 95分的差距,这几乎是业界的共识。不过,你永远可以相信AI的进化速度。在此基础之上,最优解是情景式混用。加入有助于ChatGPT理解的英文关键词,可以辅助AI理解,生成更准确的回答。

比如,以【编写Python脚本】为例,只要Prompt中提到”不要”两个字,回答几乎是“不要”什么偏来什么。相比之下,使用“Do not”的结果就会稳一些。

Prompt1:

你是一个Python开发者,请帮我写一个python程序,将twitter的<post>抓取后保存为pdf,并将pdf保存到Mac桌面。注意:不要使用Twitter API

Prompt2:

你是一个Python开发者,请帮我写一个python程序,将twitter的<post>抓取后保存为pdf,并将pdf保存到Mac桌面。注意:Do not use Twitter API

可以看到,使用“Do not”的效果比“不要”就要准确得多了。

小结

本篇,我们了解了ChatGPT中的奖惩指令,对于AI回答我们可以通过Prompt对其回答进行反馈,以便AI修正回答完善回答。此外,我们还了解了使用Prompt来获取SQL查询 和 C#示例代码的案例,以及情景式混用中英双语Prompt达到更好的效果,相信会对你有所帮助。

下一篇,我们了解下Prompt的高级使用方式,比如叠加一些实用符号,Markdown介入,生成答案带图片显示等等。

工具

我所在公司的办公电脑可以使用ChatGPT,但是在家里没有OpenAI账号,本人又比较懒就没法用。不过,刚好我的朋友梁总公司YoYoSoft就开发了这样一个国内直连的ChatGPT代理产品方案,因此我就使用它来作为ChatGPT作为本系列文章的演示。

AIChatXhttps://ai.yoyocms.com/client/chat

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 调教AI之奖惩指令
  • Prompt生成SQL查询
  • Prompt生成C#示例代码
  • Prompt双语混打
  • 小结
  • 工具
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档