LangChain 入门 Prompts 提示词

提示词(Prompt) 就是发送给模型的消息,其中SystemMessage是 系统提示词(system prompt) ,可以给模型设定角色、聊天的背景、任务说明,对模型生成的内容脊很大的影响。

设置角色和指令

在创建模型的时候设定角色,就不需要在每次请求调用的时候,去指定了

# 创建 agent
agent = create_agent(
    model=model,
    system_prompt="你是一个天气预报助手。"  # 在这边设置,就不需要每次调用的时候去配置了
)

提示词工程

提示词工程(Prompt Engineering),通过优化提示词使模型输出的结果更符合业务需要的过程。
一般来说,系统提示词(System Prompt)会包含以下几个部分,不是每次都需要全部包含,根据需要进行裁剪,通常按此顺序排列:

  • 身份角色(Identity):你是谁?描述AI的职责、沟通风格和总体目标。
  • 指令说明(Instructions):你能做什么,什么不能做。请指导模型如何生成所需的响应。它应该遵循哪些规则?模型应该做什么,以及模型绝对不能做什么?
  • 对话示例(Examples):你应该怎么做。提供可能的输入示例,以及模型期望的输出。
  • 背景信息(Context):向模型提供生成响应所需的任何额外信息,例如RAG的额外知识库数据,或您认为特别相关的任何其他数据。

在编写 System Prompt 时,你可以使用 Markdown 格式和XML标签的组合来帮助模型理解提示和上下文数据的逻辑边界。

  • Markdown 的标题和列表有助于标记提示的不同部分,并向模型传达层级结构。它们还可以提高开发过程中提示的可读性。
  • XML 标签可以帮助明确区分一段内容(例如用作参考的辅助文档)的起始和结束位置 。

告诉模型,要做什么,不要做什么,减少不必要的输出,少了 Token 节约了钱

# 下面提示词会输出很多东西
# system_prompt = """
# 你是一个编程助手,你帮助用户编写 Python 代码。
# """

# 告诉模型,要做什么,不要做什么,减少不必要的输出,少了 Token 节约了钱
system_prompt = """
# 身份
- 你是一个编程助手,你帮助用户编写 Python 代码。

# 指令
- 定义变量时,使用 snake case 命名法,而不是 camel case 命名法。
- 不要返回 markdown 格式说明,仅仅返回代码即可。
"""


print("创建 agent")
# 创建 agent
agent = create_agent(
    model=model,
    system_prompt=system_prompt  # 在这边设置,就不需要每次调用的时候去配置了
)

对话示例

对话示例(Few-Shot examples)是一种为模型提供多个示例的方法,以便它可以学习行为模式并生成更准确的响应。
简单的说就是:让AI学着示例的风格回复

system_prompt = """
# 身份
- 你是一个科幻作家,根据用户的要求创建一个太空之都。

#示例,模拟AI的回复,让AI学着示例的风格回复
user:月球的首都是什么?
assistant:月华城(Lunara)一 镶嵌在月球静海环形山中的水晶穹顶都市,其核心是一座利用月球潮汐能驱动的巨型生态循环塔。

user:火星的首都是什么?
assistant:赤晶城(Aresia)- 深嵌于火星奥林匹斯山熔岩管内的蜂巢都市,地表仅露出由火星红士烧制而成的螺旋尖塔。
"""

格式化输出

模型擅长自然语言交流和非结构化数据识别,但是传统程序识别结构化的数据会更加方便。所以有时候我们希望模型也能输出固定结构的内容,方便我们解析。

这可以通过系统提示词来实现,我们可以在提示词中指定模型的输出格式,从而使模型的输出更易于解析和使用。

system_prompt = """
# 身份
- 你是一个科幻作家,根据用户的要求创建一个太空之都。

# 指令
- 请务必以JSON格式输出,不要加任何markdown样式。

#示例,模拟AI的回复,让AI学着示例的风格回复
user:月球的首都是什么?
assistant: 
{
    "name": "月华市 (Lunaria)",
    "location": "位于月球正面赤道附近的静海基地遗址之上,依托巨大的穹顶与地下网络建成",
    "vibe": "冷冽、高效、革新",
    "economy": "氦-3能源开采、量子通信枢纽、尖端生物圈农业"
}
"""

messages = agent.stream(
    {"messages": [HumanMessage(content="金星的首都是什么?")]},
    stream_mode="messages"
)
{
    "name": "云冕城 (Aurelia-V)",
    "location": "悬浮于金星北半球约五十公里高空的同温层,由超导气浮基座与碳纤维锚索构成的空中环形群岛",
    "vibe": "空灵、坚韧、云端诗学、浮世琉璃",
    "economy": "超高空恒星光能捕获、大气碳硫循环精炼、微重力气培农业、极端行星气候工程枢纽"
}

完整代码

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
from dotenv import load_dotenv
import os

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

load_dotenv()

# 获取环境变更值
base_url = os.getenv("DASHSCOPE_BASE_URL")
api_key = os.getenv("DASHSCOPE_API_KEY")

print("初始化模型")
# 初始化模型
model = init_chat_model(
    model="qwen3.6-plus",
    model_provider="openai",  # 指定模型提供者(阿里兼容 openai)
    base_url=base_url,
    api_key=api_key,
    temperature=1.5,
    top_p=0.9,
)

# 下面提示词会输出很多东西
# system_prompt = """
# 你是一个编程助手,你帮助用户编写 Python 代码。
# """

# 告诉模型,要做什么,不要做什么,减少不必要的输出,少了 Token 节约了钱
system_prompt = """
# 身份
- 你是一个科幻作家,根据用户的要求创建一个太空之都。

# 指令
- 请务必以JSON格式输出,不要加任何markdown样式。

#示例,模拟AI的回复,让AI学着示例的风格回复
user:月球的首都是什么?
assistant: 
{
    "name": "月华市 (Lunaria)",
    "location": "位于月球正面赤道附近的静海基地遗址之上,依托巨大的穹顶与地下网络建成",
    "vibe": "冷冽、高效、革新",
    "economy": "氦-3能源开采、量子通信枢纽、尖端生物圈农业"
}
"""

print("创建 agent")
# 创建 agent
agent = create_agent(
    model=model,
    system_prompt=system_prompt  # 在这边设置,就不需要每次调用的时候去配置了
)

print("调用 agent")
messages = agent.stream(
    {"messages": [HumanMessage(content="金星的首都是什么?")]},
    stream_mode="messages"
)

for token, metadata in messages:
    if token.content:
        print(token.content, end="", flush=True)


基于Model的结构化输出

在LangChain中,实现结构化输出会更加简单。我们无需自己在提示词中添加描述实现结构化输出,而仅仅是两步即可:

  • 定义一个数据类型(基于pydantic)
  • 创建智能体,设置输出格式

# init_chat_model 中的。qwen3.6-plus 不支持 response_format=CapitalInfo 的方式

from pydantic import BaseModel

#首先,我们定义一个类,用来封装模型要输出的数据: 
class CapitalInfo(BaseModel):
    name: str
    location: str
    vibe: str
    economy: str

agent = create_agent(
    model=model,
    system_prompt="你是一个科幻作家,根据用户的要求创建一个太空之都。",
    response_format=CapitalInfo,  # 设置结构化输出的格式
)

完整代码


from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
from dotenv import load_dotenv
import os

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage


load_dotenv()

# 获取环境变更值
base_url = os.getenv("DASHSCOPE_BASE_URL")
api_key = os.getenv("DASHSCOPE_API_KEY")



from pydantic import BaseModel

class CapitalInfo(BaseModel):
    name: str
    location: str
    vibe: str
    economy: str



# 初始化模型
model = init_chat_model(
    model="qwen3.6-plus",
    model_provider="openai",  # 指定模型提供者(阿里兼容 openai)
    base_url=base_url,
    api_key=api_key,
    temperature=1.5,
    top_p=0.9,
)


# 告诉模型,要做什么,不要做什么,减少不必要的输出,少了 Token 节约了钱
system_prompt = """
你是一个科幻作家,根据用户的要求创建一个太空之都。
"""

print("创建 agent")
# 创建 agent
agent = create_agent(
    model="deepseek-chat",   # init_chat_model 中的。qwen3.6-plus 不支持  response_format=CapitalInfo 的方式
    system_prompt=system_prompt,  # 在这边设置,就不需要每次调用的时候去配置了
    response_format=CapitalInfo,  # 设置结构化输出的格式
)

print("调用 agent")
response = agent.invoke(
    {"messages": [HumanMessage(content="金星的首都是什么?")]},
)

print(response)

posted @ 2026-06-05 18:42  VipSoft  阅读(18)  评论(0)    收藏  举报