3.LangChain零基础速通-Prompt提示词模版和模型调用方法

文章目录

Prompt提示词模版和模型调用方法

Prompt提示词

简介

Prompt是引导AI模型生成特定输出的输入格式,Prompt的设计和措辞会显著影响模型的响应。

Prompt最开始只是简单的字符串 ,随着时间的推移,Prompt逐渐开始包含特定的占位符 ,例如AI模型可通过将多个消息字符串分类为不同的角模型可以识别的"USER:"、"SYSTEM:"等。模型可通过多个消息字符串分类为不同的角色,然后再由AI模型处理,为prompt引入了更多结构。每条消息都分配有特定的角色,这些角色对消息进行分类,明确AI模型提示的每个部分的上下文和目的。这种结构化方法增强了与AI沟通的细微差别和有效性,因为prompt 的每个部分在交互中都扮演着独特且明确的角色。

发展过程

  • 简单纯字符串:最初的Prompt只是简单的文本字符串
  • 占位符:引入占位符类似于${it}以动态插入内容
  • 多角色消息:
    • SystemMessage:系统消息,type="system",为AI设定角色、行为边界和输出规则,是高质量的第一步,并不是所有模型提供商都支持这个消息类型。
    • HumanMessage:人类消息,type="user",表示来自用户输入。
    • AIMessage:表示模型输出的内容类型,type="ai",这可以是文本,也可以是调用工具的请求。
    • TooIMessage:工具消息,type="tool",用于函数调用结果的消息类型
python 复制代码
messages = [
    SystemMessage(content="你是Python助手"),
    HumanMessage(content="python简介"),
    AIMessage(content="我是一名大模型助手"),
    ToolMessage(
        content="我是一名大模型助手",
        tool_call_id="tool_call_id")
]

PromptTemplate-文本提示词模版

文本生成模型提示词模版,是LangChain提供的最基础的模板,通过格式化字符串生成提示词,在执行invoke时将变量格式化到提示词模板中。

简介

在与大语言模型交互时,通常不会直接将用户的原始输入直接传递给大模型,而是会先行一系列包装、组织和格式化操作。这样做的目的是更清晰地表达用户意图,更好地利用模型能力,这套结构化的提示词构建方式,就是LangChain中的提示词模板(PromptTemplate)。

在应用开发中,一个关键的考量是提示词不能是一成不变的。其原因在于,应用开发需要适应多变的用户需求和场景。固定的提示词限制了模型的灵活性和适用范围。所以,PromptTemplate是一个模板化的字符串,可以用来生成特定的提示(prompts)。

你可以将变量插入到模板中,从而创建出不同的提示。这对于重复生成相似格式的提示非常有用

参数

参数 说明
template 提示模板,包括变量占位符
input_variables 列表,需要将其值作为提示输入的变量名称列表
partial_variables 字典,提示模板携带的部分变量的字典。使用部分变量预先填充模板,无需后续在每次调用时再传递这些变量
方法 说明
format() 使用输入格式化提示

创建方式

  1. 构造方法
python 复制代码
prompt_template = PromptTemplate(
    template="你是一个专业的{role},请回答我的问题:{question}",
    input_variables=["role", "question"]
)
  1. form_template方法
python 复制代码
prompt_template = PromptTemplate.from_template(
    "你是一个专业的{role},请回答我的问题:{question}"
)
  1. 部分提示词模版:允许你预先固定部分变量,而保留其他变量在后续动态填充。例如:先预设系统参数,然后等用户输入后再补齐提示词模板
python 复制代码
# 写法1
prompt_template = PromptTemplate.from_template(
    "当前时间: {time}, 你是一个专业的{role},请回答我的问题:{question}",
    partial_variables={
        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
)

# 写法2
prompt_template = PromptTemplate(
    template="当前时间: {time}, 你是一个专业的{role},请回答我的问题:{question}",
    input_variables=["time", "role", "question"],
    partial_variables={
        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
)
  1. 组合提示词模版:通过将多个子提示(Prompt)按一定逻辑顺序或层级组合起来,形成一个复杂任务的整体Prompt。例如实现多消息对话、多阶段任务、多输入源组合等场景
python 复制代码
# 1.提示词模版1
prompt_template_a = PromptTemplate.from_template("请用一句话介绍:{topic}")

# 2.提示词模版2
prompt_template_b = PromptTemplate.from_template("要求内容不超过{length}个字")

# 3.组合提示词
prompt_template = prompt_template_a + prompt_template_b
prompt = prompt_template.format(topic="python", length="10")
print(f'prompt: {prompt}')

主要方法

  • format:格式化提示词模板为字符串
  • invoke:格式化提示词模板为PromptValue,可以用.to_string()或.to_messages()查看内容
  • partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化

ChatPromptTemplate-对话提示词模版

简介

ChatPromptTemplate是LangChain中专门用于结构化聊天对话提示的核心组件,它比普通PromptTemplate更适合处理多角色、多轮次的对话场景。为与现代聊天模型的交互提供了一种上下文丰富和会话友好的方式。

消息模版包括ChatMessagePromptTemplate、SystemMessagePromptTemplate、HumanMessagePromptTemplate、AIMessagePromptTemplate

参数

python 复制代码
# 1.tuple构成的列表,格式为[("role", "content"), ("role", "content")]

# 2.dict构成的列表,格式为[{"role": "content"}, {"role": "content"}]

# 3.Message类构成的列表,格式为[Message(role="content"), Message(role="content")]

创建方式

  • 构造方法
python 复制代码
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate

from config import OPENAI_API_KEY

# 功能:3种入参、3种方法
# 构造方法的入参:
# tuple构成的列表,格式为[("role", "content"), ("role", "content")]
# dict构成的列表,格式为[{"role": "content"}, {"role": "content"}]
# Message类构成的列表,格式为[Message(role="content"), Message(role="content")]


# 1.构造方法实例化提示词模版1:元组
chat_prompt_template = ChatPromptTemplate(
    [
        ("system", "你是一个专业的AI工程师,你的名字是:{name}"),
        ("ai", "我能开发python"),
        ("human", "请回答:{user_input}"),
    ]
)

# 2.构造方法实例化提示词模版1:字典
# chat_prompt_template = ChatPromptTemplate(
#     [
#         {"role": "system", "content": "你是一个专业的AI工程师,你的名字是:{name}"},
#         {"role": "ai", "content": "我能开发python"},
#         {"role": "human", "content": "请回答:{user_input}"}
#     ]
# )

# 3.构造方法实例化提示词模版1:Message
# chat_prompt_template = ChatPromptTemplate(
#     [
#         SystemMessage(content="你是一个专业的AI工程师,你的名字是:{name}"),
#         HumanMessage(content="请回答:{user_input}")
#     ]
# )

# 1.使用format_messages方法格式化生成具体的提示词
# 2.使用invoke方法格式化生成具体的提示词
# 3.使用format方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.format_messages(name='朱鹏', user_input='简述python发展历史')
# chat_prompt = chat_prompt_template.invoke({"name": "朱鹏", "user_input": "简述python发展历史"})
# chat_prompt = chat_prompt_template.format(name='朱鹏',user_input='简述python发展历史')
print(f'chat_prompt: {chat_prompt}')
  • from_messages()
python 复制代码
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate

from config import OPENAI_API_KEY

# 功能:3种入参、3种方法
# from_messages方法实例化提示词模版
# 1.rom_messages方法实例化提示词模版1:元组
chat_prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个专业的AI工程师,你的名字是:{name}"),
        ("human", "请回答:{user_input}")
    ]
)

# 2.rom_messages方法实例化提示词模版2:字典
# chat_prompt_template = ChatPromptTemplate.from_messages(
#     [
#         {"role": "system", "content": "你是一个专业的AI工程师,你的名字是:{name}"},
#         {"role": "human", "content": "请回答:{user_input}"}
#     ]
# )

# 3.rom_messages方法实例化提示词模版3:Message
# chat_prompt_template = ChatPromptTemplate.from_messages(
#     [
#         SystemMessage(content="你是一个专业的AI工程师,你的名字是:{name}"),
#         HumanMessage(content="请回答:{user_input}")
#     ]
# )

# 1.使用format_messages方法格式化生成具体的提示词
# 2.使用invoke方法格式化生成具体的提示词
# 3.使用format方法格式化生成具体的提示词
# chat_prompt = chat_prompt_template.format_messages(name='朱鹏', user_input='简述python发展历史')  # 关键字占位传参
# chat_prompt = chat_prompt_template.format_messages(**{"name": "朱鹏", "user_input": "简述python发展历史"})  # 解包
# chat_prompt = chat_prompt_template.invoke({"name": "朱鹏", "user_input": "简述python发展历史"})
chat_prompt = chat_prompt_template.format(name='朱鹏', user_input='简述python发展历史')
print(f'chat_prompt: {chat_prompt}')
  • MessageHolder:消息占位符提示词模版
python 复制代码
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from config import OPENAI_API_KEY

# 功能:MessageHolder显式调用
# 1.from_messages方法实例化提示词模版
chat_prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个专业的AI工程师,你的名字是:{name}"),
        MessagesPlaceholder("memory"),  # 占位符显式调用,用于填充历史对话记录(如多轮对话上下文)
        ("human", "请回答:{user_input}")
    ]
)

# 2.使用format_messages方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.invoke({
    "memory": [
        ("human", "你叫什么名字"),
        ("ai", "我叫朱鹏")
    ],
    "name": "朱鹏",
    "user_input": "简述python发展历史"
})

print(f'chat_prompt: {chat_prompt}')




from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate

from config import OPENAI_API_KEY

# 功能:MessageHolder隐式调用
# 1.from_messages方法实例化提示词模版
chat_prompt_template = ChatPromptTemplate.from_messages(
    [
        ("placeholder", "{memory}"),
        ("system", "你是一个专业的AI工程师,你的名字是:{name}"),
        ("human", "请回答:{user_input}")
    ]
)

# 2.使用format_messages方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.invoke({
    "memory": [
        ("human", "你叫什么名字"),
        ("ai", "我叫朱鹏")
    ],
    "name": "朱鹏",
    "user_input": "简述python发展历史"
})

print(f'chat_prompt: {chat_prompt}')

外部加载Prompt

python 复制代码
from langchain_core.prompts import load_prompt

# 从外部yaml文件加载Prompt
prompt = load_prompt("../prompt/prompt.yaml", encoding="utf-8")
print(prompt.format(name="张三", story="一次冒险"))

模型调用方法

普通调用(同步/异步)

invoke:同步将单个输入转为输出,普通调用,等待每条输入,等待LLM完全推理完成后再返回调用结果

python 复制代码
# init_chat_model创建一个语言模型

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage

from config import OPENAI_API_KEY

llm = init_chat_model(
    model='deepseek-chat',
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)
messages = [
    SystemMessage(content="你是Python助手"),
    HumanMessage(content="python简介"),
]

# 调用语言模型
response = llm.invoke(messages)
print(f'type(response): {type(response)}')
print("response.content", response.content)

ainvoke:异步将单个输入转为输出,异步调用,用于在异步环境(async/await)中高效并行地执行模型推理,让你同时调用多个模型请求而不阻塞主线程-特别适合大批量请求或web服务场景(如FastAPI)

python 复制代码
import asyncio

from langchain.chat_models import init_chat_model

from config import OPENAI_API_KEY

llm = init_chat_model(
    model="deepseek-chat",
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)


# 声明异步接口
async def main():
    response = await llm.ainvoke("Python简介")
    print(f'响应类型:{type(response)}')
    print(response.content)


# 运行异步函数
if __name__ == '__main__':
    asyncio.run(main())

流式调用

stream:**流式调用,**同步将单个输入流式输出,是一种逐步返回大模型生成结果的技术,生成一点返回一点,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回。

python 复制代码
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage

from config import OPENAI_API_KEY

llm = init_chat_model(
    model='deepseek-chat',
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)
messages = [
    SystemMessage(content="你是Python助手"),
    HumanMessage(content="python简介"),
]

# 流式调用语言模型
response = llm.stream(messages)
print(f'type(response): {type(response)}')
for chunk in response:
    print(chunk.content, end='', flush=True)

astream:**异步流式调用,**异步将单个输入流式输出

python 复制代码
import asyncio

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage

from config import OPENAI_API_KEY

llm = init_chat_model(
    model='deepseek-chat',
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)
messages = [
    SystemMessage(content="你是Python助手"),
    HumanMessage(content="python简介"),
]


# 异步流式调用
async def async_stream_call():
    # astream返回一个异步生成器 无需await修饰    
    response = llm.astream(messages)
    print(f'type(response) = {type(response)}')

    # 异步迭代生成器必须使用await修饰
    async for chunk in response:
        print(chunk.content, end='', flush=True)


if __name__ == "__main__":
    asyncio.run(async_stream_call())

批量调用

batch:同步批量将多个输入转为输出,批量调用,一次性向模型提交多个输入并并行处理,从而显著提升吞吐量

python 复制代码
from langchain.chat_models import init_chat_model

from config import OPENAI_API_KEY

llm = init_chat_model(
    model='deepseek-chat',
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)
questions = [
    "什么是redis",
    "python简介",
    "java是什么"
]

# 批量调用大模型
response = llm.batch(questions)
print(f'type(response): {type(response)}')

for q, r in zip(questions, response):
    print(f'问题:{q} \n 回答: {r.content}')

abatch:异步批量将多个输入转为输出

python 复制代码
import asyncio

from langchain.chat_models import init_chat_model

from config import OPENAI_API_KEY

llm = init_chat_model(
    model='deepseek-chat',
    model_provider="deepseek",
    api_key=OPENAI_API_KEY,
    base_url="https://api.deepseek.com"
)
questions = [
    "什么是redis",
    "python简介",
    "java是什么"
]


# 异步批量调用大模型
async def async_batch_call():
    response = await llm.abatch(questions)
    print(f'type(response): {type(response)}')
    for q, r in zip(questions, response):
        print(f'问题:{q} \n 回答: {r.content}')


if __name__ == '__main__':
    asyncio.run(async_batch_call())

总结:带有"a"前缀的方法是异步的,需要与asyncio和await语法一起使用以实现并发。

相关推荐
无忧智库1 小时前
某大型建筑集团财务一体化平台建设项目方案(PPT)
大数据·人工智能
艺杯羹1 小时前
从零搭建CSDN博客爬虫:Python爬虫+多格式导出完整教程
开发语言·爬虫·python·开源·gui·csdn
宁雨桥1 小时前
AI前端开发面试题分享
前端·人工智能·ai
SSH_55231 小时前
云上部署Claude+MiniMax+Gstack+Bun
人工智能
fangzt20101 小时前
从零搭建自动驾驶中间件(三):事件驱动与协程调度的工程实践
人工智能·中间件·自动驾驶
叶子Talk1 小时前
GPT-5.5幻觉率骤降52.5%,但90%的公司还在裸奔?
人工智能·gpt·ai·openai·gpt-5.5·幻觉率
iAm_Ike1 小时前
JavaScript中模块化在游戏引擎开发中的资源调度作用
jvm·数据库·python
晚风吹长发1 小时前
LangChain中的工具使用
langchain
人工智能AI技术1 小时前
栈与队列基础:应用场景与经典面试题
人工智能