写好 Prompt(提示词)对于和语言模型进行有效交互至关重要,因为它能直接影响我理解你的意图和生成回复的质量。以下是一些编写高质量 Prompt 的技巧,可以根据不同的需求进行调整:

1. 清晰明确你的目标:

  • 你想让我做什么? 是生成文本、总结内容、回答问题,还是进行创意写作? 明确你的目标是第一步,例如:

    • 明确目标: 我想让你写一篇关于人工智能的文章。
    • 不明确目标: 我想聊聊科技。

2. 使用具体的指令:

  • 避免模糊不清的词语。 使用动词来表达你想要的行为,例如:

    • 具体指令: “请 总结 这篇文章的主要观点”
    • 模糊指令: “说说这篇文章”
  • 提供必要的上下文信息。 如果你需要我理解背景,请描述它。例如:

    • 提供上下文: “假设你是一位历史学家,请 分析 二战爆发的原因。”
    • 没有上下文: “分析原因。”
  • 指定格式或风格。如果你有特定的输出格式要求,请告诉我。 例如:

    • 指定格式: “请 以列表的形式 列出解决气候变化的有效措施。”
    • 未指定格式: “告诉我气候变化的解决方案。”
  • 明确限制条件。 例如,字数、特定观点或者禁止使用的内容等等。

    • 限制条件: “写一篇 不超过 200 字 的短故事,不要涉及 暴力内容。”
    • 没有限制: “写一个故事。”

3. 运用关键词:

  • 使用与主题相关的关键词, 这能帮助我快速聚焦到你的需求。

    • 关键词: “请 解释 区块链工作原理。”
    • 无关键词: “说一下一些科技的东西。”

4. 逐步细化:

  • 从简单的问题开始,然后逐步引入更复杂的需求。 这有助于我更好地理解你的意图,也方便你检查我的回复是否符合你的期望。例如:

    • 逐步细化:

      1. “简述人工智能的历史。”
      2. “在此基础上,详细描述一下深度学习的兴起。”
      3. “现在,请分析深度学习对社会的影响。”
  • 一次只提一个问题或任务。 避免在一个 Prompt 中塞入过多的内容,这样会让我困惑。

5. 尝试不同的 Prompt 技巧:

  • 示例 - 启发学习(Few-Shot): 提供一些输入和对应的理想输出示例,让我学习并模仿你期望的风格。

    • 示例:输入: 猫在树上。 输出: 一只猫正坐在高高的树枝上,好奇地注视着周围的世界。 现在,请用类似的风格描述 ‘鸟儿飞过天空’ ”
  • 角色扮演: 给我一个特定的角色,让我以这个角度进行思考和回答。

    • 角色扮演: “请 扮演一位专业的营养师,为我制定一份健康的早餐计划。”
  • 反问(负面指令): 说明你 不希望 我做什么,有时候这会比直接说明希望做什么更有效。

    • 反问: “请 不要使用 太过于专业的术语来解释量子力学。”

6. 迭代精进:

  • 不断评估我的响应并调整你的 Prompt。 如果我的回复不尽如人意,请尝试修改你的 Prompt,直到得到满意的结果。
  • 大胆尝试不同的提问方式, 看看哪种方式最适合你。

举一些例子:

  • 简单信息获取:

    • 好 Prompt: “查询关于太阳系的行星列表。”
    • 差 Prompt: “告诉我一些关于太空的信息。”
  • 创意写作:

    • 好 Prompt: “请用第一人称写一个关于在巴黎旅行的短篇小说,主题是‘意外的相遇’, 风格轻松幽默,字数在 300 字左右。”
    • 差 Prompt: “写一个故事。”
  • 问题解答:

    • 好 Prompt: “解释一下什么是机器学习,用通俗易懂的语言,并举例说明生活中的应用场景。”
    • 差 Prompt: “机器学习?”

总结来说,好的 Prompt 应该具备以下特点:

  • 清晰明确
  • 具体指令
  • 适当的上下文
  • 有效关键词

通过不断练习和调整,就能更好地掌握编写 Prompt 的技巧,最大程度发挥AI的能力。

import snap7
import snap7.common
import snap7.error
import snap7.util
from ctypes import byref


client = snap7.client.Client()
client.set_param(snap7.type.Parameter.PDURequest,960)
client.connect('192.168.1.100', 0, 0)


def write_area_bit(client:snap7.client.Client,area:snap7.type.Area,db_number:int,start:int,bit_index:int,value:bool):
    _start_address=start*8+bit_index
    _type=snap7.type.WordLen.Byte.ctype
    data=bytearray([0])
    if value:
        data=bytearray([1])
    cdata=(_type*1).from_buffer_copy(data)
    #MK M
    #MB DB
    #PE I
    #PA Q
    #res=client.as_write_area(area,db_number,_start_address,1,snap7.type.WordLen.Bit,cdata)
    res=client._lib.Cli_WriteArea(client._s7_client,area,db_number,_start_address,1,snap7.type.WordLen.Bit,byref(cdata))    
    snap7.error.check_error(res,context="client")
    return res

def write_db_bit(db_number:int,start:int,bit_index:int,value:bool):
    return write_area_bit(client,snap7.type.Area.DB,db_number,start,bit_index,value)

def write_m_bit(start:int,bit_index:int,value:bool):
    return write_area_bit(client,snap7.type.Area.MK,0,start,bit_index,value)

def write_i_bit(start:int,bit_index:int,value:bool):
    return write_area_bit(client,snap7.type.Area.PE,0,start,bit_index,value)

def write_q_bit(start:int,bit_index:int,value:bool):
    return write_area_bit(client,snap7.type.Area.PA,0,start,bit_index,value)

import logging
import logging.handlers
#region 日志处理

class ColoredFormatter(logging.Formatter):
    # 定义颜色代码
    COLORS = {
        'DEBUG': '\033[94m',  # 蓝色
        'INFO': '\033[92m',   # 绿色
        'WARNING': '\033[93m',  # 黄色
        'ERROR': '\033[91m',   # 红色
        'CRITICAL': '\033[41m', # 红色背景
    }
    RESET = '\033[0m'  # 重置颜色

    def format(self, record):
        # 根据日志级别选择颜色
        color = self.COLORS.get(record.levelname, self.RESET)
        return color + super().format(record) + self.RESET        
        #return  super().format(record).replace(record.getMessage(), f"{color}{record.getMessage()}{self.RESET}")    

def looger_handler_file():
    import os
    import datetime
    import re
    # 创建文件目录
    log_dir='./logs'
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    # 创建文件日志
    log_file=os.path.join(log_dir,'main.log')
    
    handler_file=logging.handlers.TimedRotatingFileHandler(
        filename=log_file,
        when='midnight',    # 间隔一天        
        interval=1,         # 每天切割
        backupCount=200,    # 至少6个月的日志
        encoding='utf-8'
        )
    handler_file.suffix='%Y-%m-%d.log'
    handler_file.extMatch=re.compile(r'^\d{4}-\d{2}-\d{2}\.log$')
    handler_file.setFormatter(logging.Formatter(fmt='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S'))
    return handler_file
def looger_handler_console():
    # 创建控制台日志
    handler_console=logging.StreamHandler()
    handler_console.setFormatter(ColoredFormatter(fmt='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S'))
    return handler_console

logger=logging.getLogger()
logger.addHandler(looger_handler_console())
logger.addHandler(looger_handler_file())
logger.setLevel(logging.DEBUG)
#endregion

PLC常见的数据类型对应表:

PLC数据类型C#数据类型备注
BOOLbool布尔类型,表示真或假
BYTEbyte8位无符号整数
WORDushort16位无符号整数
DWORDuint32位无符号整数
LWORDulong64位无符号整数
SINTsbyte8位有符号整数
INTshort16位有符号整数
DINTint32位有符号整数
LINTlong64位有符号整数
USINTbyte8位无符号整数,与BYTE相同
UINTushort16位无符号整数,与WORD相同
UDINTuint32位无符号整数,与DWORD相同
ULINTulong64位无符号整数,与LWORD相同
REALfloat32位浮点数
LREALdouble64位浮点数
STRINGstring字符串
TIMETimeSpan表示时间间隔
DATEDateTime表示日期
TIME_OF_DAYDateTime表示一天中的时间
DATE_AND_TIMEDateTime表示日期和时间

ffmpeg -i out.wav -f s16le -ar 8000 -ac 1 -acodec pcm_s16le out.pcm
ffmpeg -i a.mp3 -f s16le -ar 8000 -ac 1 -acodec pcm_s16le a.pcm
参数说明
-ia.mp3源文件
-fs16le强制文件格式
-ar8000采样率
-ac1单声道
-acodecpcm_s16le编码器

在使用海康摄像头输出音频,选择pcm文件进行播放,如果摄像头解码器是G711 对应的pcm文件是采样率是8000,编码器 pcm_s16le