LangChain入门----提示词工程

在这里插入图片描述

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)

1.4完整示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值