ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;border-bottom: 2px solid rgb(250, 81, 81);color: rgb(63, 63, 63);">深入了解langchain- 概念解惑本篇我们介绍langchain的model相关的template/prompt内容。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;background: rgb(250, 81, 81);color: rgb(255, 255, 255);">相关概念ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">任何语言模型应用程序的核心元素都是模型。LangChain 为我们提供了与任何语言模型交互的构建链。我们在初次使用 LangChain 的时候会看到llm 以及 chatLLM,很多时候我们根本分不清。本篇的所有内容都是为了让模型的使用变得更容易以及在什么情况下使用那种类型的 LLM 。所以下面是本篇的相关内容:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;list-style: circle;color: rgb(63, 63, 63);">•认识 LLM •构建模型输入的程序 •处理模型输出的程序 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;background: rgb(250, 81, 81);color: rgb(255, 255, 255);">LLM 的类型ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 3px solid rgb(250, 81, 81);color: rgb(63, 63, 63);">LLMingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">LangChain集成的模型主要有两种类型:LLM和chatLLM。它们由它们的输入和输出类定义。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">LangChain中的LLM指的是纯文本补全模型。它们包装的API将字符串prompt作为输入并输出字符串完成。OpenAI的GPT-3是纯文本补全模型。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-left: 3px solid rgb(250, 81, 81);color: rgb(63, 63, 63);">ChatLLMingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">ChatLLM也就是聊天模型,通常由LLM支持,但专门针对对话进行了调整。更重要的是,他们提供的API使用与LLM模型不同的接口。他们不是使用单个字符串,而是将聊天消息列表作为输入,并返回AI消息作为输出。GPT-4,Anthropic,Claude-2都是作为ChatLLM实现的。这两种API类型具有截然不同的输入和输出架构。这意味着与他们互动的最佳方式可能会完全不同。尽管LangChain可以互换使用它们,但这并不意味着我们开发者就必须这样做。特别是,LLM与ChatModel的提示策略可能会有很大不同。这意味着我们需要确保使用的prompt是针对正在使用的模型类型设计的。 另外,并非所有LLM都相同。不同的模型有不同的最适合他们的提示策略。例如,Anthropic的模型最适合使用 XML,而OpenAI的模型最适合使用JSON。 这意味着我们用于一种模型的提示可能不会转移到其他模型。LangChain提供了很多默认提示,但并不能保证这些提示能够很好地配合您使用的模型。从过完经历看,大多数提示在OpenAI上都能很好地工作,但没有在其他模型上进行过大量测试。 MessageChatLLM将消息列表作为输入并返回消息。有几种不同类型的消息。所有消息都有role和content属性。
role描述了LLM在传达的信息。LangChain针对不同的角色有不同的消息类别。该content属性描述了消息的内容。Message 可以是不同的类型,比如:
此外,消息还有一个additional_kwargs属性。这是可以传递有关消息的附加信息的地方。这主要用于特定于提供者而非通用的输入参数。比如OpenAI的function_call。 Hummessage这代表来自用户的消息。通常仅由内容组成 AIMessage这代表来自模型的消息。这可能包含additional_kwargs在其中 - 例如如果使用 OpenAI 函数调用functional_call。 SystemMessage这代表一条系统消息。只有部分类型的 LLM 支持此功能。这告诉模型如何表现。这通常仅包含内容。也成为角色设定. FunctionMessage这表示函数调用的结果。除了role和之外content,此消息还有一个name参数,该参数传达为产生此结果而调用的函数的名称。 ToolMessage这表示工具调用的结果。这与FunctionMessage不同,以便匹配 OpenAIfunction和tool消息类型。除了role和之外content,此消息还有一个tool_call_id参数,该参数将调用的 id 传递给被调用以产生此结果的工具。 PromptLLM的输入通常称为Prompt。通常应用程序中的用户输入并不是模型的直接输入。相反,它们的输入会以某种方式进行转换,以生成进入模型的字符串或消息列表。接受用户输入并将其转换为最终字符串或消息的对象称为“Prompt template 提示模板”。LangChain提供了多种抽象,使操作Prompt变得更加容易。
PromptValueChatModel和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 的格式。Hummessage,Systemmessage,AIMessage,FunctionMessage,ToolMessage这些类型 langchain 都帮我们形成对应的role字段的值填写在 LLM 的交互过程中。 3、有了这些函数,最后就是 prompt,prompt 是一个工程化的东西,不同的场景需要设定不同的prompt, 比如RAG场景,ReACTagent 的场景.prompt模板里面可以设定不同的内容,一般都是通过占位符,langchain都帮我们提供了相关的函数和方法自动替换。这样我们只需要关注 prompt 的主题内容即可。相关FunctionMessage,ToolMessage的占位符langchain 会帮我们执行替换,并形成最后的prompt内容提交给 LLM。
|