LangChain入门学习笔记(五)—— Model I/O之Chat Models

news2024/11/25 0:07:15

在LangChain的组件当中,Chat Models可以说跟LLMs占据着相同的“生态位”,它也是根据用户输入的提示内容,调用底层的大模型产生内容。与LLMs不同的是,LangChain的Chat Models主要有如下一些不同:

  • 输入输出格式不同:LLMs通常接受单一的文本提示语,而Chat Models则接受一系列的Messages作为提示输入上下文,里面除了内容外还区分输入的不同角色。
  • 应用的场景不同:LLMs通常用于文本处理,比如问答、总结和创作;而Chat Models更强调的是上下文的理解和跟踪对话,引入了更多的对话逻辑。
  • 使用成本不同:针对Chat Models的使用,大模型提供商在内部结构上做了优化,这使得它的推理成本会比通用的LLMs更高。

Message类型

如前所述,Messages是Chat Models的主要输入类型,通过Messages我们可以给后端的大模型提供必要的角色和信息内容。在介绍Chat Models的使用前,先学习一下Messages的类型,便于后面的使用理解。

所有的Message都有两个属性:

  • Role:role表示这条message是谁“说”的,不同类型的Message具有不同的role。
  • Content:表示这条message的内容,即消息的文本。

根据这2个属性可以构造不同类型的Message。

Messages的主要类型见下表:

Message类型作用说明
HumanMessage表示“人”的消息,可以认为是使用者输入的信息,是对话的起点。
AIMessage表示模型的消息,是语言模型生成的响应消息,可以认为是对HumanMessage的回复。
SystemMessage

表示给予语言模型的系统指令,告知大模型该以怎样的行为响应。一般用来设置语言模型的身份、任务和语气等。

并不是每个LangChain支持的大模型都支持这个类型。

FunctionMessage表示一个可执行函数或工具的调用结果。除了role和content,本类型消息还有一个name参数,用来传达用于生成此结果的函数名称。
ToolMessage与FunctionMessage类似,表示工具调用的结果。此类型的message携带tool_call_id参数表示生成该结果的工具id。

Chat Models基本使用

作为Runnable的子类,Chat Models的使用和LLMs大同小异,主要的不同就是构造Messages对象,如下面代码所示:

from langchain_community.chat_models import ChatOllama
from langchain_core.messages import SystemMessage, HumanMessage

# 构造Messages对象,提供系统信息(SystemMessage)和用户信息(HumanMessage)。
messages = [
    SystemMessage(content="You're a helpful assistant"),
    HumanMessage(content="What is the purpose of model regularization?"),
]

# 使用的是ChatOllama类,而非Ollama
chat = ChatOllama(model="llama3")

# 返回的是AIMessage对象
response = chat.invoke(messages)

# 打印AIMessage对象的content内容
print(response.content)

当传入messages给到Chat Model的invoke方法后,返回结果在AIMessage的response对象里。打印content的内容结果如下:

与前面介绍的LLMs直接返回str类型的结果不同,Chat Models输出的结果是Chat Message,因此,如果只想要大模型回答的结果内容,需要访问content字段。

流式传输

所有实现了Runnable接口的Chat Models都默认支持ainvoke/batch/abatch/stream/astream方法。流式传输支持返回结果的iterator,这样可以用迭代的方式输出结果:

比如上面的代码调用invoke部分改成:

for trunk in chat.stream(messages):
    print(trunk.content, end="", flush=True)

最终结果一致,只是输出是迭代的流式输出。

自定义Chat Model

与自定义LLM类似,自定义Chat Model需要继承BaseChatModel,并实现方法:

  • _generate:用于根据输入的提示语生成结果。
  • _llm_type:返回属性字符串,用来唯一标志模型类型名称。

还有一些可选接口方法:

  • _agenerate:_generate的异步版本。
  • _stream / _astream:流式传输的同步/异步版本。
  • _identifying_params:用于追踪目的的模型参数属性值。

下面定义一个自定义的Chat Model叫做MyCustomChatModel,为了简单示例,这里对任何输入都返回固定的字符串:

from typing import Any, List, Optional

from langchain_core.callbacks import (
    CallbackManagerForLLMRun,
)
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import BaseMessage, AIMessage
from langchain_core.outputs import ChatGeneration, ChatResult


class MyCustomChatModel(BaseChatModel):
    def _generate(
        self,
        messages: List[BaseMessage],
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any,
    ) -> ChatResult:
        # 这里实现自己的生成逻辑,此处仅作举例所以输出固定字符串
        tokens = "I don't want to answer any question from you"
        message = AIMessage(
            content=tokens,
            additional_kwargs={},  # Used to add additional payload (e.g., function calling request)
            response_metadata={  # Use for response metadata
                "time_in_seconds": 3,
            },
        )

        generation = ChatGeneration(message=message)
        return ChatResult(generations=[generation])

    @property
    def _llm_type(self) -> str:
        return "my_custom_chat_model"


# 使用自定义的Chat Model
chat = MyCustomChatModel()

response = chat.invoke("tell me a joke about bear")
print(response.content)

结果打印如下: 

响应元数据(Response metadata)

在模型返回AIMessage中,还有一些额外的信息,模型提供商会将它们记录在AIMessage的response_metadata属性中。

使用很简单,如下直接调用ChatModel返回的AIMessage对象的response_metadata属性:

print(response.response_metadata)

在ChatOllama中返回如下(json格式化处理过):

{
  "model": "llama3",
  "created_at": "2024-06-19T13:02:40.297019706Z",
  "message": {
    "role": "assistant",
    "content": ""
  },
  "done_reason": "stop",
  "done": true,
  "total_duration": 13890899022,
  "load_duration": 7291480563,
  "prompt_eval_count": 27,
  "prompt_eval_duration": 124457000,
  "eval_count": 355,
  "eval_duration": 6327830000
}

不同提供商具体提供了哪些内容,需要查阅对应厂家的文档。通过response_metadata,有些厂家提供了Token使用的统计数据,有些提供了日志相关信息。

缓存(Caching)

具体使用和LLMs类似,具体使用方法可以参看《LangChain入门学习笔记(四)—— Model I/O之LLMs》的缓存部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aminer挖矿木马活动分析

1. aminer挖矿木马概览 近期,安天CERT通过捕风蜜罐系统[1]捕获了一批活跃的挖矿木马样本,该挖矿木马主要利用SSH和Redis弱口令暴力破解对Linux平台进行攻击。由于其初始脚本中下载挖矿文件的名称为“aminer.gz”,因此安天CERT将该挖矿木马命…

leetcode刷题(46-50)

算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写题吧。 遇事不决,可问春风,春风不语,即是本心。 我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦…

Vue发送http请求

1.创建项目 创建一个新的 Vue 2 项目非常简单。在终端中,进入您希望创建项目的目录(我的目录是D:\vue),并运行以下命令: vue create vue_test 2.切换到项目目录,运行项目 运行成功后,你将会看到以下的编译成功的提示…

Oracle中递归查询(START WITH……CONNECT BY……)

一、基本语法 在Oracle中START WITH……CONNECT BY……一般用来查找存在父子关系的数据,也就是树形结构的数据。 SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;start with [condition]:设置起点,用来限制第一层的数…

一文详解去噪扩散概率模型(DDPM)

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

AI 克隆声音,只需 3 分钟(附最全教程)

作者:寒斜 继生成式文本大模型 Chatgpt,生成式图片 Stablediffusion 之后生成式语音 Text To Speech 在开源社区也出现了一匹黑马,就是 GPT-Sovits [ 1] 。 之所以说他是黑马,让人觉得惊艳,是因为在语音效果克隆上做…

Deformable-DETR

DETR表现出来的问题 训练周期很长,相比标准的one-stage/two-stage detection在COCO上 12 epochs就能出好的结果,DETR标配200 epochs.对小目标不友好 作者指出,DETR中Transformer的问题是,在初始化的时候,网络几乎是把…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要:我们针对服务器浸没式液冷实验台进行了深入测试,探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示,该系统的制冷PUE值介于1.05至1.28之间,高效节能特点显著。 在…

在哪可以查到全网的司法诉讼信息?

司法涉诉信息指的是再司法活动中形成的各种记录和资料,涵盖了诉讼案件的立案,审判,执行等各个环节的记录和文件。比如基本案件信息,开庭信息,审判信息,执行信息等。有时候还会涉及到被执行人,司…

创建进程的常用方式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中有多个模块可以创建进程,比较常用的有os.fork()函数、multiprocessing模块和Pool进程池。由于os.fork()函数只适用于Unix/Linu…

常见的创建型设计模式( 一 )

设计模式( 一 ) 常见的创建型设计模式 1.单例模式 : 确保一个类只有一个实例 , 为整个程序提供一个全局的访问接口。getInstance 实现方式 饿汉式,在调用getInstance 创建实例的时候 ,实例已经存在了 ,不需要我们再次去 new创建。 优点&a…

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后,需要用Pytorch编写Transformer,下面是写代码的过程中的总结,结构根据图解Transformer进行说明。 import numpy as …

stable diffusion 局部重绘 reference-only api 接口调试

webUI api payload 插件生成的接口参数不准确,reference-only 的image不是对象,就是不同字符串字段,直接传,不是套image。 综上,那个插件参数不确定,应直接看插件的源码,看它接受什么参数 错误…

校园车辆管理系统的设计与实现

第1章 绪论 1.1 研究背景与意义 随着高等教育的普及和扩张,大学校园已成为一个综合性的小型社会。教学楼、实验室、宿舍、体育设施等构成了庞大且复杂的校园基础设施。在这样的环境下,教师、学生、家长及访客的车辆数量也随之增多,这不仅带来…

UI设计师是不是青春饭?你摆烂,啥工作都是青春饭!

一、UI设计师的岗位职责包括: 用户研究和需求分析:了解用户需求、行为和偏好,进行用户调研和用户体验测试,以便设计出符合用户期望的界面。制定设计方案:根据用户需求和产品定位,制定UI设计方案&#xff0c…

[手机Linux PostmarketOS]一,1加6T真正的手机Linux系统

前面用Linux deploy软件安装了Linux系统在手机,实则不是真正的手机刷成了linux系统,而是通过Linux deploy软件在容器里安装了Linux系统,在使用方面会有诸多限制,并不能发挥Linux的真实强大之处,于是我又百度又谷歌(真不…

标准化的力量:如何通过PDM提升企业研发效率

在当今竞争激烈的市场环境中,企业必须不断优化其产品开发流程以保持竞争力。PDM产品数据管理系统与企业标准化的结合,为企业提供了一种有效的方法来管理和优化其研发流程。本文将探讨PDM与企业标准化的概念,它们在企业中的相互作用&#xff0…

上市公司-社会责任报告、ESG报告文本(2006-2023年)

上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件,涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响、提升社会福祉、维护员工权益、促进社区发展以及确保透明和道德的管理实践等方面的信息和数据。有助于了…

基于Pytorch框架的深度学习Swin-Transformer神经网络食物分类系统源码

第一步:准备数据 5种鸟类数据:self.class_indict ["苹果派", "猪小排", "果仁蜜饼", "生牛肉薄片", "鞑靼牛肉"] ,总共有5000张图片,每个文件夹单独放一种数据 第二步&…

PS系统教程23

减淡加深海绵工具 减淡工具 作用:提炼物体颜色 加深工具 作用:变暗物体颜色,加深物体深度 海绵工具 作用:修正物体饱和度,加大纯度 减淡工具 老套路,找一个图片 复制新建粘贴Ctrl键J复制图层选择减…