Langchain提示工程 | 豆包MarsCode AI刷题

54 阅读7分钟

1. 引言

在现代人工智能应用中,尤其是基于大语言模型(LLM)如OpenAI的GPT系列,我们可以通过精心设计的提示(Prompts)来引导模型生成高质量的结果。提示工程(Prompt Engineering)是一项重要的技能,它帮助我们根据需求定制模型的输出。本文将通过LangChain框架的代码示例,探讨如何构建和优化提示模板,并结合CoT(Chain of Thought)与Few-Shot学习,提升语言模型的推理能力。

2. 提示模板的基本构建

提示模板是与模型进行交互的桥梁,通过设置输入变量和模板,我们能让模型理解并生成预期的输出。在LangChain中,PromptTemplate类是用来创建和格式化提示的基本工具。

2.1 创建一个简单的提示模板

在以下代码示例中,我们构建了一个简单的PromptTemplate,用于为销售鲜花的电商公司起名字。这个提示模板包含一个占位符{product},表示将来需要传递的产品名称。

from langchain.prompts.prompt import PromptTemplate

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

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

输出

你是业务咨询顾问。
你给一个销售鲜花的电商公司,起一个好的名字?

在这个例子中,我们首先定义了一个带占位符的模板。然后使用PromptTemplate.from_template方法格式化该模板,将product="鲜花"传递进去,生成了一个完整的提示。

2.2 提示模板的扩展

为了使模型能够根据更多的上下文信息生成合适的建议,我们可以扩展模板,加入更多的变量。下面的代码展示了如何为面向特定市场的鲜花销售公司设计提示模板。

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

输出

你是业务咨询顾问。对于一个面向高端市场的,专注于销售鲜花的公司,你会推荐哪个名字?

这种方式使得模型能够更加精确地理解市场细分,并根据不同的市场需求生成更合适的答案。

3. Few-Shot学习:引导模型通过示例学习

在实际应用中,Few-Shot学习可以显著提升模型在特定任务上的表现。通过给出少量示例,模型可以学习如何处理类似问题。LangChain提供了FewShotPromptTemplate类来支持Few-Shot学习。

3.1 构建Few-Shot提示模板

以下代码展示了如何构建一个Few-Shot提示模板,其中包括了几种不同的鲜花类型及其适用场合和文案,帮助模型理解如何根据输入生成相应的推荐文案。

# 创建一些示例
samples = [
    {
        "flower_type": "玫瑰",
        "occasion": "爱情",
        "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。",
    },
    {
        "flower_type": "康乃馨",
        "occasion": "母亲节",
        "ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。",
    },
    {
        "flower_type": "百合",
        "occasion": "庆祝",
        "ad_copy": "百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。",
    },
    {
        "flower_type": "向日葵",
        "occasion": "鼓励",
        "ad_copy": "向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。",
    },
]

from langchain.prompts.prompt import PromptTemplate

# 创建提示模板
prompt_sample = PromptTemplate(
    input_variables=["flower_type", "occasion", "ad_copy"],
    template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}",
)
print(prompt_sample.format(**samples[0]))

输出

鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

在上面的代码中,我们首先创建了一些示例数据。然后,我们使用PromptTemplate构建了一个提示模板,这个模板要求我们提供flower_typeoccasionad_copy三个输入变量。通过传入示例数据,我们可以生成一个格式化的输出文案。

3.2 Few-Shot提示模板的实际应用

将Few-Shot示例与输入数据结合,模型可以生成针对不同场合的文案。下面的代码展示了如何将Few-Shot学习与用户输入结合,生成相应的花卉文案。

from langchain.prompts.few_shot import FewShotPromptTemplate

# 创建FewShot提示模板
prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_sample,
    suffix="鲜花类型: {flower_type}\n场合: {occasion}",
    input_variables=["flower_type", "occasion"],
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))

输出

鲜花类型: 野玫瑰
场合: 爱情

通过Few-Shot模板,模型能学习如何基于示例生成文案,从而为新的鲜花类型和场合提供推荐。

4. CoT(Chain of Thought)与推理增强

在面对更复杂的推理任务时,Chain of Thought(CoT)方法可以显著提升模型的推理能力。CoT通过分步骤的思考过程引导模型解决问题,并提升最终结果的准确性。

4.1 CoT模板的设计

通过设计一个详细的推理模板,模型可以依照逻辑步骤逐步思考并得出结论。以下是一个关于花卉推荐的CoT模板示例,其中包括了思考过程和一些Few-Shot示例:

role_template = (
    "你是一个为花店电商公司工作的AI助手, 你的目标是帮助客户根据他们的喜好做出明智的决定"
)

cot_template = """
作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。 

我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。
同时,我也会向客户解释我这样推荐的原因。

示例 1:
  人类:我想找一种象征爱情的花。
  AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征,这是因为它们的红色通常与热情和浓烈的感情联系在一起。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情,这是你在寻找的。

示例 2:
  人类:我想要一些独特和奇特的花。
  AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特并且颜色鲜艳的花,它们在世界上的许多地方都被视为奢侈品和美的象征。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求,而且,兰花的美丽和它们所代表的力量和奢侈也可能会吸引你。
"""

通过此模板,AI助手不仅能理解用户需求,还能基于推理过程提供精确推荐。此方法特别适用于需要多步骤推理的复杂任务。

4.2 将CoT与聊天模型结合

我们可以将CoT模板与LangChain的ChatOpenAI模型结合,进行实际应用。以下代码展示了如何将CoT引导的推理过程应用于实际的花卉推荐任务。

from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate

system_prompt_role = SystemMessagePromptTemplate.from_template(role_template)
system_prompt_cot = SystemMessagePromptTemplate.from_template(cot_template)

human_template = "{human_input}"
human_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages(
    [system_prompt_role, system_prompt_cot, human_prompt] )

prompt = chat_prompt.format_prompt( human_input="我想为我的女朋友购买一些花。她喜欢粉色和紫色。你有什么建议吗?" ).to_messages()

response = llm(prompt) print(response)

4.3 结果分析

通过CoT模板,我们不仅能获得花卉推荐,还能了解每一步推理的过程。这种推理过程能够增加用户的信任感,特别是在涉及复杂决策时。

5. 总结与思考

提示工程在AI开发中发挥着关键作用,尤其是在大语言模型的应用中。通过设计合适的提示模板,结合Few-Shot学习和Chain of Thought推理技术,我们可以极大提升模型的表现。LangChain作为一个强大的框架,使得我们可以灵活地构建和优化提示,从而帮助模型在实际应用中发挥出更高的效能。

通过本次学习,深入理解了如何使用LangChain构建有效的提示模板,并结合多种技术手段提高推理能力。这些技术不仅适用于花卉推荐等电商场景,也能广泛应用于各类需要决策支持的任务中。