提示技术系列——程序辅助语言模型
什么是提示技术?
提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”。
什么又是提示工程?
提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程的方法论,包括:
- 明确目标任务(如生成教学内容、问答、翻译);
- 设计提示结构(如指令、上下文、示例);
- 选择模型与参数(如温度、top_p);
- 验证与迭代(根据输出调整提示)。
其核心是“通过工程化方法控制大语言模型(LLM)的行为”。
概念
使用大语言模型读取自然语言问题并生成程序作为中间推理步骤的方法,被称为程序辅助语言模型(Program-Aided Language Models, PAL)。
概念图解
应用场景
- 数学与逻辑推理:解决复杂数学问题,如微积分、代数方程、几何证明等;
- 数据分析与处理:自动化数据分析,生成可视化图表,计算统计指标等;
- 编程辅助:为开发者生成代码片段,解决实际问题,如生成特定功能的 Python代码等;
- 教育与学习:帮助学生理解数学或编程问题,并通过代码提供具体步骤等;
- ……
案例实操
使用工具:扣子
实现方式:扣子工作流
完整工作流如下:
工作流节点配置信息:
开始节点:
生成 Python代码节点:
正则提取 Python代码节点:
里面的代码是 Python 语言,具体如下:
# 在这里,您可以通过 'args' 获取节点中的输入变量,并通过 'ret' 输出结果
# 'args' 已经被正确地注入到环境中
# 下面是一个示例,首先获取节点的全部输入参数params,其次获取其中参数名为'input'的值:
# params = args.params;
# input = params['input'];
# 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:
# ret: Output = { "name": '小明', "hobbies": ["看书", "旅游"] };async def main(args: Args) -> Output:params = args.paramscode_param = params['input']import recode_match = re.search(r"```python(.*?)```", code_param, re.DOTALL)if not code_match:raise ValueError("无法从模型输出中提取Python代码")generated_code = code_match.group(1).strip()# 构建输出对象ret: Output = {"key0": generated_code}return ret
CodeRunner插件节点:
结束节点:
测试输入:
小明有5个苹果,7个香蕉。吃了2个香蕉,又买了3个苹果,请问现在有几个水果?
运行结果:
大家若有编程基础的话,可以参考下面的代码案例来实现与体验不同场景下使用程序辅助语言模型提示。
代码实现程序辅助语言提示
技术栈:Python;LangChain
代码实现引用包导入:
pip install langchain_experimental==0.3.4;
pip install langchain_core==0.3.66;
pip install langchain_community==0.3.26;
具体代码:
import os
import refrom dotenv import load_dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_experimental.utilities.python import PythonREPL# 加载环境变量
load_dotenv()# 1. 初始化智谱AI模型(GLM-4)
zhipu_chat = ChatZhipuAI(model="glm-4",api_key=os.getenv("ZHIPUAI_API_KEY")
)# 2. 创建Python代码执行环境
python_repl = PythonREPL() # 实例化 REPL 工具# 3. 设计PAL提示模板
pal_prompt = ChatPromptTemplate.from_messages([("system","""你是一名数学教师助手,必须通过生成可执行的Python代码来解决问题。步骤:1. 先理解题目中的数学关系2. 生成能解决问题的Python代码3. 代码必须包含print输出最终答案4. 不要直接给出数学计算结果"""),("human", "题目:{question}"),]
)# 4. 创建PAL工作流
def solve_math_problem(question: str):# 生成Python代码code_generation = zhipu_chat.invoke(pal_prompt.format_messages(question=question))# 提取生成的代码(实际应用中需要更严谨的代码提取逻辑)code_match = re.search(r"```python(.*?)```", code_generation.content, re.DOTALL)if not code_match:raise ValueError("无法从模型输出中提取Python代码")generated_code = code_match.group(1).strip()# 执行代码try:result = python_repl.run(generated_code)except Exception as e:return {"error": f"代码执行失败: {str(e)}","generated_code": generated_code}return {"generated_code": generated_code,"execution_result": result}# 5. 测试案例
math_question = "小明有5个苹果,7个香蕉。吃了2个香蕉,又买了3个苹果,请问现在有几个水果?"print("正在处理中,请等待...")
solution = solve_math_problem(math_question)print("=== 生成的Python代码 ===")
print(solution["generated_code"])
print("\n=== 执行结果 ===")
if "error" in solution:print(f"错误: {solution['error']}")
else:print(solution["execution_result"])
总结与思考
自动推理并使用工具(ART),是让 LLM 自主规划任务并判断是否要调用工具,工具是已存在的(当工具是函数时,也就是代码),这与程序辅助语言模型(PAL)有明显的不同,具体的不同可以对比分析来看:
维度 | 自动推理并使用工具(ART) | 程序辅助语言模型(PAL) |
核心思想 | 利用大语言模型(LLM)自动生成推理步骤,并结合外部工具(如API、数据库)执行复杂任务。 | 让LLM生成可执行的程序代码作为中间推理步骤,调用解释器完成计算或逻辑推理。 |
是否依赖程序生成 | 否,但可调用现成程序/工具。 | 是,LLM直接生成可运行的程序代码(如Python脚本)。 |
是否调用外部工具 | 是,主动选择和调用外部工具(如搜索、计算器、数据库查询)。 | 否,仅生成程序,不涉及真实外部系统交互。 |
推理方式 | 基于自然语言的多步推理 + 工具调用链。 | 基于编程语言的符号推理,借助代码实现逻辑运算。 |
输出形式 | 自然语言推理路径 + 工具调用结果。 | 程序代码 + 解释器执行结果。 |
是否需要训练 | 不需微调模型,仅通过提示工程实现。 | 不需微调模型,仅通过提示工程实现。 |
是否支持动态交互 | 是,可根据中间结果调整后续推理路径。 | 是,根据问题结构动态生成不同代码段。 |
是否适合非结构化任务 | 是,适用于自然语言理解+工具调用结合的任务。 | 否,更适合结构化数学/逻辑任务。 |
资源消耗 | 高(需调用多个外部工具,可能有网络延迟)。 | 中等(仅需执行轻量级代码片段)。 |
可解释性 | 高,推理路径清晰,工具调用过程透明。 | 高,程序代码明确,执行流程可见。 |
典型指令示例 | “请一步步思考如何解决这个问题,必要时调用计算器或搜索最新数据。” | “请用Python代码解决以下数学题:...” |
一句话总结来说:
ART 更强调“推理+工具调用”的联动,适用于现实世界中需要访问外部数据与服务的复杂任务;而 PAL 更专注于“用程序代码辅助推理”,在结构化逻辑和数学问题上表现出色。
好了,到此。
提示技术系列,接下来分享:ReAct 框架等等
为了方便大家学习,这里给出专栏链接:https://blog.csdn.net/quf2zy/category_12995183.html
欢迎大家一起来学习与交流……