用通俗易懂的方式讲解大模型:使用 LangChain 封装自定义的 LLM,太棒了

本文主要是介绍用通俗易懂的方式讲解大模型:使用 LangChain 封装自定义的 LLM,太棒了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Langchain 默认使用 OpenAI 的 LLM(大语言模型)来进行文本推理工作,但主要的问题就是数据的安全性,跟 OpenAI LLM 交互的数据都会上传到 OpenAI 的服务器。

企业内部如果想要使用 LangChain 来构建应用,那最好是让 LangChain 使用企业内部的 LLM,这样才能保证数据不泄露。

LangChain 提供了集成多种 LLM 的能力,包括自定义的 LLM,今天我们就来介绍一下如何使用 LangChain 来集成自定义的 LLM 以及其中的实现原理。

开源大模型

虽然现在的商业大模型(OpenAI 和 Anthropic)功能十分强大,但开源大模型愈来愈有迎头赶上的趋势,比如最近刚发布的Falcon-180B[1]大模型,具备 1800 亿参数,(号称)性能甚至直逼 GPT-4。所以对于想构建 AI 应用,又不想自身数据泄露的企业来说,开源大模型是首要选择。

开源大模型也有很多选择,要根据自身的需求来考虑。比如需要大量自然语言处理的项目,选择一个专注于文本处理的模型会比选择图像或视频的模型更合适,再比如需要提供多语言的项目,那么大模型就需要支持多语言而不仅仅是英文。另外模型的大小和复杂性也是一个考虑因素,大模型虽然能够处理更复杂的任务,但它们通常需要更多的计算资源和存储空间。对于有限资源的中小企业,可能需要选择一个更轻量级的模型。

对于一些简单的应用,我们可以选择现在国内比较流行的中文开源大模型——ChatGLM 或者 BaiChuan,它们不仅支持中英文,还开源了小参数的 LLM,比如 ChatGLM2-6B、Baichuan2-13B 等。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解大模型:使用 FastChat 部署 LLM 的体验太爽了
  • 用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统
  • 用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境
  • 用通俗易懂的方式讲解大模型:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境
  • 用通俗易懂的方式讲解大模型:Llama2 部署讲解及试用方式
  • 用通俗易懂的方式讲解大模型:LangChain 知识库检索常见问题及解决方案
  • 用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统
  • 用通俗易懂的方式讲解大模型:代码大模型盘点及优劣分析
  • 用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

技术交流

建了大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述

LLM 部署

后面我们会用 LangChain 来集成 ChatGLM2 进行介绍,所以我们需要先部署 ChatGLM2-6B 这个 LLM。ChatGLM2-6B 部署有多种方式,可以使用它自身的代码仓库进行部署,也可以使用其他框架来进行部署。我们主要部署 ChatGLM2-6B 的 API 服务,具体步骤可以参考我之前的文章:使用 FastChat 部署 LLM,这里就不再赘述。

部署后的 API 服务地址我们假设是http://localhost:5000,调用/chat/completions接口会返回类似 OpenAI 接口的信息:

$ curl -X 'POST' \'http://localhost:5000/v1/chat/completions' \-H 'accept: application/json' \-H 'Content-Type: application/json' \-d '{"model": "chatglm2-6b","messages": [{"role": "user", "content": "你好"}]
}'# 输出结果
{"id": "chatcmpl-TPvsyLsybHEJ2nd953q7E2","object": "chat.completion","created": 1694497436,"model": "chatglm2-6b","choices": [{"index": 0,"message": {"role": "assistant","content": "你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 4,"total_tokens": 145,"completion_tokens": 141}
}

这个接口是兼容 OpenAI 接口的,其中 model 和 messages 参数是必须的,messages 中 role 的值有userassistant, system这几项,content 是对应角色的内容,更多参数信息可以参考OpenAI 的 API 官方文档[3]。下面我们主要使用这个 API 来封装我们的自定义 LLM。

封装自定义 LLM

使用 LangChain 封装自定义的 LLM 并不复杂,可以看下面的代码示例:

import requests
from typing import Any, List, Mapping, Optionalfrom langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLMclass CustomLLM(LLM):endpoint: str = "http://localhost:5000"model: str = "chatglm2-6b"def _call(self,prompt: str,stop: Optional[List[str]] = None,callbacks: Optional[CallbackManagerForLLMRun] = None,**kwargs: Any,) -> str:headers = {"Content-Type": "application/json"}data = {"model": self.model, "messages": [{"role": "user", "content": prompt}]}response = requests.post(f"{self.endpoint}/chat/completions", headers=headers, json=data)response.raise_for_status()result = response.json()text = result["choices"][0]["message"]["content"]return text
  • 首先我们需要创建一个类继承自LLM,然后实现_call方法

  • 方法的最主要的参数是提示词prompt,这个参数就是上面接口中的messages参数中的用户内容

  • _call方法中,我们构造 API 接口所需参数,包括 headers 和 data

  • 调用 API 接口,获取到返回结果,最后返回choicesmessage的内容

_call方法的实现逻辑就是接收用户的输入,然后将其传递给 LLM,然后获取到 LLM 的输出,最后再返回结果给用户。在方法中可以调用 API 服务,也可以用 transformer 来初始化模型然后直接调用模型进行推理,总之可以用各种方法来调用 LLM,只要能得到LLM返回的结果即可。

自定义 LLM 的其他方法

除了_call方法外,我们还需要实现其他方法,比如_llm_type方法,这个方法是用来定义 LLM 的名称,因为我们用的是 ChatGLM2-6B 模型,所以我们可以这样实现:

    @propertydef _llm_type(self) -> str:return "chatglm2-6b"

还有_identifying_params方法,这个方法是用来打印自定义 LLM 类的参数信息,方便我们做调试,它返回的是一个字典,代码示例如下:

    @propertydef _identifying_params(self) -> Mapping[str, Any]:"""Get the identifying parameters."""return {"endpoint": self.endpoint, "model": self.model}

自定义 LLM 的使用

自定义 LLM 的使用跟使用其他 LLM 一样,我们可以直接调用自定义 LLM 的实例,代码示例如下:

llm = CustomLLM()
print(llm("你好"))# 输出结果
"""
你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
"""

_call 方法的其他参数

_call方法中除了 prompt 参数外,我们还看到了其他参数,这些参数都是可选的,我们来看一下这些参数的作用:

stop

这个参数是传入一个字符串集合,当检测到 LLM 的输出内容中包含了这些字符串时,输出内容会立即截断,只保留前面的内容。比如我们得到的 LLM 结果如下:

你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。

当我们将stop参数设置为["欢迎"]时,输出结果就会变成:

你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,

如果是自定义 LLM,stop参数的逻辑也需要我们自己来实现,LangChain 其实提供了对应的工具方法,我们直接使用就可以了,代码示例如下:

from langchain.llms.utils import enforce_stop_tokensdef _call(self,prompt: str,stop: Optional[List[str]] = None,callbacks: Optional[CallbackManagerForLLMRun] = None,**kwargs: Any,) -> str:.....if stop is not None:text = enforce_stop_tokens(text, stop)

callbacks

这个参数是一个CallbackManagerForLLMRun对象,用于在 LLM 运行过程中执行回调函数,比如在 LLM 运行前后执行一些操作,比如记录日志、保存模型等。这个参数是可选的,我们使用 LangChain 提供的日志记录回调函数来演示下功能:

from loguru import logger
from langchain.callbacks import FileCallbackHandlerif __name__ == "__main__":llm = CustomLLM()logfile = "output.log"logger.add(logfile, colorize=True, enqueue=True)handler = FileCallbackHandler(logfile)result = llm("你好", stop=["欢迎"], callbacks=[handler])logger.info(result)

执行完程序后,会在当前目录下生成一个output.log文件,文件内容如下:

2023-09-12 11:28:19.029 | INFO     | __main__:<module>:110 - 你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,

注意: 在 LangChain 官方文档的示例代码中将callbacks参数写成了run_manager,其实最新代码中这个参数名已经改成了callbacks了,可能官方文档还没有及时更新。

LangChain 还提供了更多的回调方法,想了解更多信息的可以参考这个文档[4]。

LangChain 官方文档上也给出了自定义 LLM 的简单代码示例,可以参考:Custom LLM[5]。

其他自定义的 LLM

除了参考以上示例来编写自定义的 LLM 外,还可以参考 LangChain 中已经集成的其他 LLM。

ChatGLM

这个是封装比较早的 ChatGLM LLM,用的还是一代的 ChatGLM,除非部署方式一致,否则不建议直接使用该 LLM,建议参照其中的代码来实现自己的 LLM。

  • 相关文档:ChatGLM LLM[6]

  • 相关代码:chatglm.py[7]

Fake LLM

这是一个假的 LLM,用于测试,自定义内容来模拟 LLM 的输出,可以参考其中的代码来实现自己的 LLM,其中包含了流式输出,异步调用等功能的实现逻辑。

  • 相关文档:Fake LLM[8]

  • 相关代码:fake.py[9]

还有很多其他的 LLM,包括 OpenAI 的 LLM,如果感兴趣的也可以去看看它们的源码,相对会比较复杂,更多信息可以参考这里[10]。

总结

今天我们主要介绍了如何使用 LangChain 来集成自定义的 LLM,以及其中的实现原理,实现自己的 LangChain LLM 并不复杂,但如果要实现一个功能强大,性能高效的 LLM,就需要花费更多的时间和精力了,好在 LangChain 提供了一系列的工具和组件,可以帮助我们快速实现自己的功能。希望今天的文章能够帮助到大家,也希望使用过 LangChain 的同学一起来交流学习,欢迎在评论区留言。

关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。

参考:

[1]Falcon-180B: https://huggingface.co/spaces/tiiuae/falcon-180b-demo

[3] OpenAI 的 API 官方文档: https://platform.openai.com/docs/api-reference/chat/create

[4]这个文档: https://python.langchain.com/docs/modules/callbacks/

[5]Custom LLM: https://python.langchain.com/docs/modules/model_io/models/llms/custom_llm

[6]ChatGLM LLM: https://python.langchain.com/docs/integrations/llms/chatglm

[7] chatglm.py: https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/llms/chatglm.py

[8]Fake LLM: https://python.langchain.com/docs/modules/model_io/models/llms/fake_llm

[9]fake.py: https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/llms/fake.py

[10]这里: https://python.langchain.com/docs/integrations/llms/

这篇关于用通俗易懂的方式讲解大模型:使用 LangChain 封装自定义的 LLM,太棒了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553505

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma