LangChain 学习笔记 | 豆包MarsCode AI 刷题

87 阅读5分钟

LangChain 提示工程

提示模板类型

PromptTemplate

​ 简单来说就是给定一个带有占位符的字符串,也就是原始提示模板,然后可以使用给定的单词替换占位符,生成提示

​ 1. 这是通过 from_template 方法从字符串模板中创建提示模板

from langchain import PromptTemplate

template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)

print(prompt.format(product="鲜花"))

​ LangChain中的模板的一个方便之处就是 from_template 方法可以在原始提示模板中自动提取占位符名称,并转化为一个参数。也就是说,上面 product 占位符自动变成了 format 方法的一个参数

​ 2. 也可以通过提示模板类的构造函数,在创建模板的时候手动指定 input_variables

prompt = PromptTemplate(
    input_variables=["product", "market"], 
    template="你是业务咨询顾问。对于一个面向{market}市场的,专注于销售{product}的公司,你会推荐哪个名字?"
)
print(prompt.format(product="鲜花", market="高端"))
ChatPromptTemplate

​ 可以组合各种角色的消息模板,传入聊天模型,类似 OpenAI 的 Chat Model 中的 systemuserassistant.

from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate, # 这里并没有使用到
    HumanMessagePromptTemplate,
)

# 模板构建
template = "你是一位专业顾问,负责为专注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "公司主打产品是{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages(
    [system_message_prompt, human_message_prompt]
)

# 格式化提示消息,生成提示
prompt = prompt_template.format_prompt(
    product="鲜花装饰", product_detail="创新的鲜花设计。"
).to_messages()
print(prompt)
FewShotPromptTemplate

​ 简单来说,就是给模型提供一些样例帮助理解,具体需要四个参数

  • examples(example_selector) :示例样本,作为提示的样本。每个示例都是一个字典,键是变量名,值是输入变量的值
  • example_prompt :一个 PromptTemplate 对象,是示例样本的原始提示模板,即变量还没有填入占位符
  • suffixFewShotPromptTemplate 的原始提示模板
  • input_variables :填入 FewShotPromptTemplate 原始提示模板的变量

​ 下面是一个简单的示例

from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.few_shot import FewShotPromptTemplate

samples = [
    {"input": "1 + 2", "output": "3"},
    {"input": "4 + 5", "output": "9"},
]

prompt_template = PromptTemplate(
    input_variables=["input", "output"],
    template="{input}\n{output}"
)

few_shot_prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_template,
    suffix="\n请计算以下表达式的结果:\n{input}",
    input_variables=["input"]
)

prompt = few_shot_prompt.format(input="6 + 7")
print(prompt)
PipelinePromptTemplate

​ 可以将几个模板组合到一起使用,形成一个链。每个提示模板的输出可以作为下一个模板的输入,从而实现复杂的对话,可以将管道视为一个处理流程,每个步骤都是一个提示模板。

​ 课程中是要自己尝试,这里在网络上搜索到了让模型冒充 Elon Musk 的示例代码,但是感觉 每个提示模板输出可以作为下一个模板的输入这一点体现的不是特别明显,理解还不是很深。

​ 必需的有两个参数

  • final_prompt :管道中最终的提示模板,代表整个提示流水线完成后的最终输出格式
  • pipeline_prompts :一个列表,包含多个元组,每个元组有一个字符串(名称)和一个 PromptTemplate 示例组成,定义了提示流水线中的各个步骤

示例选择器

​ 在使用 FewShotPromprTemplate 的时候,如果示例很多的话,一次性把所有示例发送给大模型是不现实的,而且 token 太多的话也会浪费流量。

​ 这时候可以使用示例选择器来选择最合适的示例,能够选择向量相似度比较高的示例,此处需要安装向量库 (Qdrant , Chroma等)

# 5. 使用示例选择器
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings

# 初始化示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    samples,
    OpenAIEmbeddings(), # 使用一个embedding模型
    Qdrant,
    k=1
)

# 创建一个使用示例选择器的FewShotPromptTemplate对象
prompt = FewShotPromptTemplate(
    example_selector=example_selector, 
    example_prompt=prompt_sample, 
    suffix="鲜花类型: {flower_type}\n场合: {occasion}", 
    input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="红玫瑰", occasion="爱情"))
  1. 我们首先创建了一个 SemanticSimilarityExampleSelector 对象,可以根据语义相似性选择最相关的示例。

  2. 然后,它创建了一个新的 FewShotPromptTemplate 对象,使用上一步创建的选择器来选择最相关的示例生成提示。

  3. 然后,我们又用这个模板生成了一个新的提示,因为我们的提示中需要创建的是红玫瑰的文案,所以,示例选择器 example_selector 会根据语义的相似度(余弦相似度)找到最相似的示例,也就是“玫瑰”,并用这个示例构建了 FewShot 模板。

​ 通过示例选择器,就能够找出最相关的示例,避免传入过多示例浪费 token

思维链与思维树

思维链

​ 思维链(Chain of Thought)就是通过给出一系列思考推理的过程,来提高大模型进行复杂推理的能力。同样有 Few-Shot CoTZero-Shot CoT

  • Few-Shot CoT:给出一两个示例,并且写清楚推导的过程
  • Zero-Shot CoT:直接告诉模型要一步一步的思考,慢慢地推理
思维树

​ 思维树(Tree of Thought)是一种解决复杂问题的框架,为每个任务定义思维步骤和每个步骤的候选项数量。比如,为一个任务提出三个思维步骤,每个步骤提出多个方案,并保留最好的几个,然后在多个思维路径中寻找最好的方案。

​ 下面是一个使用 ToT 的例子

用户输入:我想为我的妻子购买一束鲜花,但我不确定应该选择哪种鲜花。她喜欢淡雅的颜色和花香。

AI

  1. 理解顾客的需求
  2. 考虑可能的鲜花选择
  3. 根据顾客的需求筛选最佳选择
  4. 给出建议