1.1langchain 提示词笔记

这段代码演示了如何使用 LangChain 框架调用大语言模型(通义千问)来完成一个简单的命名生成任务。它涉及以下几个核心的大模型知识与实践:


1. 提示词工程(Prompt Engineering)

代码通过 PromptTemplate 定义了一个模板:

python 复制代码
"我的邻居姓{lastname}, 刚生了{gender}, 你帮我起个名字,简单回答。"
  • 使用 {lastname}{gender} 作为占位符,实现动态提示构建
  • 这种模板化方法允许开发者将业务变量(如姓氏、性别)与固定指令分离,便于维护和复用。
  • 模板设计体现了指令清晰、约束输出格式的思想("简单回答"),属于提示工程的基本实践。

2. 零样本学习(Zero-shot Learning)

提示中没有给任何示例(如"张姓女孩可取名为张悦"),模型直接根据通用知识和语言理解来生成名字。这属于典型的 零样本(Zero-shot)生成------模型依靠预训练阶段积累的命名规律和文化常识进行推理,无需额外示例。


3. 大语言模型调用(LLM Inference)

  • 使用阿里云的通义千问模型(Tongyi(model="qwen-max")),通过 invoke 方法发送提示,获取模型回复。
  • 这体现了 模型即服务(MaaS) 的调用模式,开发者只需通过 API 与模型交互,无需关心底层基础设施。
  • 参数 temperature 等未显式设置,使用了模型默认值(通常为 0.7~1.0),适合创意性任务。

4. LCEL(LangChain Expression Language)

  • chain = prompt_template | model 使用管道运算符将提示模板和模型串联成一个 可运行链(RunnableSequence)
  • 调用 chain.invoke({"lastname": "张", "gender": "女儿"}) 时,LangChain 自动完成:
    • 将输入字典注入模板,生成完整提示文本。
    • 将提示发送给模型,获取响应。
    • 返回模型生成的文本。
  • 这种声明式链式编程简化了复杂流程的构建,是 LangChain 的核心设计模式。

5. 文本生成任务(Text Generation)

命名生成是典型的开放式文本生成任务,要求模型:

  • 理解"姓氏+性别"的约束条件。
  • 结合中文命名文化(如寓意美好、音韵和谐)生成合理名字。
  • 输出简洁("简单回答"),体现指令遵循能力。

6. 模型推理与知识运用

模型在生成名字时,用到了:

  • 语言知识:汉字组合、常用名字结构。
  • 文化知识:中文名字通常包含寓意(如"悦"、"欣")。
  • 常识推理:根据性别提示匹配常见性别倾向的名字(如女孩多用"芳"、"婷")。

7. 可选:链的便捷性

注释中展示了另一种方法(手动 .format 并调用 model.invoke),而链式写法 chain.invoke 更简洁,且易于扩展(如添加输出解析器、记忆组件等),体现 LangChain 的模块化设计思想。


小结

该示例虽然简单,但涵盖了提示工程、零样本推理、LLM API 调用、LCEL 链式编程、文本生成任务等大模型应用的核心知识点。通过这种模板化、链式化的方式,开发者可以快速构建可复用的智能应用。

这个方法 PromptTemplate.from_template 是 LangChain 中用于从字符串模板快速创建 PromptTemplate 实例的工厂方法(类方法)。它承担了模板解析、变量提取和部分变量注入的职责,是构建提示模板最常用的入口。


一、方法签名与参数详解

python 复制代码
@classmethod
def from_template(
    cls,
    template: str,
    *,
    template_format: PromptTemplateFormat = "f-string",
    partial_variables: dict[str, Any] | None = None,
    **kwargs: Any,
) -> PromptTemplate:
参数 类型 说明
template str 原始模板字符串,包含 {variable} 占位符(或 jinja2/mustache 格式)
template_format PromptTemplateFormat 模板语法格式,支持 "f-string"(默认)、"jinja2""mustache"
partial_variables `dictstr, Any None`
**kwargs Any 传递给 PromptTemplate 构造函数的其他参数(如 validate_template 等)

二、方法内部逻辑拆解

1. 提取模板变量
python 复制代码
input_variables = get_template_variables(template, template_format)
  • get_template_variables 是一个工具函数,根据 template_format 解析模板,返回所有未绑定的变量名列表。例如模板 "你好,{name}" 会返回 ["name"]
2. 处理部分变量(Partial Variables)
python 复制代码
partial_variables_ = partial_variables or {}
if partial_variables_:
    input_variables = [var for var in input_variables if var not in partial_variables_]
  • 如果提供了 partial_variables,则从 input_variables 列表中移除这些变量名,因为它们的值已经被预先指定,不需要用户再提供。
3. 创建 PromptTemplate 实例
python 复制代码
return cls(
    input_variables=input_variables,
    template=template,
    template_format=template_format,
    partial_variables=partial_variables_,
    **kwargs,
)
  • 调用类构造函数,传入处理后的变量列表、原始模板、格式和部分变量字典。
  • 最终得到一个完整的 PromptTemplate 对象。
4. 安全警告(关于 Jinja2)
  • 注释中特别提示:template_format='jinja2' 存在安全风险(可能导致任意代码执行),因为 Jinja2 模板可能包含危险的表达式。默认使用 f-string 更安全。即使 LangChain 使用了沙箱环境,也不应接受不可信来源的 jinja2 模板。

三、后续调用方式

创建 PromptTemplate 实例后,通常有两种主要用途:

1. 手动格式化(format / format_prompt
python 复制代码
prompt = PromptTemplate.from_template("我的邻居姓{lastname},刚生了{gender}")
# 格式化生成完整字符串
formatted_text = prompt.format(lastname="张", gender="女儿")
# 或生成一个 PromptValue 对象(包含消息列表)
prompt_value = prompt.format_prompt(lastname="张", gender="女儿")
  • format 直接返回字符串。
  • format_prompt 返回一个 StringPromptValueChatPromptValue,便于后续传递给模型。
2. 与模型链式调用(LCEL)
python 复制代码
from langchain_community.llms.tongyi import Tongyi
chain = prompt | Tongyi()
response = chain.invoke({"lastname": "张", "gender": "女儿"})
  • 使用管道运算符 |PromptTemplateLLM 组合成一个 RunnableSequence
  • 当调用 chain.invoke(input_dict) 时:
    • LangChain 自动将输入字典传给 PromptTemplateinvoke 方法,该方法内部调用 format(**input_dict) 生成提示文本。
    • 然后该文本作为输入传给 LLM.invoke,得到模型输出。
  • 整个过程是流水线式的,无需手动调用 format
3. 与其他组件组合(如输出解析器)
python 复制代码
from langchain.output_parsers import StrOutputParser
chain = prompt | llm | StrOutputParser()
  • 输出解析器可将模型输出进一步处理(如提取 JSON、列表等)。

四、partial_variables 的实际应用场景

  • 当某些变量是固定值(如系统提示中的 "你是一个AI助手")时,可以预先部分填充,减少用户输入项。

  • 例如:

    python 复制代码
    partial_prompt = PromptTemplate.from_template(
        "系统: {system_msg}\n用户: {user_msg}",
        partial_variables={"system_msg": "你是一个严谨的科学家"}
    )
    # 调用时只需提供 user_msg
    final = partial_prompt.format(user_msg="解释量子纠缠")

五、小结

  • from_template 是一个便捷工厂,负责解析模板变量、处理部分变量,并实例化 PromptTemplate
  • 它隐藏了变量提取的复杂性,使开发者能快速定义可复用的提示模板。
  • 后续通过 format 或链式调用,将变量值注入模板,生成最终提示文本,供大模型使用。
  • 注意模板格式选择,优先使用 f-string 以避免安全风险。

这个方法是 LangChain 提示模板体系的基础,理解它对高效构建提示和链式调用至关重要。