
1提示词工程
所谓提示词工程(Prompt Engineering),就是通过优化提示词使模型输出的结果更符合业务需要的过程。
一般来说,系统提示词(System Prompt)会包含以下几个部分,通常按此顺序排列:
- 身份角色(Identity):描述Al的职责、沟通风格和总体目标。
- 指令说明(Instructions):人请指导模型如何生成所需的响应。它应该遵循哪些规则?模型应该做什么,以及模型绝对不能做什么?
- 对话示例(Examples):提供可能的输入示例,以及模型期望的输出。
- 背景信息(Context):向模型提供生成响应所需的任何额外信息,例如RAG的额外知识库数据,或您认为特别相关的任何其他数据。
在编写System Prompt时,您可以使用Markdown格式和XML标签的组合来帮助模型理解提示和上下文数据的逻辑边界。
- Markdown的标题和列表有助于标记提示的不同部分,并向模型传达层级结构。它们还可以提高开发过程中提示的可读性。
- XML 标签可以帮助明确区分一段内容(例如用作参考的辅助文档)的起始和结束位置。
rom langchain.agents import create_agent
from langchain.messages import HumanMessage, AIMessage, SystemMessage
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)
1.1设定角色和指令
system_prompt="""
你是一个编程助手,帮助用户编写python代码
"""
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)
增加指令描述,约束模型的行为,什么能做什么不能做
system_prompt="""
#身份
你是一个编程助手,帮助用户编写python代码
#指令
定义变量时,使用camelCase命名法,而不是snake_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)
1.2对话示例
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)
1.3结构化输出
模型擅长自然语言交流和非结构化数据识别,但是传统程序识别结构化的数据会更加方便。所以有时候我们希望模也能输出固定结构的内容,方便我们解析。
这可以通过系统提示词来实现,我们可以在提示词中指定模型的输出格式,从而使模型的输出更易于解析和使用。
a基于提示词的结构化输出
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)
b.基于model的结构化输出
在LangChain中,实现结构化输出会更加简单。我们无需自己在提示词中添加描述实现结构化输出,而仅仅是两步即可:
- 定义一个数据类型(基于pydantic)
- 创建智能体,设置输出格式
from pydantic import BaseModel
#首先定义一个类,用来封装模型要输出的数据
class Caption(BaseModel):
name:str
location:str
vibe:str
economy:str
agent = create_agent(
model='deepseek-chat',
system_prompt='你是一个科幻作家,根据用户的要求来创造太空之旅',
response_format=Caption, #设置结构化输出的格式
)
response=agent.invoke(
{"messages":[HumanMessage(content='月球的首都是哪里')]}
)
print(response["structured_response"])
print(response["structured_response"].name)

218

被折叠的 条评论
为什么被折叠?



