构建Agnet(2) 提示词模板使用

提示词模板使用(Prompt Template Usage)

使用LangChain创建和使用提示模板来生成结构化的查询。 提示模板(Prompt Template)是一种用于生成提示(prompt)的模板。它允许您使用变量来填充模板,并生成结构化的查询。

技术要点

  1. 变量替换 : 使用花括号{}定义模板变量
  2. 中文支持: 模板支持中文字符串
  3. 动态生成: 可以根据不同的输入生成不同的查询
  4. 类型安全: PromptTemplate对象包含输入变量验证

应用场景

  • 问答系统构建
  • 多语言查询生成
  • 结构化提示工程
  • 动态内容创建

核心功能说明

PromptTemplate类提供了以下功能:

1. 提示模板定义

  • 定义模板字符串,包含变量占位符
  • 支持中文字符串
python 复制代码
from langchain_core.prompts import PromptTemplate
# Define template

template = "{country} 的首都是什么?"

# Create a `PromptTemplate` object using the `from_template` method.
prompt_template = PromptTemplate.from_template(template)
prompt_template
python 复制代码
prompt = prompt_template.format(country="Korea")
prompt

回答:'Korea 的首都是什么?'

python 复制代码
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os

load_dotenv()
# 创建ChatOpenAI对象,配置为使用硅基流动API
Qwen2_5_7B_Instruct_llm = ChatOpenAI(
    temperature=0.1,  # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
    model_name="Qwen/Qwen2.5-7B-Instruct",  # 硅基流动支持的模型名称
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 从环境变量获取API密钥
    openai_api_base="https://api.siliconflow.cn/v1"  # 硅基流动API的基础URL
)
# 创建提示模板对象
prompt = PromptTemplate.from_template("请简单解释一下 {topic} ")


# 将提示模板与模型组合成链
chain = prompt | Qwen2_5_7B_Instruct_llm
#使用管道(' | ')操作符连接' prompt '对象和' model '对象。
#使用' invoke '方法来传递' input '。
#这将返回由AI模型生成的消息
input = {"topic": "人工智能模型中的学习原理"}
# 完整输出
chain.invoke(input)

# 请求流式输出
answer = chain.stream(input)
# 流式输出
for token in answer:
    print(token.content, end="", flush=True)

2. 变量替换

  • 使用format方法替换模板变量
  • 支持多个变量替换
python 复制代码
prompt = PromptTemplate.from_template("三句话描述 {topic} ")
# 将提示与模型连接,创建对话链
chain = prompt | Qwen2_5_7B_Instruct_llm | StrOutputParser()

chain.batch(
    [
        {"topic": "ChatGPT"},
        {"topic": "Instagram"},
        {"topic": "multimodal"},
        {"topic": "programming"},
        {"topic": "machineLearning"},
    ],
    config={"max_concurrency": 3},
)

3. 动态生成

  • 根据不同输入生成不同查询
python 复制代码
from langchain_core.runnables import RunnablePassthrough  # 用于在链中透传输入参数,保持数据流不变

# 可运行对象
RunnablePassthrough().invoke({"num": 10})

# 输出:{'num': 10}

runnable_chain = {"num": RunnablePassthrough()} | prompt | Qwen2_5_7B_Instruct_llm

# 字典的值已通过 RunnablePassthrough() 更新。
runnable_chain.invoke(10)

回答:'10 是一个偶数'

3.1 高效并行执行方案
python 复制代码
#高效并行执行方案
from langchain_core.runnables import RunnableParallel

# 创建一个RunnableParallel实例。这个实例允许多个Runnable对象并行执行。
runnable = RunnableParallel(
    # 将RunnablePassthrough实例作为'passed'关键字参数传入。这会直接将输入数据原样传递,不做任何修改。
    passed=RunnablePassthrough(),
    # 使用RunnablePassthrough.assign作为'extra'关键字参数来分配一个lambda函数'mult'。
    # 这个函数将输入字典中'num'键对应的值乘以3。
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    # 将一个lambda函数作为'modified'关键字参数传入。
    # 这个函数将输入字典中'num'键对应的值加1。
    modified=lambda x: x["num"] + 1,
)
# 调用runnable实例的invoke方法,传入字典{'num': 1}作为输入。
runnable.invoke({"num": 1})
python 复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from datetime import datetime

def get_today(a):
    # 获取今天的日期,格式为"月-日"(例如:Jan-01)
    return datetime.today().strftime("%b-%d")

# 打印今天的日期
get_today(None)

from langchain_core.runnables import RunnableLambda, RunnablePassthrough

# 创建提示模板:列出{n}位生日在{today}的名人,并包含出生日期
prompt = PromptTemplate.from_template(
    "列出{n}位生日在{today}的名人。请包含他们的出生日期。"
)

# 构建链:将"today"字段通过RunnableLambda绑定到get_today函数,"n"字段直接透传
chain = (
    {
        "today": RunnableLambda(get_today), 
        "n": RunnablePassthrough()
    }
    | prompt
    | Qwen2_5_7B_Instruct_llm
    | StrOutputParser()
)
# 调用链,传入3,表示列出3位今天生日的名人
print(chain.invoke(3))

4. 使用特定itemgetter 提取特定键

itemgetter是Python operator模块中的一个实用函数,具有以下特性和优点:

  1. 核心功能
  • 高效地从字典、元组和列表中的特定键或索引中提取值

  • 能够同时提取多个键或索引

  • 支持函数式编程风格

  1. 性能优化问题
  • 对于重复的键访问操作,比常规索引更高效

  • 优化内存使用

  • 处理性能优势

  1. 在LangChain中的用法
  • 链组合中的数据过滤

  • 从复杂输入结构中选择性提取

  • 与其他Runnable对象组合进行数据预处理

python 复制代码
# 导入必要的库
from operator import itemgetter

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
from langchain_openai import ChatOpenAI

Qwen2_5_7B_Instruct_llm = ChatOpenAI(
    temperature=0.1,  # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
    model_name="Qwen/Qwen2.5-7B-Instruct",  # 硅基流动支持的模型名称
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 从环境变量获取API密钥
    openai_api_base="https://api.siliconflow.cn/v1"  # 硅基流动API的基础URL
)

# 返回句子长度的函数
def length_function(text):
    return len(text)

# 返回两个句子长度乘积的函数
def _multiple_length_function(text1, text2):
    return len(text1) * len(text2)

# 使用_multiple_length_function函数计算两个句子长度的乘积
def multiple_length_function(_dict):
    return _multiple_length_function(_dict["text1"], _dict["text2"])

# 创建聊天提示模板
prompt = ChatPromptTemplate.from_template("What is {a} + {b}?")
# 初始化OpenAI聊天模型
model = Qwen2_5_7B_Instruct_llm

# 创建基础链
chain1 = prompt | model

# 创建复杂的处理链
chain = (
    {
        # 获取word1的长度
        "a": itemgetter("word1") | RunnableLambda(length_function),
        # 获取word1和word2长度的乘积
        "b": {"text1": itemgetter("word1"), "text2": itemgetter("word2")}
        | RunnableLambda(multiple_length_function),
    }
    | prompt
    | model
)

# 使用"hello"和"world"作为输入调用链
chain.invoke({"word1": "hello", "word2": "world"})
相关推荐
Cache技术分享1 小时前
254. Java 集合 - 使用 Lambda 表达式操作 Map 的值
前端·后端
踏浪无痕1 小时前
手写一个Nacos配置中心:搞懂长轮询推送机制(附完整源码)
后端·面试·架构
用户345848285051 小时前
java除了`synchronized`关键字,还有哪些方式可以保证Java中的有序性?
后端
y***13641 小时前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
CryptoPP1 小时前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang
过客随尘2 小时前
Spring AOP以及事务详解(一)
spring boot·后端
武子康2 小时前
大数据-167 ELK Elastic Stack(ELK) 实战:架构要点、索引与排错清单
大数据·后端·elasticsearch