文章目录

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 管道组合
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐