简介

构建在大语言模型基础上的应用通常有两种,第一种叫做text completion,也就是一问一答的模式,输入是text,输出也是text。这种模型下应用并不会记忆之前的问题内容,每一个问题都是最新的。通常用来做知识库。

还有一种是类似聊天机器人这种会话模式,也叫Chat models。这种模式下输入是一个Chat Messages的列表。从而可以保存上下文信息,让模型的回复更加真实。

实际上Chat models的底层还是LLMs,只不过在调用方式上有些变化。

简单使用LLMs

什么是LLMs呢?LLMs是Large Language Models的简称,也就是我们常说的大语言模型。

对于langchain来说,它本身并不提供大语言模型,它只是一个中间的粘合层,提供了统一的接口,方便我们对接底层的各种LLMs模型。

langchain除了可以对接OpenAI之外,还可以对接Cohere, Hugging Face等其他的大语言模型。

比如下面是openAI的使用:

from langchain.llms import OpenAI

llm = OpenAI(openai_api_key="...")

接下来就可以调用llm的方法来进行text completion了。

一般来说有两种方式。第一种方式就是直接输出:

llm("给我写首诗")

还有一种方式调用他的generate方法:

llm_result = llm.generate(["给我唱首歌", "给我写首诗"])

这种方式可以传入一个数组,用来生成比较复杂的结果。

langchain支持的LLM

现在大语言模型可谓是蓬勃发展,一不留神就可能出一个新的大语言模型。

就目前而言,基本的国外主流模型langchain都是支持的。

比如:openai,azure openai,AmazonAPI,Hugging Face Hub等等。数目繁多,功能齐全,你想要的他全都有,你没想到的他也有。

那么有小伙伴可能要问题了,langchain支不支持国产的大语言模型呢?

答案是肯定的,但并不是直接的。

如果你发现langchain并没有你想要的llm,那么你可以尝试进行自定义。

langchain为我们提供了一个类叫做LLM,我们只需要继承这个LLM即可:

class LLM(BaseLLM):

    @abstractmethod
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
) -> str:
"""Run the LLM on the given prompt and input."""

其中,唯一一个必须要实现的方法就是_call,这个方法传入一个字符串和一些可选的stop word,然后返回LLM的输出即可。

另外还可以实现一个_identifying_params方法,用来输出自定义LLM的一些参数信息。

大家可以自行尝试和接入不同的LLM模型。

一些特殊的LLM

很多时候调用LLM是需要收费的,如果我们在开发的过程中也要不断的消耗token肯定是得不偿失。

所以langchain为了给我们省钱,提供了一个FakeLLM来使用。

顾名思义,FakeLLM就是可以手动来mock一些LLM的回答,方便测试。

from langchain.llms.fake import FakeListLLM

responses = ["窗前明月光\n低头鞋两双"]
llm = FakeListLLM(responses=responses) print(llm("给我写首诗"))

上面的输出结果如下:

窗前明月光
低头鞋两双

langchain中还有一个和FakeLLM类似的叫做HumanInputLLM。

这个LLM可以打印出给用户的prompt,并且将用户的输入作为输出返回给用户,大家可以自行体验。

LLM的高级用法

除了正常的LLM调用之外,langchain还提供了一些LLM的高级用法。

异步调用

比如异步调用LLM。当然目前只支持OpenAI, PromptLayerOpenAI, ChatOpenAI 和 Anthropic这几个LLM。其他的对LLM的支持貌似正在开发中。

异步方法也很简单,主要是调用llm的agenerate方法,比如下面这样:

async def async_generate(llm):
resp = await llm.agenerate(["Hello, how are you?"])
print(resp.generations[0][0].text)

缓存功能

另外,对于一些重复的请求来说,langchain还提供了缓存功能,这样可以重复的请求就不需要再发送到LLM去了,给我们节约了时间和金钱,非常好用。

langchain提供的cache也有很多种,比如InMemoryCache,FullLLMCache,SQLAlchemyCache,SQLiteCache和RedisCache等等。

我们以InMemoryCache为例,看看是怎么使用的:

from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache() # 第一次没有使用缓存
llm.predict("Tell me a joke")
# 第二次使用了缓存
llm.predict("Tell me a joke")

使用起来很简单,只需要添加一行llm_cache即可。

如果你使用其他的cache,除了构造函数不同之外,其他的都是类似的。

保存LLM配置

有时候我们配置好了LLM之外,还可以把LLM相关的参数以文本的形式存储起来。

保存llm到文件:

llm.save("llm.json")

加载llm:

llm = load_llm("llm.json")

流式处理

LLM的速度是一个硬伤,由于返回整个响应的速度太慢了,所以推出了流式响应。只要有response返回,就传输给用户。并不需要等待所有内容都获得之后再处理。这样对用户的体验是最好的。

目前langchain只支持OpenAI,ChatOpenAI和ChatAnthropic。

要实现这个流式处理, langchain提供了BaseCallbackHandler,我们只需要继承这个类,实现on_llm_new_token这个方法即可。

当然langchain已经给我们提供了一个实现好的类叫做:StreamingStdOutCallbackHandler。下面是他的实现:

    def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
sys.stdout.write(token)
sys.stdout.flush()

使用的时候,只需要在构建llm的是传入对应的callback即可:

from langchain.llms import OpenAI
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler llm = OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0)
resp = llm("给我写首诗")

统计token数目

这个统计token使用数目的功能目前只能在openai使用。

from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2) with get_openai_callback() as cb:
result = llm("T给我写首诗")
print(cb)

总结

LLM是大语言模型最基础的模式,chat模式的底层就是基于LLM实现的。后续我们会详细介绍chat模式,尽请期待。

langchain中的LLM模型使用介绍的更多相关文章

  1. 电商系统中的商品模型的分析与设计—续

    前言     在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介 ...

  2. 图像切割之(五)活动轮廓模型之Snake模型简单介绍

    图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...

  3. ios开发——实用技术篇&Pist转模型详细介绍

    Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...

  4. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  5. EF Core中避免贫血模型的三种行之有效的方法(翻译)

    Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...

  6. js中关于Blob对象的介绍与使用

    js中关于Blob对象的介绍与使用   blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是 ...

  7. H2O中的随机森林算法介绍及其项目实战(python实现)

    H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...

  8. Django1.10中文文档—模型

      模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和操作行为.通常,每个模型都对应着数据库中的唯一一张表. 基础认识: 每个model都是一个继承django.db.models. ...

  9. 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型

    作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...

  10. Django基础核心技术之Model模型的介绍与设计

    Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Mode ...

随机推荐

  1. Python安装部署 - virtualenv虚拟环境配置(Windows)

    Python安装部署 - virtualenv虚拟环境 目录 Python安装部署 - virtualenv虚拟环境 前言 安装virtualenv 搭建虚拟环境 搭建虚拟环境指定路径 PyCharm ...

  2. Sql Server维护计划事务日志找不到目标数据库

    1.发现事务日志备份突然停止了 2.查看维护计划中的事务日志设置 3.发现备份任务中,事务日志需要指向的数据库不在 4.进入数据库属性 5.在选项中将恢复模式改为"完整"

  3. 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...

  4. 【Haxe】(二)字符串与变量的输入输出

    前言 每次学习一门新语言,各种手册和教程一上来就是讲变量如何定义,数据结构怎么用,很少有讲输入输出应该怎么写的.我比较喜欢先搞懂这部分,这让我感觉像是掌握了学习主动权,很能调动我的学习积极性.于是我的 ...

  5. 「AntV」X6开发实践:踩过的坑与解决方案

    长期更新版文档请移步语雀(「AntV」X6开发实践:踩过的坑与解决方案 (yuque.com)) ️ | 如何自定义拖拽源? 相信你们在开发中更多的需求是需要自定义拖拽源,毕竟自定义的功能扩展性高一些 ...

  6. Lucene检索全流程学习笔记

    一 简介 写作目的 1 为什么学习Lucene lucene是基于倒排索引的检索工具库,倒排索引是典型的文本匹配,它能够精确匹配用户搜索的query,它的缺点是不擅长语义理解,而深度学习检索模型擅长的 ...

  7. iOS 循环引用的问题总结

    原因: self -> Timer -> target(self), 造成循环引用 导致控制器不会销毁,不会调用dealloc 方法,内存泄漏 - (void)dealloc{ [_tim ...

  8. 图像处理评价指标_划分系数Vpc划分熵Vpe

    划分系数划分熵 评价指标划分系数Vpc和划分熵Vpe能够反映分割矩阵的模糊程度,Vpc数值越大,分割矩阵的模糊性越小,分割效果越好:Vpe数值越小,像素分类越准确,分割效果越好. (1)划分系数Vpc ...

  9. [SDOI2008] 仪仗队【题解】

    题目描述 作为体育委员,C 君负责这次运动会仪仗队的训练.仪仗队是由学生组成的 \(N \times N\) 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数 ...

  10. .NET for Apache Spark 入门演练

    .NET for Apache Spark 入门演练 微软官方文档: .NET for Apache Spark 入门 | Microsoft Learn 注意:由于本次在windows平台下进行演练 ...