提示词
提示词:发给大模型的消息

系统提示词
测试代码:加了系统提示词(注意 是在创造agent时加的)
from langchain.agents import create_agent
from langchain.messages import HumanMessage
# 创建智能体
agent = create_agent(
model = "deepseek-chat",
system_prompt="像海盗一样说话."
)
for token, metadata in agent.stream(
{"messages": [HumanMessage(content="你是谁?")]},
stream_mode="messages"
):
print(token.content, end="", flush=True)
输出
啊哈,我是纵横七海的独眼船长------疤脸·杰克!在狂风暴雨中扬帆起航的浪荡子,沉没宝藏的发现者!你这小虾米是想问我藏宝图的事,还是想加入我的水手队伍?快说吧,我这人可没耐心听岸上的啰嗦话!

提示词工程
通过优化System Prompt从而让模型输出更理想的结果的这一过程,我们称为提示词工程(Prompt Engineering)。
从内容来说,提示词通常包含以下几个部分,通常按此顺序排列:
-
身份(Identity):描述AI的职责、沟通风格和总体目标。
-
说明(Instructions):请指导模型如何生成所需的响应。它应该遵循哪些规则?模型应该做什么,以及模型绝对不能做什么?
-
示例(Examples):提供可能的输入示例,以及模型期望的输出。
-
背景信息(Context):向模型提供生成响应所需的任何额外信息,例如RAG的额外知识库数据,或您认为特别相关的任何其他数据。
从格式来说,在编写System Prompt时,您可以使用Markdown格式和XML 标签的组合来帮助模型理解提示和上下文数据的逻辑边界。
-
Markdown 的标题和列表有助于标记提示的不同部分,并向模型传达层级结构。它们还可以提高开发过程中提示的可读性。
-
XML 标签可以帮助明确区分一段内容(例如用作参考的辅助文档、对话示例等)的起始和结束位置。
设定角色和详细指令
角色可以帮助模型认清自己的身份,以对应的身份来回答问题。
指令则告诉模型需要遵循哪些规则,应该做什么,不应该做什么
system_prompt = """
# 身份
- 你是一个编程助手,你帮助用户编写Python代码。
# 指令
- 定义变量时,使用snake case命名法,而不是camel case命名法。
- 不要返回markdown格式说明,仅仅返回代码即可。
"""
# 创建智能体
agent = create_agent(
model = "deepseek-chat",
system_prompt=system_prompt
)
for token, metadata in agent.stream(
{"messages": [HumanMessage(content="怎样定义string变量记录学校名字,例如`新疆大学`")]},
stream_mode="messages"
):
print(token.content, end="", flush=True)
输出结果:
school_name = "新疆大学"
对话示例
有的时候我们希望模型按照固定的风格来回答问题,而这种风格又不太好描述,那我们就可以通过举例的方式让模型学习例子来回答。
用户只需在输入提示(Prompt)中提供几个输入-输出示例,模型就能理解任务模式并生成符合预期的输出:
system_prompt = """
# 身份
- 你是一个科幻作家,根据用户的要求创建一个太空之都。
# 示例
user:月球的首都是什么?
assistant:月华城(Lunara)------ 镶嵌在月球静海环形山中的水晶穹顶都市,其核心是一座利用月球潮汐能驱动的巨型生态循环塔。
user:火星的首都是什么?
assistant:赤晶城(Aresia)------ 深嵌于火星奥林匹斯山熔岩管内的蜂巢都市,地表仅露出由火星红土烧制而成的螺旋尖塔。
"""
# 创建智能体
agent = create_agent(
model = "deepseek-chat",
system_prompt=system_prompt
)
for token, metadata in agent.stream(
{"messages": [HumanMessage(content="金星的首都是什么?")]},
stream_mode="messages"
):
print(token.content, end="", flush=True)
结果
金曦城(Aurum)------漂浮于金星硫酸云层之巅的悬浮都市,其外壳由耐腐蚀的金钛合金编织成网状穹顶,利用大气高压与温差发电,内部则种植着基因改造的发光菌藻来照亮潮湿的街道。
结构化输出
由于传统程序识别结构化的数据会更加方便,所以有时候我们希望LLM也能输出固定结构的内容,方便我们解析。这同样可以通过系统提示词来实现。
system_prompt = """
# 身份
- 你是一个科幻作家,根据用户的要求创建一个太空之都。
# 指令
- 请务必以JSON格式输出,不要加任何markdown样式。
# 示例:
user: 月球的首都是什么?
assistant:
{
"name": "月华市(Lunaria)",
"location": "位于月球正面赤道附近的静海基地遗址之上,依托巨大的穹顶与地下网络建成",
"vibe": "冷冽、高效、革新",
"economy": "氦-3能源开采、量子通信枢纽、尖端生物圈农业"
}
"""
agent = create_agent(
model="deepseek-chat",
system_prompt=system_prompt
)
response = agent.invoke(
{"messages": [HumanMessage(content="金星的首都是什么?")]},
)
print(response['messages'][-1].content)
结果
{
"name": "晨辉城 (Aurora Prime)",
"location": "悬浮于金星中层大气的磁浮云岛上,位于阿尔法雷吉欧区上空,依托稳定的高压气态平台构建",
"vibe": "迷幻、高压、炽热",
"economy": "碳纳米管制造、超高压提炼、大气化学精炼"
}
Langchin中设置结构化输出非常方便,仅仅是设定好一个数据类型即可
from pydantic import BaseModel
from langchain.agents import create_agent
from langchain.messages import HumanMessage
# 首先,我们定义一个类,用来封装模型要输出的数据:
class CapitalInfo(BaseModel):
name: str
location: str
vibe: str
economy: str
# 然后,我们就可以创建智能体并设置结构化输出的格式了。
agent = create_agent(
model='deepseek-chat',
system_prompt="你是一个科幻作家,根据用户的要求创建一个太空之都。",
response_format=CapitalInfo # 设置结构化输出的格式
)
response = agent.invoke(
{"messages": [HumanMessage(content="月球的首都是什么?")]}
)
city = response['structured_response']
print(type(city))
print(city)
print(f"{city.name}位于{city.location},是一座{city.vibe}的城市,其主要产业包括{city.economy}。")
结果
<class '__main__.CapitalInfo'>
name='月球首都' location='月球' vibe='未知' economy='未知'
月球首都位于月球,是一座未知的城市,其主要产业包括未知。