提示词模板之构造方法
📅 2026/7/14 20:27:12
👁️ 阅读次数
📝 编程学习
前言
本文为 LangChain 提示词模板配套学习笔记,覆盖两种主流提示模板、四种模型调用方式、占位符复用技巧,附带适配阿里云通义千问兼容 OpenAI 接口完整可运行代码,可直接复制运行。
前置环境准备
1. 安装依赖
在项目虚拟环境执行:
pip install langchain langchain-openai python-dotenv2. 配置密钥
项目根目录新建.env文件,填入阿里云 DashScope Key:
env
aliQwen-api=sk-你的阿里云百炼dashscope密钥一、提示词模板基础分类
日常开发中提示词模板分为 4 类,95% 业务场景只用前两种,后两种仅做了解即可:
- PromptTemplate:纯文本大模型专用模板,字符串拼接填充变量
- ChatPromptTemplate:对话大模型(通义千问 / GPT)专用,区分 system/human/ai 角色消息
- FewShotPromptTemplate:少样本学习模板,低频使用
- PipelinePrompt:管道组合模板,仅了解概念
ChatPromptTemplate 构造入参格式
实例化传入messages支持 3 种格式:
- 元组列表:
[(role, content)] - 字典列表:
[{"role": "xxx", "content": "xxx"}] - Message 对象列表:SystemMessage / HumanMessage / AIMessage
二、ChatPromptTemplate 基础构造示例(核心代码)
文件:ChatPromptTemplate_Constructor.py
""" ChatPromptTemplate 构造方法实例化 messages 支持元组列表、字典列表、Message对象列表三种格式 适配阿里云通义千问 qwen-plus 兼容OpenAI接口 """ from langchain_core.prompts import ChatPromptTemplate import os from langchain.chat_models import init_chat_model from dotenv import load_dotenv # 1. 加载.env环境变量 load_dotenv() api_key = os.getenv("aliQwen-api") if not api_key: raise ValueError("密钥读取失败,请检查项目根目录.env文件配置") # 2. 使用构造方法创建对话提示模板,内置占位符 chatPromptTemplate = ChatPromptTemplate( [ ("system", "你是一个AI开发工程师,你的名字是{name}。"), ("human", "你能帮我做什么?"), ("ai", "我能开发很多{thing}。"), ("human", "{user_input}"), ] ) # 3. 填充占位符,生成对话消息列表 prompt_messages = chatPromptTemplate.format_messages( name="小谷AI", thing="AI应用", user_input="7 + 5等于多少" ) print("===== 格式化后的对话消息列表 =====") print(prompt_messages) # 4. 初始化阿里云通义千问大模型 llm = init_chat_model( model="qwen-plus", model_provider="openai", api_key=api_key, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) # 5. 同步调用 invoke(基础单次问答) print("\n===== invoke 同步调用结果 =====") result = llm.invoke(prompt_messages) print("完整返回对象:", result) print("模型输出内容:", result.content)三、四种模型调用方式完整代码示例
新建文件llm_call_demo.py,包含同步、流式、批处理、异步全部写法
import asyncio import os from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain_core.prompts import ChatPromptTemplate # 加载环境变量 load_dotenv() api_key = os.getenv("aliQwen-api") llm = init_chat_model( model="qwen-plus", model_provider="openai", api_key=api_key, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) # 通用对话模板 template = ChatPromptTemplate([ ("system", "你是简洁回答助手,简短输出答案"), ("human", "{question}") ]) # ---------------------- 1. 同步调用 invoke(日常首选) ---------------------- def sync_invoke_demo(): print("===== 1. 同步调用 invoke =====") msg = template.format_messages(question="9 * 8等于多少") res = llm.invoke(msg) print(res.content, "\n") # ---------------------- 2. 流式调用 stream(实时打字效果) ---------------------- def stream_demo(): print("===== 2. 流式调用 stream =====") msg = template.format_messages(question="介绍LangChain") stream = llm.stream(msg) for chunk in stream: print(chunk.content, end="", flush=True) print("\n\n") # ---------------------- 3. 批处理 batch(批量多问题一次性请求) ---------------------- def batch_demo(): print("===== 3. 批处理 batch =====") input_list = [ {"question": "1+1等于几"}, {"question": "Python是什么"}, {"question": "通义千问是什么模型"} ] batch_msgs = [template.format_messages(**item) for item in input_list] batch_res = llm.batch(batch_msgs) for idx, res in enumerate(batch_res): print(f"问题{idx+1}输出:{res.content}") print("\n") # ---------------------- 4. 异步调用 ainvoke(高并发非阻塞) ---------------------- async def async_invoke_demo(): print("===== 4. 异步调用 ainvoke =====") msg = template.format_messages(question="什么是异步调用") res = await llm.ainvoke(msg) print(res.content) # 程序入口 if __name__ == "__main__": sync_invoke_demo() stream_demo() batch_demo() # 异步函数需用asyncio.run执行 asyncio.run(async_invoke_demo())四、PromptTemplate 纯文本模板补充示例
文件:text_prompt_demo.py
from langchain_core.prompts import PromptTemplate import os from dotenv import load_dotenv from langchain.chat_models import init_chat_model load_dotenv() api_key = os.getenv("aliQwen-api") # 1. 纯文本模板创建 text_template = PromptTemplate( template="请以{role}身份,解答问题:{query}", input_variables=["role", "query"] ) # 2. format 生成完整文本字符串 prompt_str = text_template.format(role="Python工程师", query="什么是装饰器") print("纯文本提示词:", prompt_str, "\n") # 3. 模型调用 llm = init_chat_model( model="qwen-plus", model_provider="openai", api_key=api_key, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) res = llm.invoke(prompt_str) print("模型回答:", res.content)五、partial 局部填充模板示例(固定部分变量)
from langchain_core.prompts import ChatPromptTemplate # 原始模板 base_template = ChatPromptTemplate([ ("system", "你是{job},名字叫{name}"), ("human", "回答我的问题:{user_q}") ]) # partial 预填充固定参数job、name,只需传入user_q fixed_template = base_template.partial(job="AI开发工程师", name="小谷AI") # 仅传入剩余变量 msg = fixed_template.format_messages(user_q="解释提示词模板") print(msg)六、踩坑解决方案(代码报错修复)
- Missing credentials 密钥缺失
- 必须导入
dotenv并执行load_dotenv(); .env文件名称不能写错,变量名和代码os.getenv()保持一致;
- 必须导入
- ChatPromptTemplate 调用模型报错
- 对话模板必须使用
format_messages(),不能用format();
- 对话模板必须使用
- EnvForge 插件读取.env 异常
- 关闭其他.env 相关插件,清除 IDE 缓存重启;
- 接口访问失败
- base_url 固定为阿里云兼容地址:
https://dashscope.aliyuncs.com/compatible-mode/v1,model 填写qwen-plus。
- base_url 固定为阿里云兼容地址:
七、调用方式选择总结
- 简单单次问答:
invoke同步调用 - 前端实时打字输出:
stream流式调用 - 批量多条问题处理:
batch批处理 - 高并发服务、防止主线程阻塞:
ainvoke异步调用
编程学习
技术分享
实战经验