AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


深入了解 langchain - 概念解惑
发布日期:2024-06-05 08:31:05 浏览次数: 2030 来源:知识派


深入了解 langchain - 概念解惑

本篇我们介绍 langchain 的 model 相关的template/prompt 内容。

相关概念

任何语言模型应用程序的核心元素都是模型。LangChain 为我们提供了与任何语言模型交互的构建链。我们在初次使用 LangChain 的时候会看到llm 以及 chatLLM,很多时候我们根本分不清。本篇的所有内容都是为了让模型的使用变得更容易以及在什么情况下使用那种类型的 LLM 。所以下面是本篇的相关内容:

  • • 认识 LLM

  • • 构建模型输入的程序

  • • 处理模型输出的程序

LLM 的类型

LLM

LangChain 集成的模型主要有两种类型:LLM 和 chatLLM。它们由它们的输入和输出类定义。

LangChain 中的 LLM 指的是纯文本补全模型。它们包装的 API 将字符串prompt作为输入并输出字符串完成。OpenAI 的 GPT-3是纯文本补全模型。

ChatLLM

ChatLLM 也就是聊天模型,通常由LLM支持,但专门针对对话进行了调整。更重要的是,他们提供的 API 使用与 LLM 模型不同的接口。他们不是使用单个字符串,而是将聊天消息列表作为输入,并返回 AI 消息作为输出。GPT-4AnthropicClaude-2 都是作为ChatLLM实现的。

这两种 API 类型具有截然不同的输入和输出架构。这意味着与他们互动的最佳方式可能会完全不同。尽管 LangChain 可以互换使用它们,但这并不意味着我们开发者就必须这样做。特别是,LLM 与 ChatModel 的提示策略可能会有很大不同。这意味着我们需要确保使用的prompt是针对正在使用的模型类型设计的。

另外,并非所有 LLM 都相同。不同的模型有不同的最适合他们的提示策略。例如,Anthropic 的模型最适合使用 XML,而 OpenAI的模型最适合使用 JSON

这意味着我们用于一种模型的提示可能不会转移到其他模型。LangChain 提供了很多默认提示,但并不能保证这些提示能够很好地配合您使用的模型。从过完经历看,大多数提示在 OpenAI 上都能很好地工作,但没有在其他模型上进行过大量测试。

Message

ChatLLM 将消息列表作为输入并返回消息。有几种不同类型的消息。所有消息都有 role和 content属性。

role描述了LLM在传达的信息。LangChain针对不同的角色有不同的消息类别。该content属性描述了消息的内容。Message 可以是不同的类型,比如:

  • • 字符串(大多数 model 都是这样)

  • • 字典列表(用于多模式输入,其中字典包含有关该输入类型和该输入参数的信息)

此外,消息还有一个additional_kwargs属性。这是可以传递有关消息的附加信息的地方。这主要用于特定于提供者而非通用的输入参数。比如 OpenAI 的function_call

Hummessage

这代表来自用户的消息。通常仅由内容组成

AIMessage

这代表来自模型的消息。这可能包含additional_kwargs在其中 - 例如如果使用 OpenAI 函数调用functional_call

SystemMessage

这代表一条系统消息。只有部分类型的 LLM 支持此功能。这告诉模型如何表现。这通常仅包含内容。也成为角色设定.

FunctionMessage

这表示函数调用的结果。除了role和之外content,此消息还有一个name参数,该参数传达为产生此结果而调用的函数的名称。

ToolMessage

这表示工具调用的结果。这与 FunctionMessage 不同,以便匹配 OpenAI functiontool消息类型。除了role和之外content,此消息还有一个tool_call_id参数,该参数将调用的 id 传递给被调用以产生此结果的工具。

Prompt

LLM 的输入通常称为Prompt。通常应用程序中的用户输入并不是模型的直接输入。相反,它们的输入会以某种方式进行转换,以生成进入模型的字符串或消息列表。接受用户输入并将其转换为最终字符串或消息的对象称为“Prompt template 提示模板”。LangChain提供了多种抽象,使操作Prompt变得更加容易。

PromptValue

ChatModel 和 LLM 采用不同的输入类型。PromptValue 是一个设计为可在两者之间互操作的类。它公开了一个要转换为字符串的方法(与 LLM 一起使用)和另一个要转换为消息列表的方法(与 ChatModel 一起使用)。

PromptTemplate

这由模板字符串组成。然后使用用户输入格式化该字符串以生成最终字符串。

MessagePromptTemplate

它由一条模板消息(表示特定角色)和一个 PromptTemplate 组成。然后,此 PromptTemplate 将根据用户输入进行格式化,以生成成为此消息的最终字符串content。还有一些:

  • • HumanMessage 的 MessagePromptTemplate

  • • AIMessage 的 MessagePromptTemplate

  • • SystemMessage 的 MessagePromptTemplate

Messagesplaceholder

通常提示的输入可以是消息列表。这是我们需要使用 MessagesPlaceholder 的时候。这些对象由variable_name参数参数化。与该值相同的输入variable_name就是消息列表。

ChatPromptTemplate

这由 MessagePromptTemplates 或 MessagePlaceholders 的列表组成。然后根据用户输入对这些内容进行格式化以生成最终的消息列表。

输出 params

模型的输出是字符串或消息。通常字符串或消息包含以供下游使用的特定格式格式化的信息(例如,逗号分隔列表或 JSON blob)。输出解析器负责接收模型的输出并将其转换为更可用的形式。这些通常适用于content输出消息的值,但有时也适用于additional_kwargs字段中的值。

StrOutputParser这是一个简单的输出解析器,仅将语言模型(LLM 或 ChatModel)的输出转换为字符串。如果模型是 LLM(因此输出一个字符串),它只会传递该字符串。如果输出是 ChatModel(因此输出消息),则它会传递.content消息的属性。

OpenAI FuncallCall

有一些解析器专门用于处理 OpenAI 函数调用。function_call他们获取arguments参数的输出additional_kwargs并使用这些参数.

agents是使用语言模型来确定要采取哪些步骤的系统。因此需要将语言模型的输出解析为某种可以表示要采取的操作(如果有)的模式。AgentOutputParsers 负责获取原始 LLM 或 ChatModel 输出并将其转换为该模式。这些输出解析器内部的逻辑可能会有所不同,具体取决于所使用的模型和提示策略。

总结

1、上面介绍了 LLM 的两种类型(LLM,ChatLLm)他们的区别是 LLM 只是单轮对话,而 ChatLLM 是续写模式,也就是通常的多伦对话。这种模型可以简单的记住历史对话的内容。不过现在的相关的 LLM 厂商已经淡化单轮还是续写,所以我们以后可以使用 ChatLLM 就可以了。

2、我们跟 LLM 去对话,就需要 prompt, langchain 提供了几个函数可以帮助我们定义 prompt 的格式。 HummessageSystemmessage,AIMessage,FunctionMessage,ToolMessage 这些类型 langchain 都帮我们形成对应的 role 字段的值填写在 LLM 的交互过程中。

3、有了这些函数,最后就是 prompt,prompt 是一个工程化的东西,不同的场景需要设定不同的 prompt, 比如 RAG 场景,ReACT agent 的场景. prompt 模板里面可以设定不同的内容,一般都是通过占位符,langchain 都帮我们提供了相关的函数和方法自动替换。这样我们只需要关注 prompt 的主题内容即可。相关FunctionMessage,ToolMessage的占位符langchain 会帮我们执行替换,并形成最后的 prompt 内容提交给 LLM。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询