提示技术系列——主动提示

什么是提示技术?

        提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”

什么又是提示工程?

        提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程方法论,包括:

  • 明确目标任务(如生成教学内容、问答、翻译);
  • 设计提示结构(如指令、上下文、示例);
  • 选择模型与参数(如温度、top_p);
  • 验证与迭代(根据输出调整提示)。

其核心是“通过工程化方法控制大语言模型(LLM)的行为”


概念

        主动提示(Active-Prompt)是一种结合主动学习提示工程的技术。旨在通过动态选择高价值样本优化提示词,提高大模型在复杂任务中的表现。

由来背景之一:思维链(CoT)方法依赖于一组固定的人工注释范例。问题在于,这些范例可能不是不同任务的最有效示例。为了解决这个问题,就有了主动提示(Active-Prompt),以适应 LLMs到不同的任务特定示例提示。

核心机制:

  • 基于不确定性的主动采样;
  • 基于反馈的提示更新;
  • 多轮迭代优化。

概念图解

提示技术系列——主动提示_第1张图片

应用场景

  1. 教育领域:个性化学习路径优化等;
  2. 医疗健康:医学诊断辅助,健康管理交互等;
  3. 工业与智能制造:设备故障诊断,流程优化建议等;
  4. 多语言翻译增强(谷歌翻译通过Active-Prompt解决歧义短语的语境适配问题);
  5. 内容创作与文案生成(不同受众营销文案生成等);
  6. 数据分析与报告撰写(从大量数据中提取关键信息,自动生成结构化报告等);
  7. ……

案例实操

        扣子平台,工作流不支持嵌套循环,难以实现案例。考虑过只使用一个测试问题来实现,但是只有一个测试问题,又不能体现出不确定性问题的选择,为此该部分就不做演示了。

大家若有编程基础的话,可以参考下面的代码案例来实现与体验不同场景下使用主动提示。

代码实现主动提示

技术栈:Python;LangChain

代码引用包导入:

pip install langchain_core==0.3.66;
pip install langchain_community==0.3.26;

具体代码:

import os
from typing import List, Dict, Tuple

from dotenv import load_dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# 加载环境变量
load_dotenv()

# 1. 初始化智谱AI模型(GLM-4)
zhipu_chat = ChatZhipuAI(
    model="glm-4",
    temperature=0.7,  # 知识生成需更高随机性
    api_key=os.getenv("ZHIPUAI_API_KEY")
)


# 2. Active-Prompt核心流程
def active_prompt_optimization(
        questions: List[str],
        init_prompt: str,
        num_iterations: int = 2,
        num_samples: int = 3
) -> Tuple[str, List[Dict]]:
    """
    动态优化提示词流程:
    1. 生成多组答案并计算不确定性
    2. 选择高不确定性样本人工标注
    3. 将标注样本整合到提示词中
    """
    optimized_prompt = init_prompt
    annotation_log = []  # 记录标注历史

    for iteration in range(num_iterations):
        print(f"\n=== 第 {iteration + 1} 轮优化 ===")

        # 步骤1:计算每个问题的不确定性
        uncertainties = []
        for q in questions:
            answers = [
                zhipu_chat.invoke(f"{optimized_prompt}\n问题:{q}").content
                for _ in range(num_samples)
            ]
            uncertainty = len(set(answers)) / num_samples  # 简单不确定性度量
            uncertainties.append((q, uncertainty, answers))

        # 步骤2:选择Top 3高不确定性问题人工标注
        uncertain_questions = sorted(uncertainties, key=lambda x: -x[1])[:3]
        annotated_examples = []
        for q, _, answers in uncertain_questions:
            print(f"\n高不确定性问题(分歧度 {max(set(answers), key=answers.count)}/{len(answers)}):{q}")
            corrected_answer = input("请输入标注答案:")
            reasoning = input("请输入标注推理步骤:")

            annotated_examples.append(
                f"问题:{q}\n推理过程:{reasoning}\n答案:{corrected_answer}"
            )
            annotation_log.append({
                "iteration": iteration,
                "question": q,
                "model_answers": answers,
                "corrected_answer": corrected_answer
            })

        # 步骤3:更新提示词
        optimized_prompt = init_prompt + "\n\n标注示例:\n" + "\n---\n".join(annotated_examples)

    return optimized_prompt, annotation_log


# 3. 测试案例(数学推理任务)
if __name__ == "__main__":
    math_questions = [
        "小明买苹果,买5个剩10元,买7个差6元,小明有多少钱?",
        "一个数加它的一半等于30,这个数是多少?",
        "停车场原有6辆车,先离开2辆又新增5辆,最后剩多少车?"
    ]

    initial_prompt = """你是一名数学老师,请按以下规则解答:
        1. 分步推理并验证每一步
        2. 最终答案必须为纯数字
        3. 若发现矛盾需回溯检查"""

    print("开始Active-Prompt优化...")
    final_prompt, log = active_prompt_optimization(math_questions, initial_prompt)

    print("\n=== 最终优化的提示词 ===")
    print(final_prompt)

    # 验证优化效果
    test_chain = (
            RunnablePassthrough.assign(prompt=lambda x: initial_prompt)
            | ChatPromptTemplate.from_template("{prompt}\n问题:{question}")
            | zhipu_chat
            | StrOutputParser()
    )

    test_question = "一个班男生比女生多8人,全班共40人,女生有多少人?"
    print("\n测试优化效果:", test_chain.invoke({"question": test_question}))

总结与思考

        前文概念小节提到,主动提示由来的背景之一是为了解决思维链提示依赖于一组固定的人工注释范例可能存在的并给任何任务都可实现最有效示例的问题。

那么,它们两者有何区别呢?

维度

主动提示

链式思考提示

核心思想

根据上下文动态调整提示内容,以提升输出相关性和准确性。

引导模型逐步推理,展示从问题到答案的完整逻辑过程。

主要目标

提高模型输出的适应性、个性化与反馈响应能力。

增强模型对复杂任务的理解力与逻辑推理能力。

是否动态调整提示

是,根据输入或反馈实时优化提示。

否,通常为静态提示结构。

是否强调推理过程

否,关注输出结果的适配性。

是,要求模型展示中间推理步骤。

是否支持个性化定制

是,可根据用户特征定制不同提示。

否,更注重通用逻辑推理。

输出可解释性

一般较强(依赖提示设计)

极强(展示完整推理路径)

自动化程度

高(需反馈机制支持)

中等(需人工设计推理模板)

资源消耗

中等至高(取决于反馈频率)

低至中等(单次调用即可)

是否需要反馈机制

是,依赖反馈进行提示优化

否,通常不涉及反馈循环

是否支持多轮对话优化

是,能根据历史对话不断优化提示

否,主要用于单次推理任务

        我们日常使用 LLM Chat 更适合使用主动提示这种思想和它们“沟通”,通过多轮对话,让LLM不断地能获得更详细、更丰富的信息,也就是更好的 prompt,从而更好地回复我们的问题。

好了,到此。


提示技术系列,接下来分享:方向性刺激提示等等

为了方便大家学习,这里给出专栏链接:https://blog.csdn.net/quf2zy/category_12995183.html

欢迎大家一起来学习与交流……

你可能感兴趣的:(提示技术,人工智能,prompt,python,langchain)