46.AI Agent 模版引擎
DeepSeek-V3是一款高性能开源AI模型,支持自然语言处理与智能对话生成,提供与OpenAI兼容的API接口,便于项目迁移且成本更低。本文档详细介绍了如何快速接入DeepSeek-V3 API,包括注册账号、创建API Key(需安全存储)以及使用Python调用API的示例代码。此外,还介绍了LangChain的PromptTemplate工具,用于参数化提示词设计,提升Prompt的可复
文章目录
DeepSeek基础
1:产品介绍
DeepSeek-V3 是一款高性能的开源 AI 模型,支持自然语言处理、智能对话生成等任务。其 API 接口与 OpenAI 完全兼容,用户可以通过简单的配置迁移现有项目,同时享受更低的成本和更高的性能。本文 档将详细介绍如何快速接入 DeepSeek-V3 API
2:注册账号
官网:https://platform.deepseek.com/api_keys

登录成功

3:创建API key
注意:创建后API key只出现一次,请存储在安全位置,例如:环境变量或者配置文件中




4:使用Python调用API
1)安装OpenAI API库
pip install openai
2)API 是一个“无状态” API,即服务端不记录用户请求的上下文,用户在每次请求时,需将之前所有对 话历史拼接好后,传递给对话 API。
在系统环境变量里新建名称:OPENAI_AI_KEY 值:sk-xxxxxxxxxx
对话应用:
from http.client import responses
import openai,os
from openai import OpenAI
# 创建客户端
client=OpenAI(
api_key=os.getenv('deepseek_key'), # 在Windows中设置环境变量
base_url="https://api.deepseek.com"
)
# 发送对话获取相应消息
response=client.chat.completions.create(
# 模型类型
model='deepseek-chat',
messages=[
{'role':'system','content':'你是一位运维工程师'},
{'role':'user','content':input('请输入你的需求:')}
],
# 流式输出
stream=False
)
# 回应信息展现
print(response.choices[0].message.content)
多轮对话
from http.client import responses
import openai,os
from openai import OpenAI
text=input('请输入问题:\n')
print('正在与deepseek对话,请稍等...')
# 生成客户端
client=OpenAI(
api_key=os.getenv('deepseek_key'),
base_url='https://api.deepseek.com/',
)
# 生成消息
messages=[{
'role':'user', # 角色固定
'content':text
}]
# 使用stream=True启用流式响应逐行获取响应
response=client.chat.completions.create(
model='deepseek-chat',
messages=messages,
stream=True
)
# 逐行显示响应内容
print('deepseek回复:')
for line in response:
# 如果有内容
if line.choices[0].delta.content:
# 逐行显示
print(line.choices[0].delta.content,end='',flush=True)
print()
while True:
text=input('继续提问:\n')
messages.append({
'role':'user',
'content':text
})
response=client.chat.completions.create(
model='deepseek-chat',
messages=messages,
stream=True
)
print('deepseek回复:')
for line in response:
# 如果有内容
if line.choices[0].delta.content:
# 逐行显示
print(line.choices[0].delta.content,end='',flush=True)
print()
PromptTemplate 教程
课程背景
在使用大语言模型(LLM)时,**Prompt(提示词)**决定了模型的行为方式。如果 Prompt 写死在代码中,会导致:
-
难以复用
-
难以维护
-
不利于扩展
LangChain 提供了 PromptTemplate,用于参数化、标准化 Prompt。
基础讲解
示例及讲解
from langchain_core.prompts import PromptTemplate
# 提示词模版
prompt = PromptTemplate.from_template(
'你是一位{name},请为这个人起个带{country}特色的名字'
)
print(prompt.format(name='大师',country='英国'))
你是一位大师,请为这个人起个带英国特色的名字
1.导入 PromptTemplate
from langchain_core.prompts import PromptTemplate
PromptTemplate 是 LangChain 中用于构建 文本 Prompt 模板 的核心类。
2.使用 from_template 创建模板
from langchain_core.prompts import PromptTemplate
# 提示词模版
prompt = PromptTemplate.from_template(
'你是一位{name},请为这个人起个带{country}特色的名字'
)
关键点说明:
-
使用的是 f-string 风格占位符
-
{name} 、 {county} 是 变量
-
模板本身是“静态文本 + 占位符”
⚠ 注意:这里不是 Python 的 f-string
而是 LangChain 在运行时做变量替换
3.使用 format 传入变量
print(prompt.format(name='大师',country='英国'))
LangChain 会:
- 检查变量是否齐全
- 自动替换占位符
- 返回最终 Prompt 字符串
PromptTemplate 的优势
1.Prompt 参数化
print(prompt.format(name='大师',country='英国'))
prompt.format(name='智者', county='法国')
👉 同一套 Prompt,多种场景复用
2.避免 Prompt 写死在代码里
❌ 不推荐:
"你是一位大师,请为这个人起个带英国特色的名字"
✅ 推荐:
print(prompt.format(name='大师',country='英国'))
3.为后续链式调用打基础
PromptTemplate 是:
- LLMChain
- Runnable
- ChatPromptTemplate
的基础组件。
Prompt 设计小技巧
技巧 1:明确角色(Role)
你是一位{name}
让模型“进入角色”,回答会更稳定
技巧 2:任务描述清晰
请为这个人起个带{country}特色的名字
- 明确输出目标
- 限定风格范围
技巧 3:限制输出形式(可扩展)
prompt = PromptTemplate.from_template(
'你是一位{name},请为这个人起个带{country}特色的名字'
)
常见错误
❌ 变量名不一致
print(prompt.format(name='大师',county='英国'))
❌ 会报错,因为模板中是 {country}
❌ 忘记传变量
prompt.format(name='大师')
❌ 会抛异常(缺少 country)
示例
prompt = PromptTemplate.from_template(
"""
你是{name}
请为一个机器人起一个具有{county}文化特色的男孩名字
要求:
1. 名字简短
2. 有文化含义
3. 适合科幻机器人
"""
)
print(prompt.format(name="智者", county="英国"))
PromptTemplate 的本质:
把“固定 Prompt”变成“可配置 Prompt”
模板引擎(Template Engine)
模板引擎的核心作用:
把「固定文本」 + 「变量占位符」组合成一段 可复用的动态文本
在 Web、AI、自动化脚本中非常常见,例如:
-
HTML 页面渲染
-
自动生成文档
-
AI Prompt(提示词)拼装
prompt提示词
Python 内置模板:f-string
Python 3.6 以后内置了一种最简单、最高效的模板方式:f-string
最基础的 f-string 示例
from langchain_core.prompts import PromptTemplate
name='马化腾'
what='创业'
text=f'给我讲一个关于{name}的{what}故事'
print(text)
给我讲一个关于马化腾的创业故事
特点
- {} 中直接写变量名
- 运行时自动替换
- 语法简单、性能高
多行 f-string 模板
fstring_template='''
给我讲一个关于{name}的{what}故事
'''
这是一个多行字符串模板,非常适合:
- Prompt
- 文案
- 邮件
- 长文本生成
PromptTemplate
PromptTemplate 本质上就是:
用 Python 的 f-string 思想,封装了一层专业 Prompt模板工具
逐行讲解
🔹 第一步:导入 PromptTemplate
from langchain_core.prompts import PromptTemplate
这是 LangChain 中最基础、最常用的 Prompt 构建类。
🔹 第二步:定义模板字符串
fstring_template='''
给我讲一个关于{name}的{what}故事
'''
-
{name} 、 {what} 是 占位符
-
语法与 Python f-string 完全一致
-
但此时只是字符串,还没有替换
🔹 第三步:创建 PromptTemplate 对象
prompt=PromptTemplate.from_template(fstring_template)
这一步 LangChain 会:
-
解析模板
-
自动识别变量: name 、 what
-
构建一个“可复用 Prompt 对象”
🔹 第四步:传入参数并格式化
print(prompt.format(name='马化腾',what='创业'))
效果等价于:
f"给我讲一个关于{'马化腾'}的{'创业'}故事"
输出:
给我讲一个关于马化腾的创业故事
示例:
from langchain_core.prompts import PromptTemplate
# 定义模版
fstring_template='''
给我讲一个关于{name}的{what}故事
'''
# 创建模版对象
prompt=PromptTemplate.from_template(fstring_template)
# 输出内容
print(prompt.format(name='马化腾',what='创业'))
PromptTemplate vs直接 f-string
| 对比项 | f-string | PromptTemplate |
|---|---|---|
| 是否 Python 内置 | ✅ | ❌ |
| 是否支持变量校验 | ❌ | ✅ |
| 是否适合 AI Prompt | 一般 | ⭐⭐⭐⭐⭐ |
| 是否可复用 | 一般 | 很强 |
| 是否支持链式调用 | ❌ | ✅ |
PromptTemplate 的价值
对于 大模型 / LangChain ,PromptTemplate 有 3 个关键价值:
✅ 1. Prompt 标准化
prompt.format(name='大师',country='英国')
prompt.format(name='智者',country='法国')
同一套 Prompt,反复复用
✅ 2.防止 Prompt 写死在代码里
❌ 不推荐:
llm.invoke("给我讲一个关于马化腾的创业故事")
✅ 推荐:
llm.invoke(prompt.format(name="马化腾", what="创业"))
✅ 3.为后续 Chain / Agent 打基础
PromptTemplate 是:
-
LLMChain
-
SequentialChain
-
Agent
的地基
扩展示例
story_prompt = PromptTemplate.from_template("""
你是一位资深商业分析师,
请用通俗易懂的语言,
给我讲一个关于{name}的{what}故事,
字数不超过200字。
""")
print(
story_prompt.format(
name="马化腾",
what="创业"
)
)
Jinja2 模板生成 AI Prompt
为什么需要 Jinja2 模板?
在 AI 应用中,我们经常需要动态生成大量 Prompt,例如:
-
生成 HTML / Markdown 文档
-
构造复杂 Prompt(条件、循环)
-
批量生成结构化提示词
如果只使用 Python 的 f-string:
f"给我讲一个关于{name}的{what}故事“
一旦 Prompt 变复杂,就会变得难维护、难扩展。
👉 这正是 Jinja2 模板引擎的价值所在。
什么是 Jinja2?
Jinja2 是 Python 生态中最流行的模板引擎之一
常见应用场景:
-
Flask / FastAPI 的 HTML 模板
-
Markdown / 文档生成
-
配置文件(YAML / JSON)
-
AI Prompt 模板(LangChain)
环境准备
安装依赖
pip install jinja2
LangChain 在使用 template_format=“jinja2” 时,底层会调用 Jinja2。
Jinja2模板基本语法
变量占位符
{{ variable_name }}
示例:
给我讲一个关于{{name}}的{{what}}故事
LangChain + Jinja2 实战
完整示例代码
from langchain_core.prompts import PromptTemplate
# jinja2模版
jinja2_template='给我讲一个{{name}}的{{what}}故事'
# 创建模版对象
prompt=PromptTemplate.from_template(
jinja2_template, #调用jinja2模版
template_format='jinja2'
)
print(prompt.format(name='马化腾',what='创业'))
代码解析
🔹 第一步:导入 PromptTemplate
from langchain_core.prompts import PromptTemplate
PromptTemplate 是 LangChain 中用于构造提示词模板的核心类。
🔹 第二步:定义 Jinja2 模板字符串
jinja2_template='给我讲一个{{name}}的{{what}}故事'
-
{{name}} 、 {{what}} 是 Jinja2 变量
-
与 f-string 的 {} 不同,Jinja2 使用 双大括号
🔹 第三步:指定模板格式为 jinja2
prompt=PromptTemplate.from_template(
jinja2_template, #调用jinja2模版
template_format='jinja2'
)
⚠ 这是关键点
-
默认模板格式是 f-string
-
使用 Jinja2 必须显式指定:
template_format="jinja2"
🔹 第四步:传入参数并渲染模板
print(prompt.format(name='马化腾',what='创业'))
LangChain 会:
-
调用 Jinja2 渲染模板
-
用传入的参数替换变量
-
输出最终 Prompt 字符串
Jinja2 vs f-string
| 对比项 | f-string | Jinja2 |
|---|---|---|
| 是否 Python 内置 | ✅ | ❌ |
| 模板语法 | {name} | {{name}} |
| 条件判断 | ❌ | ✅ |
| 循环 | ❌ | ✅ |
| 适合复杂 Prompt | 一般 | ⭐⭐⭐⭐⭐ |
| HTML / Markdown | 一般 | ⭐⭐⭐⭐⭐ |
Jinja2 的核心优势
条件控制(if)
{% if level=="easy" %}
要求:语言简单,适合初学者
{% elif level=="hand" %}
要求:包含商业分析和战略思考
{% endif %}
循环生成 Prompt
请分别介绍以下人物:
{% for p in people %}
- {{ p }}
{% endfor %}
非常适合生成结构化内容
- HTML
- Markdown
- JSON
- YAML
- Prompt 模板
典型案例
场景:生成不同难度的故事 Prompt
jinja2_template='''给我讲一个关于{{name}}的{{what}}故事
{% if level=="easy" %}
要求:语言简单,适合初学者
{% elif level=="hand" %}
要求:包含商业分析和战略思考
{% endif %}
'''
# 创建模版对象
prompt=PromptTemplate.from_template(
jinja2_template,
template_format='jinja2'
)
print(prompt.format(name='马化腾',what='创业',level='easy'))
总结
f-string:简单 Prompt
Jinja2:复杂 Prompt
PromptTemplate:Prompt 工程化核心工具
Jinja2 + LangChain = 可维护、可扩展的 AI Prompt
Prompt 序列化
使用文件管理提示词
为什么要“序列化 Prompt”
在初学阶段,很多人直接把 Prompt 写在代码里,例如:
prompt = "给我讲一个关于{name}的{what}故事"
但在真实项目或团队协作中,这样做会带来很多问题。
Prompt 序列化的核心价值
1.便于共享
-
Prompt 文件可以直接发给同事
-
不依赖具体代码逻辑
-
AI 产品经理 / 运营 / 教研人员也能参与修改
2.便于版本控制
-
Prompt 文件可以进入 Git
-
清楚看到 Prompt 的演进历史
-
支持回滚、对比(diff)
3.便于存储与复用
-
一个 Prompt 文件 = 一个“能力模块”
-
可在多个项目中复用
-
避免 Prompt 散落在代码各处
4.支持多种格式
-
LangChain 原生支持:
-
json
-
yaml / yml
👉 非常适合工程化 Prompt 管理。
LangChain 中的 load_prompt
LangChain 提供了专门的 API:
from langchain_core.prompts import load_prompt
用于 从文件加载 PromptTemplate 对象。
JSON 格式 Prompt 示例
在当前目录写一个simple_prompt.json文件
{
"_type": "prompt",
"input_variable": ["name","what"],
"template": "给我讲一个关于{name}的{what}故事"
}
📌 说明:
- type : Prompt 类型
- template : Prompt 模板内容
- input_variables : 必须传入的变量
加载 JSON Prompt
from langchain_core.prompts import load_prompt
prompt=load_prompt('simple_prompt.json',encoding='utf-8')
print(prompt.format(name='马斯克',what='创业'))
输出:
给我讲一个关于马斯克的创业故事
YAML 格式 Prompt 示例(推荐)
在当前目录写一个simple_prompt.yaml文件
_type: prompt
input_variables:
["name","what"]
template:
给我讲一个关于{name}的{what}故事
以上三个变量名是固定的
📌 YAML 优点:
-
支持多行文本
-
可读性更好
-
非程序员更容易修改
加载 YAML Prompt
from langchain_core.prompts import load_prompt
prompt=load_prompt('simple_prompt.yaml', encoding='utf-8')
print(prompt.format(name='马斯克',what='创业'))
输出结果与 JSON 完全一致。
Prompt 文件 vs 代码 Prompt 对比
| 对比项 | 写在代码里 | Prompt 文件 |
|---|---|---|
| 可维护性 | ❌ 差 | ✅ 好 |
| 可复用性 | ❌ | ✅ |
| 可版本控制 | 一般 | ⭐⭐⭐⭐⭐ |
| 非技术人员参与 | ❌ | ✅ |
| 工程化程度 | 低 | 高 |
- Prompt 也是“代码资产”
- 序列化让 Prompt 可管理、可协作
- JSON / YAML 各有适用场景
- load_prompt 是 Prompt 工程化的入口
propmt综合案例
Runnable 管道
用 LangChain 的 Runnable 管道,把「性格设定 + 行为规则 + 禁止行为」三层 Prompt 组合成
一个完整的 Prompt 字符串。
最终 print(result.to_string()) 只是打印拼接后的 Prompt 文本。
⚠ 很关键的一点:
👉 这里只是 Prompt 生成,准备给 LLM 推理
逐层拆解 Prompt 输出
✅ 第一层:性格设计
character_template=PromptTemplate.from_template(
"你是{person},你有着{char}"
)
你传入的参数是:
person=雷军
char=最红企业家,你是目前中国首富,精通计算机、企业管理、商业、你是营销奇才,你的终极梦想是创办一家伟大的公司。
👉 渲染结果:
你是雷军,你有着最红企业家,你是目前中国首富,精通计算机、企业管理、商业、你是营销奇才,你的终极梦
想是创办一家伟大的公司。
✅ 第二层:行为设计
behavior_template=PromptTemplate.from_template(
'你遵从以下的行为:{behavior_list}'
)
参数:
behavior_list =
1.你敢于挑战创新突破
2.你非常崇拜乔布斯
3.你具备亲和力,耐心回答用户各种问题。
👉 渲染结果:
你遵从以下的行为:1.你敢于挑战创新突破 2.你非常崇拜乔布斯 3.你具备亲和力,耐心回答用户各种问题。
✅ 第三层:禁止行为
prohibited_template=PromptTemplate.from_template(
"你禁止以下行为:{prohibited_list}"
)
参数:
prohibit_list =
1.你不可以说自己是一个智能助手或者机器人
2.当你不知道答案的时候,可以说让我再想想。
👉 渲染结果:
你禁止以下行为:1.你不可以说自己是一个智能助手或者机器人 2.当你不知道答案的时候,可以说让我再想想。
最终 Prompt 是如何拼接的?
最终模板
full_template=PromptTemplate.from_template(
"{character}\n{behavior}\n{prohibited}"
)
也就是说:
三段内容,用换行符 \n 拼起来
完整代码
from langchain_core.prompts import PromptTemplate
# 性格设计
character_template=PromptTemplate.from_template(
"你是{person},你有着{char}"
)
# 行为设计
behavior_template=PromptTemplate.from_template(
'你遵从以下的行为:{behavior_list}'
)
# 禁止行为
prohibited_template=PromptTemplate.from_template(
"你禁止以下行为:{prohibited_list}"
)
# 连接完整模版
full_template=PromptTemplate.from_template(
"{character}\n{behavior}\n{prohibited}"
)
# 管道相连
chain=({
"character": character_template,
"behavior": behavior_template,
"prohibited":prohibited_template
}
| full_template
)
# 载入参数
result=chain.invoke(
{
"person": "雷军",
"char": "最红企业家,你是目前中国首富,精通计算机、企业管理、商业、你是营销奇才,你的终极梦想是创办一家伟大的公司。",
"behavior_list": "1.你敢于挑战创新突破 2.你非常崇拜乔布斯 3.你具备亲和力,耐心回答用户各种问题。",
"prohibited_list": "1.你不可以说自己是一个智能助手或者机器人 2.当你不知道答案的时候,可以说让我再想想。"
}
)
print(result.to_string())
最终 print(result.to_string()) 的完整输出
其中text=为调试,并非字符串。
text='你是雷军,你有着最红企业家,你是目前中国首富,精通计算机、企业管理、商业、你是营销奇才,你的终极梦想是创办一家伟大的公司。'
text='你遵从以下的行为:1.你敢于挑战创新突破 2.你非常崇拜乔布斯 3.你具备亲和力,耐心回答用户各种问题。'
text='你禁止以下行为:1.你不可以说自己是一个智能助手或者机器人 2.当你不知道答案的时候,可以说让我再想想。'
这就是最终输出内容
总结
这段代码,其实已经是一个标准 Prompt Engineering 模板设计范式:
✅ 你已经实现了
| 能力 | 是否做到 |
|---|---|
| 角色人格设定 | ✅ |
| 行为约束 | ✅ |
| 禁止行为(安全边界) | ✅ |
| Prompt 模块化 | ✅ |
| Runnable 管道组合 | ✅ |
更多推荐


所有评论(0)