Langchain实战第二课 | 豆包MarsCode AI 刷题

17 阅读13分钟

学习基于LangChain实战课(掘金小册) | 青训营X豆包MarsCode AI 刷题 - AI方向

主题:【第二部分】基础篇 Ⅰ

类型:实践记录/学习体验/学习方法


学习目录路径:图源小册介绍

基础篇Ⅰ

4模型I/O:输入提示、调用模型、解析输出学习时长: 20分3秒

5提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案学习时长: 24分9秒

6提示工程(下):用思维链和思维树提升模型思考质量学习时长: 15分10秒

7调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?学习时长: 22分54秒

8输出解析:用OutputParser生成鲜花推荐列表学习时长: 26分8秒

Langchain实战第二课 基础篇Ⅰ

一、引言

LangChain 作为一个强大的框架,在与大语言模型交互中发挥着重要作用。本文将深入探讨 LangChain 大模型基础中的关键部分,包括提示工程的不同方法以及输出解析的多种方式。通过对这些内容的学习,我们将更好地理解如何利用 LangChain 构建高效的语言模型应用。

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它不仅可以连接语言模型与其他数据源,还提供了一系列工具和方法,使得构建强大的语言模型应用变得更加容易。

在 LangChain 大模型基础中,提示工程是一个重要的环节。提示工程旨在通过构建合适的提示,引导语言模型生成更准确、更有用的输出。本文将介绍 LangChain 中的提示工程方法,包括少样本 FewShotTemplate 和 ExampleSelector 的使用,以及思维链和思维树的应用,以提升模型思考质量。

此外,输出解析也是 LangChain 中的关键部分。语言模型的输出通常是文本形式,但在实际应用中,我们往往需要将其转换为结构化的数据,以便进行进一步的处理和分析。本文将介绍 LangChain 中的输出解析器,包括结构化输出解析器、Pydantic 解析器等,以及自动修复解析器和重试解析器的使用,以帮助我们更好地处理语言模型的输出。

通过对 LangChain 大模型基础的学习,我们可以更好地利用语言模型的能力,构建高效、智能的应用程序。无论是处理非结构化文件、结构性文件,还是与数据库进行交互,LangChain 都为我们提供了强大的工具和方法。让我们一起深入探索 LangChain 的世界,发挥语言模型的最大潜力。

二、模型 I/O 概述

  1. 输入提示、调用模型、解析输出:LangChain 将对模型的使用过程拆解为输入提示、调用模型和解析输出三个环节,这一过程被统称为 Model I/O。在实际应用中,首先通过输入提示将特定的任务或问题转化为模型能够理解的格式,然后调用模型进行处理,最后通过解析输出将模型的回答转换为更适合实际应用的结构化数据。
  2. 提示模板:使用模型的第一个环节是把提示信息输入到模型中,LangChain 提供了多种提示模板,方便根据实际需求动态选择不同的输入。提示模板可以根据具体的任务和应用进行调整,例如为销售的每一种鲜花生成一段简介文案时,可以使用特定的提示模板,其中包含花的名称和价格等变量,通过动态替换这些变量,生成不同鲜花的文案提示。
  3. 语言模型:LangChain 支持多种类型的语言模型,包括大语言模型(LLM)、聊天模型(Chat Model)和文本嵌入模型(Embedding Model)。大语言模型如 Open AI 的 text-davinci-003、Facebook 的 LLaMA、ANTHROPIC 的 Claude 等,将文本字符串作为输入并返回文本字符串作为输出;聊天模型主要代表 Open AI 的 ChatGPT 系列模型,其 API 更加结构化,输入为聊天消息列表,输出为聊天消息;文本嵌入模型如 OpenAI 的 text-embedding-ada-002,负责把文档存入向量数据库,与提示工程关系不大。
  4. 输出解析:LangChain 提供了从模型输出中提取信息的功能,可将非结构化文本转换成程序可以处理的结构化数据。例如,在为鲜花生成文案的应用中,可以通过输出解析器将模型输出的一段文字转换为包含描述文案和撰写原因的 Python 字典结构,或者将其存储为 CSV 文件,以便进行进一步的数据分析和处理。输出解析器有多种类型,如列表解析器用于处理模型生成的输出为列表的情况,日期时间解析器用于确保模型输出的是正确的日期或时间格式,枚举解析器用于处理预定义的一组值,结构化输出解析器用于处理复杂的结构化输出,Pydantic(JSON)解析器用于处理模型输出为符合特定格式的 JSON 对象,自动修复解析器可以自动修复某些常见的模型输出错误,重试解析器用于在模型初次输出不符合预期时尝试修复或重新生成新的输出。

三、提示工程(上):FewShotTemplate 和 ExampleSelector

  1. 提示的结构
    • 指令(Instuction):告诉模型任务大概要做什么、怎么做,比如 “你是一个有用的鲜花文案撰写助手”。这样的指令可以让模型更好地理解自己的角色和任务,从而更认真地对待生成鲜花文案这个任务。
    • 上下文(Context):可以通过矢量数据库检索到与鲜花相关的知识,或者通过其他方式获取关于不同鲜花的特点、寓意等信息,作为模型生成文案的额外知识来源。
    • 提示输入(Prompt Input):具体的问题或任务,例如 “请为售价为 [具体价格] 的 [具体花名] 生成一个吸引人的简短描述”,作为变量传递给提示模板。
    • 输出指示器:可以用特定的词语或符号标记生成文本的开始,比如在生成鲜花文案时,可以用 “以下是为您生成的鲜花描述:” 作为输出指示器。
  2. LangChain 提示模板的类型
    • PromptTemplate:最常用的 string 提示模板,可自动提取变量名称。例如在为鲜花店生成公司名字的任务中,“你是业务咨询顾问。对于一个面向 {market} 市场的,专注于销售 {product} 的公司,你会推荐哪个名字?” 这个模板中,{product} 和 {market} 会自动被识别为变量,通过 format 方法可以替换占位符。
    • ChatPromptTemplate:用于聊天模型,有不同的消息角色。例如在 OpenAI 的 Chat Model 中,消息有系统、用户和助理三种角色。在为鲜花公司起名的任务中,可以使用 SystemMessagePromptTemplate 定义系统消息,如 “你是一位专业顾问,负责为专注于 {product} 的公司起名。”,用 HumanMessagePromptTemplate 定义用户消息,如 “公司主打产品是 {product_detail}。”,然后通过 from_messages 方法整合不同的提示模板,生成聊天提示。
    • FewShotPromptTemplate:通过示例展示来 “教” 模型如何回答。例如在为不同场合的鲜花生成广告文案的任务中,首先创建一些示例样本,每个示例都是一个字典,包含输入变量 “flower_type”(花的类型)、“occasion”(场合)和 “ad_copy”(广告文案)。然后配置一个提示模板,将示例格式化为字符串,使用 PromptTemplate 对象。接着通过示例和提示模板,创建 FewShotPromptTemplate 对象,生成更复杂的提示。最后将提示传递给大模型,根据提示得到所需的文案。
    • PipelinePrompt:用于把几个提示组合在一起使用,可以根据不同的任务需求,将多个提示模板组合成一个管道,依次执行每个提示,从而实现更复杂的任务。
    • 自定义模板:基于其他模板类定制自己的提示模板,可以根据特定的应用场景和需求,对现有的提示模板进行修改和扩展,以满足个性化的需求。
  3. 使用 PromptTemplate
    • 通过 from_template 方法创建提示模板对象,并使用 format 方法替换占位符。例如在为鲜花店生成公司名字的任务中,“你是业务咨询顾问。你给一个销售 {product} 的电商公司,起一个好的名字?” 这个原始提示模板,通过 PromptTemplate.from_template (template) 创建提示模板对象,然后使用 prompt.format (product="鲜花") 将 {product} 替换为 “鲜花”,得到具体的提示。
    • 也可通过构造函数手工指定 input_variables。例如在为面向特定市场销售特定产品的公司起名的任务中,可以使用 PromptTemplate (input_variables=["product", "market"], template="你是业务咨询顾问。对于一个面向 {market} 市场的,专注于销售 {product} 的公司,你会推荐哪个名字?"),通过构造函数手工指定输入变量,然后使用 format 方法替换占位符。
  4. 使用 ChatPromptTemplate
    • 针对聊天模型,不同的消息角色对应不同的模板。在 OpenAI 的 Chat Model 中,消息有系统、用户和助理三种角色。例如在为鲜花公司起名的任务中,可以使用 SystemMessagePromptTemplate 定义系统消息,如 “你是一位专业顾问,负责为专注于 {product} 的公司起名。”,用 HumanMessagePromptTemplate 定义用户消息,如 “公司主打产品是 {product_detail}。”。
    • 通过 from_messages 方法整合不同的提示模板,生成聊天提示。例如在为鲜花公司起名的任务中,使用 ChatPromptTemplate.from_messages ([system_message_prompt, human_message_prompt]) 整合系统消息和用户消息的提示模板,生成聊天提示,然后将提示传递给模型,得到模型的回答。
  5. FewShot 的起源
    • Few-Shot、One-Shot 和 Zero-Shot 的概念起源于机器学习,旨在让机器学习模型在极少量甚至没有示例的情况下学习新的概念或类别。例如在语言模型中,Few-Shot 学习是指模型会被给予几个示例,以帮助模型理解任务,并生成正确的响应;One-Shot 学习是指只给模型一个示例;Zero-Shot 学习是指模型只根据任务的描述生成响应,不需要任何示例。
    • OpenAI 的 GPT-3 模型通过提升模型规模,实现了出色的 Few-Shot 学习性能。在介绍 GPT-3 模型的重要论文《Language models are Few-Shot learners》中,指出 GPT-3 模型作为一个大型的自我监督学习模型,通过提升模型规模,能够在 Few-Shot 学习设置中表现出色。
  6. 使用 FewShotPromptTemplate
    • 创建示例样本:创建一些示例,作为提示的样本,每个示例都是一个字典,包含输入变量和对应的值。例如在为不同场合的鲜花生成广告文案的任务中,创建了一个包含四个字典的列表 samples,每个字典代表一种花的类型、适合的场合和对应的广告文案。
    • 创建提示模板:配置一个提示模板,将示例格式化为字符串,使用 PromptTemplate 对象。例如在为不同场合的鲜花生成广告文案的任务中,使用 “鲜花类型: {flower_type}\n 场合: {occasion}\n 文案: {ad_copy}” 这个模板字符串,通过 PromptTemplate (input_variables=["flower_type", "occasion", "ad_copy"], template=template) 创建提示模板对象。
    • 创建 FewShotPromptTemplate 对象:通过示例和提示模板,创建 FewShotPromptTemplate 对象,生成更复杂的提示。例如在为不同场合的鲜花生成广告文案的任务中,使用 FewShotPromptTemplate (examples=samples, example_prompt=prompt_sample, suffix="鲜花类型: {flower_type}\n 场合: {occasion}", input_variables=["flower_type", "occasion"]) 创建 FewShotPromptTemplate 对象。
    • 调用大模型创建新文案:将提示传递给大模型,根据提示得到所需的文案。例如在为不同场合的鲜花生成广告文案的任务中,使用 model (prompt.format (flower_type="野玫瑰", occasion="爱情")) 将提示传递给大模型,得到新的广告文案。
  7. 使用示例选择器
    • 如果示例很多,一次性发送给模型不现实且低效,LangChain 提供了示例选择器,可选择最合适的样本。例如在为不同场合的鲜花生成广告文案的任务中,如果有很多示例,可以使用 SemanticSimilarityExampleSelector 根据语义相似性选择最相关的示例,节省 Token 用量。具体步骤是先初始化示例选择器,然后创建一个使用示例选择器的 FewShotPromptTemplate 对象,最后将提示传递给大模型,得到所需的文案。

四、总结

提示工程在 LangChain 中起着至关重要的作用,通过不同的提示模板和方法,可以更好地引导模型生成准确、高质量的输出。FewShotPromptTemplate 和 ExampleSelector 为我们提供了一种有效的方式,通过提供示例和选择合适的样本,提高模型的回答质量。

FewShotPromptTemplate 的核心在于利用示例来指导模型生成输出。在实际应用中,我们可以根据具体的任务需求,创建多个示例样本,每个样本都是一个包含输入变量和对应输出的字典。通过配置提示模板,将示例格式化为字符串,然后使用 FewShotPromptTemplate 对象,结合示例和提示模板,生成更复杂的提示。最后,将提示传递给大模型,模型会根据示例的模式和提示的要求,生成符合任务需求的输出。

ExampleSelector 则在示例较多的情况下发挥作用。当我们有大量的示例时,一次性将所有示例发送给模型是不现实且低效的。ExampleSelector 可以根据语义相似性选择最相关的示例,避免将过多的无关模板传递给大模型,从而节省 Token 的用量,提高模型的效率。

在实际应用中,我们可以根据具体任务和需求,灵活选择不同的提示工程方法,以获得最佳的效果。例如,在为鲜花生成广告文案的任务中,FewShotPromptTemplate 和 ExampleSelector 的结合使用,可以让模型根据不同的花的类型和场合,生成更具针对性和吸引力的广告文案。同时,我们还可以根据实际情况,选择不同的语言模型、输出解析器等,以构建高效、智能的语言模型应用。

总之,提示工程是 LangChain 大模型基础中的重要组成部分,通过合理运用提示模板和方法,可以充分发挥语言模型的潜力,为各种应用场景提供准确、有用的输出。