首页 > 其他分享 >Prompt工程八大技巧:打造高效LLM应用

Prompt工程八大技巧:打造高效LLM应用

时间:2024-10-30 17:47:19浏览次数:7  
标签:concept 八大 campaign 模型 component content LLM Prompt

文章目录

前言

在开发大型语言模型(LLM)原生应用的过程中,Prompt工程无疑是一项至关重要的技能。通过精心设计的Prompt,可以显著提升应用的性能和可靠性。正确的 Prompt 能够引导 LLM 生成符合需求的高质量输出,在不同的应用场景中发挥重要作用。本文将深入探讨 Prompt 工程的多种技巧,希望对大家有所帮助。

在这里插入图片描述

一、明确认知过程边界

在与 LLM 交互时,定义清晰的认知过程边界至关重要。这有助于保持 LLM 交互的专注性和清晰度,符合 LLM 三角原理中的工程技术顶点要求。每个步骤都应是一个独立的过程,避免在同一个 Prompt 中混合不同的认知过程,否则可能会产生次优的结果。

以 “Landing Page Generator” 为例,我们可以将生成Landing Page的过程分解为多个独立的函数,如generate_landing_page_concept用于定义Landing Page,select_landing_page_components用于选择组件,generate_component_content用于生成组件内容。通过这种方式,每个函数都专注于一个特定的认知任务,提高了输出质量,并且更易于调试和优化。

def generate_landing_page_concept(input_data: LandingPageInput) -> LandingPageConcept:    """    Generate a landing page concept based on the input data.    This function focuses on the creative process of conceptualizing the landing page.    """    pass
def select_landing_page_components(concept: LandingPageConcept) -> List[LandingPageComponent]:    """    Select appropriate components for the landing page based on the concept.    This function is responsible only for choosing components,    not for generating their content or layout.    """    pass
def generate_component_content(component: LandingPageComponent, concept: LandingPageConcept) -> ComponentContent:    """    Generate content for a specific landing page component.    This function focuses on creating appropriate content based on the component type and overall concept.    """    pass

二、明确指定输入 / 输出

定义清晰的输入和输出结构能够反映目标,并创建明确的数据模型。这涉及到 LLM 三角原理中的工程技术和上下文数据顶点。例如,通过定义LandingPageInput和LandingPageConcept等,我们明确了输入数据的结构,包括品牌、产品描述、活动描述等,以及输出数据的结构,如活动描述的反映、动机、叙事等。

class LandingPageInput(BaseModel):    brand: str    product_desc: str    campaign_desc: str    cta_message: str    target_audience: str    unique_selling_points: List[str]
class LandingPageConcept(BaseModel):    campaign_desc_reflection: str    campaign_motivation: str    campaign_narrative: str    campaign_title_types: List[str]    campaign_title: str    tone_and_style: List[str]

这种明确的输入 / 输出定义为 LLM 提供了清晰的指导,使其能够更好地理解任务要求。在不同的应用场景中,无论是处理文本生成、信息检索还是其他任务,明确的数据模型都有助于提高结果的准确性和可靠性。

三、 实施防护栏

为了确保 LLM 输出的质量和适度性,我们可以实施防护栏。Pydantic 是一个很好的工具,它可以用于实现简单的验证,如定义字段的最小长度或最小数量。同时,我们还可以使用自定义的验证器,如field_validator来确保生成的内容符合特定的内容政策。

在 “Landing Page Generator” 中,对于LandingPageConcept模型,我们可以使用 Pydantic 的Field来定义campaign_narrative字段的最小长度为 50,以及tone_and_style列表的最小项目数为 2。此外,还可以使用自定义验证器来检查campaign_narrative是否符合内容政策,通过调用另一个 AI 模型进行验证,如果不符合则抛出异常。

class LandingPageConcept(BaseModel):    campaign_narrative: str = Field(..., min_length=50)  # native validations    tone_and_style: List[str] = Field(..., min_items=2)  # native validations
    # ...rest of the fields... #
    @field_validator("campaign_narrative")    @classmethod    def validate_campaign_narrative(cls, v):        """Validate the campaign narrative against the content policy, using another AI model."""        response = client.moderations.create(input=v)
        if response.results[0].flagged:            raise ValueError("The provided text violates the content policy.")
        return v

四、 与人类认知过程对齐

(一)模仿人类思维的步骤分解

为了提高 LLM 的性能,我们可以将复杂任务分解为更小的步骤,使其结构与人类认知过程对齐。这遵循 LLM 三角原理中的标准操作程序(SOP)指导原则。例如,在创建Landing Page概念时,我们可以通过引导 LLM 输出特定的字段,如活动描述的分析、动机、叙事等,来鼓励它遵循类似于人类营销人员或设计师的思维过程。

class LandingPageConcept(BaseModel):    campaign_desc_reflection: str  # Encourages analysis of the campaign description    campaign_motivation: str       # Prompts thinking about the 'why' behind the campaign    campaign_narrative: str        # Guides creation of a cohesive story for the landing page    campaign_title_types: List[str]# Promotes brainstorming different title approaches    campaign_title: str            # The final decision on the title    tone_and_style: List[str]      # Defines the overall feel of the landing page

(二)多步骤 / 代理的应用

对于复杂任务,我们可以采用多步骤或多代理的方法。以生成Landing Page为例,我们可以先概念化活动,然后选择组件,接着为每个组件生成内容,最后组合成最终的 HTML。这种多代理的方法类似于人类解决复杂问题的方式,将问题分解为更小的部分,提高了处理效率和结果质量。

async def generate_landing_page(input_data: LandingPageInput) -> LandingPageOutput:    # Step 1: Conceptualize the campaign    concept = await generate_concept(input_data)        # Step 2: Select appropriate components    selected_components = await select_components(concept)        # Step 3: Generate content for each selected component    component_contents = {        component: await generate_component_content(input_data, concept, component)        for component in selected_components    }        # Step 4: Compose the final HTML    html = await compose_html(concept, component_contents)        return LandingPageOutput(concept, selected_components, component_contents, html)

五、 利用结构化数据

YAML是一种流行的、对人类友好的数据序列化格式,易于人类阅读和机器解析,非常适合LLM使用。

我们发现YAML在LLM交互中特别有效,能够跨不同模型产生更好的结果。它使令牌处理集中在有价值的内容上,而不是语法上。此外,YAML在不同LLM提供商之间更具可移植性,并允许维护结构化的输出格式。

以 “Landing Page Generator” 为例,我们使用YAML格式定义输入、概念和组件,并通过few-shot示例向模型展示期望的输出结构。这种方法比直接在Prompt中提供明确的指令更有效。

sync def generate_component_content(input_data: LandingPageInput, concept: LandingPageConcept,component: LandingPageComponent) -> ComponentContent:    few_shots = {        LandingPageComponent.HERO: {            "input": LandingPageInput(                brand="Mustacher",                product_desc="Luxurious mustache cream for grooming and styling",                # ... rest of the input data ...            ),            "concept": LandingPageConcept(                campaign_title="Celebrate Dad's Dash of Distinction",                tone_and_style=["Warm", "Slightly humorous", "Nostalgic"]                # ... rest of the concept ...            ),            "output": ComponentContent(                motivation="The hero section captures attention and communicates the core value proposition.",                content={                    "headline": "Honor Dad's Distinction",                    "subheadline": "The Art of Mustache Care",                    "cta_button": "Shop Now"                }            )        },        # Add more component examples as needed    }
    sys = "Craft landing page component content. Respond in YAML with motivation and content structure as shown."        messages = [{"role": "system", "content": sys}]    messages.extend([        message for example in few_shots.values() for message in [            {"role": "user", "content": to_yaml({"input": example["input"], "concept": example["concept"], "component": component.value})},            {"role": "assistant", "content": to_yaml(example["output"])}        ]    ])    messages.append({"role": "user", "content": to_yaml({"input": input_data, "concept": concept, "component": component.value})})
    response = await client.chat.completions.create(model="gpt-4o", messages=messages)    raw_content = yaml.safe_load(sanitize_code_block(response.choices[0].message.content))    return ComponentContent(**raw_content)

六、 精心设计上下文数据

精心考虑如何向 LLM 呈现数据是至关重要的。即使是最强大的模型也需要相关和结构良好的上下文数据才能发挥最佳效果。我们不应丢弃所有的数据,而是应该选择与定义的目标相关的信息来告知模型。

async def select_components(concept: LandingPageConcept) -> List[LandingPageComponent]:    sys_template = jinja_env.from_string("""    Your task is to select the most appropriate components for a landing page based on the provided concept.    Choose from the following components:    {% for component in components %}    - {{ component.value }}    {% endfor %}    You MUST respond ONLY in a valid YAML list of selected components.    """)
    sys = sys_template.render(components=LandingPageComponent)
    prompt = jinja_env.from_string("""    Campaign title: "{{ concept.campaign_title }}"    Campaign narrative: "{{ concept.campaign_narrative }}"    Tone and style attributes: {{ concept.tone_and_style | join(', ') }}    """)
    messages = [{"role": "system", "content": sys}] + few_shots + [        {"role": "user", "content": prompt.render(concept=concept)}]
    response = await client.chat.completions.create(model="gpt-4", messages=messages)
    selected_components = yaml.safe_load(response.choices[0].message.content)    return [LandingPageComponent(component) for component in selected_components]

在实际应用中,我们可以使用 Jinja 模板来动态构建提示。例如,在选择Landing Page组件时,我们可以使用 Jinja 模板根据概念动态生成系统提示和用户提示,从而为 LLM 交互创建聚焦和相关的上下文。

在这里插入图片描述

Few-Shot Learning是 Prompt 工程中的一项重要技术。它通过向 LLM 提供相关示例来显著提高其对任务的理解。在我们讨论的方法中,我们可以将示例作为消息添加到列表中,或者直接在提示中使用与当前任务相关的示例,以帮助 LLM 更好地理解预期的输入 - 输出模式。

messages.extend([    message for example in few_shots for message in [        {"role": "user", "content": to_yaml(example["input"])},        {"role": "assistant", "content": to_yaml(example["output"])}    ]])# then we can add the user promptmessages.append({"role": "user", "content": to_yaml(input_data)})

七、 保持简单

尽管像“思想树”或“思想图”这样的高级Prompt工程技术对于研究很有吸引力,但在实际应用中往往不切实际且过于复杂。对于真实应用,应专注于设计适当的LLM架构(即工作流工程)。

这同样适用于在LLM应用中使用代理。了解标准代理和自主代理之间的区别至关重要。自主代理提供灵活性和更快的开发速度,但也可能引入不可预测性和调试挑战。因此,应谨慎使用自主代理,仅当收益明显大于潜在的控制损失和复杂性增加时才使用。

八、 不断迭代

持续实验对于改进LLM原生应用至关重要。不要害怕实验——它们可以小到只是对Prompt的微调。建立基线并跟踪改进是改进过程中的关键步骤。

另一个有用的技巧是在较弱的模型上测试Prompt。在较小的模型上表现良好的Prompt在更大的模型上会表现更好。

Prompt 工程是开发 LLM 原生应用的关键技能,通过应用上述八种技巧,我们能够创建更可靠、高效和可扩展的应用。在实际应用中,我们需要根据具体的任务和场景灵活运用这些技巧,不断实验和优化,以实现最佳的效果。同时,我们要牢记目标不是创建最复杂的系统,而是构建在现实世界中能够有效工作的应用。随着技术的不断发展,Prompt 工程的技巧也将不断演进和完善,为 LLM 应用的发展提供更强大的支持。

零基础入门AI大模型

今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

标签:concept,八大,campaign,模型,component,content,LLM,Prompt
From: https://blog.csdn.net/weixin_49895216/article/details/143325329

相关文章

  • LLM大模型: Maskformer/Mask2Former语义分割原理详解
    1、自动驾驶、机器人、电商、监控等行业都涉及到image的sematicsegmentation,传统的方式:per-pixelclassification,每个像素点都要分类;如果进一步做 instance-levelsegmentation,可能还要改networkarchiture后重新训练,很麻烦。FAIR在2021年10月份的时候发表了论文:Per-PixelC......
  • LLM论文研读: GraphRAG的替代者LightRAG
    1. 背景最近有一个很火的开源项目LightRAG,Github6.4K+星※,北邮和港大联合出品,是一款微软GraphRAG的优秀替代者,因此本qiang~得了空闲,读读论文、跑跑源码,遂有了这篇文章。2. LightRAG框架2.1 已有RAG系统的局限性1)许多系统仅依赖于平面数据表示(如纯文本),限制了根据文本中......
  • 终于有了!!!基于Langgraph使用本地LLM搭建agent!!!
    需求Langchain是使用闭源LLM实现agent搭建的,Langgraph官网给的例子是基于Claude,其他一些agent例子也是基于OPENAI的,但是对于很多私有化场景,使用本地LLM搭建agent是非常重要的。但是网上并没有相关的教程,捣鼓了两天,捣鼓出来Ollama+Langgraph实现的基于本地LLM的agent搭建模......
  • 2025秋招LLM大模型多模态面试题(十三)- rag(检索增强生成)技术
    1.基本概念检索增强LLM(RetrievalAugmentedLLM),简单来说,就是给LLM提供外部数据库,对于用户问题(Query),通过一些信息检索(InformationRetrieval,IR)的技术,先从外部数据库中检索出和用户问题相关的信息,然后让LLM结合这些相关信息来生成结果。下图是一个检......
  • AI大模型(LLMs)五大热点研究方向分享!
    近年来,人工智能大模型(LLMs)的研究不断深入,衍生出了多个热门方向,聚焦提升模型的性能、适应性与应用场景,推动了技术的突破与革新。今天为大家梳理一下AI顶会上的五大热门研究方向,希望为那些专注大模型方向的研究者带来一些灵感和参考。Part.01检索增强生成(RAG)大模型虽然在生......
  • 清华:细粒度强化学习优化LLM工具使用
    ......
  • 人大:优化工具文档提升LLM工具使用
    ......
  • 全面解释人工智能LLM模型的真实工作原理(完结)
    前一篇:《全面解释人工智能LLM模型的真实工作原理(三)》序言:本节作为整篇的收官之作,自然少不了与当今最先进的AI模型相呼应。这里我们将简单介绍全球首家推动人工智能生成人类语言的公司——OpenAI的GPT模型的基本原理。如果你也希望为人类的发展做出贡献,并投身于AI行业,这无疑是一......
  • 大模型LLM:为什么简单的乘法ChatGPT会算错?
    首先“心算”三位整数乘法不管对人类还是对模型来说都不简单的。如果使用CoT的方式就类似于“笔算”,如果使用编程的方式就类似于人拿着计算器算。我将问题更精确一点地表述为“模型如何在心算多位整数乘法上接近或超过人的水平?”这个问题困扰了我很久,简单乘法是推理能力的......
  • 全面解释人工智能LLM模型的真实工作原理(三)
    前一篇:《全面解释人工智能LLM模型的真实工作原理(二)》序言:前面两节中,我们介绍了大语言模型的设计图和实现了一个能够生成自然语言的神经网络。这正是现代先进人工智能语言模型的雏形。不过,目前市面上的语言模型远比我们设计的这个复杂得多。那么,它们到底复杂在什么地方?本节将为你......