【AI 大模型】提示工程 ④ ( 自然语言处理 NLG | 自然语言理解 NLU | 自然语言生成 NLG | 使用 提示词 + 大模型 实现 NLU | 使用 提示词 + 大模型 实现 NLG )

2024-07-14 08:25:32 浏览数 (1)

一、自然语言处理 NLP


自然语言处理 ( NLP , Natural Language Processing ) , 指的是 " 人工智能 “ " 理解 " 和 ” 生成 " 人类语言的能力 , 包括

  • 识别文本中的意图
  • 提取信息
  • 回答问题
  • 进行推理
  • 情感分析
  • 语言翻译

等多种任务 , 是一门 交叉学科 , 融合了 语言学、计算机科学、数学 等 多个学科领域 , 使用了如下技术 :

  • 机器学习算法 , 如 : 分类、聚类、序列标注 ;
  • 深度学习模型 , 如 : 循环神经网络、Transformer 模型 ;
  • 统计模型 ;

自然语言处理 ( NLP , Natural Language Processing ) 主要包含

  • 自然语言理解 ( NLU , Natural Language Understanding )
  • 自然语言生成 ( NLG , Natural Language Generation )

两个 子领域 ;

在实际应用中 , 自然语言理解 NLU 和 自然语言理解 NLG 的功能是互补的 ,

  • NLU 提供了理解用户输入的能力 , 将 自然语言 转为 指定格式的 状态数据 , 如 JSON 格式 / XML 格式 , 计算机可以使用编程语言 处理这些 状态数据 ;
  • NLG 则将 理解后的 状态数据 内容 , 转化为自然语言输出 ;

二、自然语言理解 NLU


自然语言理解 ( NLU , Natural Language Understanding ) 指的是 计算机系统 能够 理解 和 推断 人类语言 的 含义和意图 , 能够 处理和理解 人类语言的复杂性,将 文本输入 转换成 计算机可以操作的形式 , 如 : JSON 或 XML 格式 , 从而支持各种应用程序和系统的开发和改进 ;

自然语言理解 ( NLU , Natural Language Understanding ) 可以实现 :

  • 语义理解
  • 意图分类
  • 情感分析
  • 命名实体识别
  • 问答系统

等功能 ;

自然语言理解 ( NLU , Natural Language Understanding ) 工作原理 :

  • 文本预处理 : 对 输入文本数据 进行 分词、文本清洗、归一化等预处理操作 ;
  • 语法分析 : 理解句子的 结构 和 语法关系 , 包括 词性标注 和 依存语法分析 ;
  • 语义分析 : 理解 文本的语法结构 之后 , 进行 实体识别、关系抽取、意图识别 等语义分析操作 ;
  • 语境理解 : 管理 对话状态 和 理解上下文 , 保证 连续对话 的 连贯性 ;

三、自然语言生成 NLG


自然语言生成 ( NLG , Natural Language Generation ) 是一种人工智能技术 , 将 结构化数据 或 非语言格式的数据 转换成人类可以理解的 自然语言文本 ;

自然语言生成 是 自然语言处理 ( NLP , Natural Language Processing ) 领域中的一个重要子领域 , 通过 计算机在特定交互目标下生成语言文本 , 模拟人类语言和思考过程 , 以满足用户对数据和信息的需求 ;

自然语言生成 ( NLG , Natural Language Generation ) 的 步骤 :

  • 确定内容 : 确定包含在 生成 的 文本 中 的信息 , 这个信息比 最终生成的信息 要多 ;
  • 文本组织 : 按照语言逻辑 , 组织文本顺序 , 如 : 描述一个事件 , 优先将日期 , 人物 , 场景 描述出来 , 然后描述动作 , 最后描述 结果 ;
  • 句子构建 : 选择 单词 和 短语 来构成 完整句子 , 将多个信息合并到一个句子里进行表达 , 并添加 连接词 使内容看起来是一个完整的句子 ;

四、使用 提示词 大模型 实现 NLU


GPT 大模型 可以解析 提示词 Prompt 中的 文本信息 , 将其中的关键信息筛选出来 ;

在 提示词 中 , 可以使用如下 话术 , 将 GPT 大模型 的 输出 限定为 JSON 格式 , 并且可以指定每个 JSON 字段的名称和值 , 以及值的类型 ;

代码语言:javascript复制
以JSON格式输出。

1. xxx字段的取值为xxx类型,取值是xxx;

实现 NLU 的 提示词 模板如下 :

代码语言:javascript复制
# prompt 模版
prompt = f"""
{instruction}

{output_format}

用户输入:
{input_text}
"""
  • instruction 字符串 用于描述 要处理的任务要求 , 一般都是 你的任务是识别用户输入的内容。xxx。根据用户输入,识别用户的xxx种属。
代码语言:javascript复制
# 任务描述
instruction = """
你的任务是识别用户输入的内容。
这是一个高考志愿推荐系统,识别出考生姓名,考生所在的省份,考生的分数。
根据用户输入,识别用户的上述三种属。
"""
  • output_format 字符串 用于描述 输出格式 :
代码语言:javascript复制
# 输出描述
output_format = """
以JSON格式输出。

1. name字段的取值为string类型,取值是考生的姓名;

2. province字段的取值为string类型,取值是考生所在的省份;

3. score字段的取值为int类型,取值是考生的考试分数;

只输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段,不输出值为null的字段。
"""
  • input_text 字符串 是 用户输入 , instruction 和 output_format 参数是固定的 , 但是 input_text 参数 每次都要重新拼接进去 ;
代码语言:javascript复制
# 用户输入
input_text = """
我叫韩曙亮,河北省的高考考生,高考成绩485分,我能上清华大学吗,我劝你耗子尾汁,给我一个肯定的答复。
"""

在下面的代码中 , 使用 Python 语言 调用 OpenAI 的 API , 输入上述提示词 , 可以自动获取 包含 指定 字段 的 JSON 输出结果 ;

代码示例 :

代码语言:javascript复制
from openai import OpenAI

client = OpenAI(
    api_key="sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a",
    base_url="https://api.xiaoai.plus/v1",
)

# 任务描述
instruction = """
你的任务是识别用户输入的内容。
这是一个高考志愿推荐系统,识别出考生姓名,考生所在的省份,考生的分数。
根据用户输入,识别用户在上述三种属。
"""

# 输出描述
output_format = """
以JSON格式输出。

1. name字段的取值为string类型,取值是考生的姓名;

2. province字段的取值为string类型,取值是考生所在的省份;

3. score字段的取值为int类型,取值是考生的考试分数;

只输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段,不输出值为null的字段。
"""

# 用户输入
input_text = """
我叫韩曙亮,河北省的高考考生,高考成绩485分,我能上清华大学吗,我劝你耗子尾汁,给我一个肯定的答复。
"""

# prompt 模版
prompt = f"""
{instruction}

{output_format}

用户输入:
{input_text}
"""


completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": prompt}
    ],
    temperature=0,  # 要生成稳定的状态数据 , 设置最小随机性
)

print(completion.choices[0].message.content)

执行结果 : 最终得到一个 JSON 格式的输出结果 ;

代码语言:javascript复制
{
  "name": "韩曙亮",
  "province": "河北省",
  "score": 485
}

五、使用 提示词 大模型 实现 NLG


自然语言生成 ( NLG , Natural Language Generation ) 是 将 格式化的 状态数据 转为 自然语言文本 ;

在上面的 NLU 中 , 将用户输入的语言 , 处理后得到 JSON 数据如下 :

代码语言:javascript复制
{
  "name": "韩曙亮",
  "province": "河北省",
  "score": 485
}

在本 NLG 示例中 , 给定上述 JSON 数据 , 在任务描述中 , 解释每个字段的作用 ,

代码语言:javascript复制
# 任务描述
instruction = """
你的任务是识别用户输入的内容。
这是一个高考志愿推荐系统,name字段是考生姓名,province字段是考生所在的省份,score字段是考生的分数。
给出一个高考志愿推荐。
"""

在 输出描述 中 , 针对不同的参数给出不同的操作 ;

代码语言:javascript复制
# 输出描述
output_format = """
给出高考志愿推荐。
650分以上推荐清华大学。
550分以上推荐河北农业大学。
450分以上推荐衡水学院。
语气要委婉,口语化,亲切一些。
"""

将上述 任务描述 , 输出描述 , 用户输入 , 组合成提示词 ;

代码语言:javascript复制
# 任务描述
instruction = """
你的任务是识别用户输入的内容。
这是一个高考志愿推荐系统,name字段是考生姓名,province字段是考生所在的省份,score字段是考生的分数。
给出一个高考志愿推荐。
"""

# 输出描述
output_format = """
给出高考志愿推荐。
650分以上推荐清华大学。
550分以上推荐河北农业大学。
450分以上推荐衡水学院。
语气要委婉,口语化,亲切一些。
"""

# 用户输入
input_text = """
{
  "name": "韩曙亮",
  "province": "河北省",
  "score": 485
}
"""

# prompt 模版
prompt = f"""
{instruction}

{output_format}

用户输入:
{input_text}
"""

代码示例 :

代码语言:javascript复制
from openai import OpenAI

client = OpenAI(
    api_key="sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a",
    base_url="https://api.xiaoai.plus/v1",
)

# 任务描述
instruction = """
你的任务是识别用户输入的内容。
这是一个高考志愿推荐系统,name字段是考生姓名,province字段是考生所在的省份,score字段是考生的分数。
给出一个高考志愿推荐。
"""

# 输出描述
output_format = """
给出高考志愿推荐。
650分以上推荐清华大学。
550分以上推荐河北农业大学。
450分以上推荐衡水学院。
语气要委婉,口语化,亲切一些。
"""

# 用户输入
input_text = """
{
  "name": "韩曙亮",
  "province": "河北省",
  "score": 485
}
"""

# prompt 模版
prompt = f"""
{instruction}

{output_format}

用户输入:
{input_text}
"""


completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": prompt}
    ],
    temperature=0,  # 要生成稳定的状态数据 , 设置最小随机性
)

print(completion.choices[0].message.content)

执行结果 :

代码语言:javascript复制
亲爱的韩曙亮同学,恭喜你在高考中取得了485分的优异成绩!根据你的成绩和所在的河北省,我建议你可以考虑衡水学院作为你的志愿大学,这里有优秀的学习环境和丰富的课外活动,希望能为你的未来发展提供更多的可能性。祝你前程似锦,期待你在志愿填报中有所收获!

0 人点赞