写好 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 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

  public static object GetPropertyValue<TObject>(this PropertyInfo propertyInfo, TObject obj) where TObject : class
    {
        if (propertyInfo == null)
        {
            LoggerHandler.OnLogError("GetPropertyValue", new ArgumentNullException("propertyInfo null"));
            throw new ArgumentNullException("propertyInfo");
        }

        ParameterExpression parameterExpression = Expression.Parameter(typeof(TObject));
        return Expression.Lambda<Func<TObject, object>>(Expression.Convert(Expression.Property(Expression.Convert(parameterExpression, obj.GetType()), propertyInfo), typeof(object)), new ParameterExpression[1] { parameterExpression }).Compile()(obj);
    }
 public static void SetPropertyValue<TObject, TValue>(this PropertyInfo propertyInfo, TObject obj, TValue value)
    {
        if (propertyInfo == null)
        {
            LoggerHandler.OnLogError("SetPropertyValue", new ArgumentNullException("Property null"));
            throw new ArgumentNullException("propertyInfo");
        }

        if (propertyInfo.GetSetMethod() == null)
        {
            LoggerHandler.OnLogError("SetPropertyValue", new InvalidOperationException("Property does not have a setter"));
            throw new InvalidOperationException("Property does not have a setter");
        }

        ParameterExpression parameterExpression = Expression.Parameter(typeof(TObject));
        MemberExpression left = Expression.Property(Expression.Convert(parameterExpression, obj.GetType()), propertyInfo);
        ParameterExpression parameterExpression2 = Expression.Parameter(typeof(TValue));
        UnaryExpression right = Expression.Convert(parameterExpression2, propertyInfo.PropertyType);
        Expression.Lambda<Action<TObject, TValue>>(Expression.Assign(left, right), new ParameterExpression[2] { parameterExpression, parameterExpression2 }).Compile()(obj, value);
    }