langchain中的LLM模型使用介绍
简介
构建在大语言模型基础上的应用通常有两种,第一种叫做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模型使用介绍的更多相关文章
- 电商系统中的商品模型的分析与设计—续
前言 在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介 ...
- 图像切割之(五)活动轮廓模型之Snake模型简单介绍
图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...
- ios开发——实用技术篇&Pist转模型详细介绍
Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...
- 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML
在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- js中关于Blob对象的介绍与使用
js中关于Blob对象的介绍与使用 blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是 ...
- H2O中的随机森林算法介绍及其项目实战(python实现)
H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...
- Django1.10中文文档—模型
模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和操作行为.通常,每个模型都对应着数据库中的唯一一张表. 基础认识: 每个model都是一个继承django.db.models. ...
- 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型
作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...
- Django基础核心技术之Model模型的介绍与设计
Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Mode ...
随机推荐
- 图数据库 NebulaGraph 的内存管理实践之 Memory Tracker
数据库的内存管理是数据库内核设计中的重要模块,内存的可度量.可管控是数据库稳定性的重要保障.同样的,内存管理对图数据库 NebulaGraph 也至关重要. 图数据库的多度关联查询特性,往往使图数据库 ...
- 1 msql的安装和配置
1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步使用yum安装时会报错: yum list installed | grep mysql mysql-libs.i686 ...
- Flutter调优--深入探究MediaQuery引起界面Rebuild的原因及解决办法
前言 我们可以通过MediaQuery.of(context)方法获取到一些设备和系统的相关信息,比如状态栏的高度.当前是否是黑暗模式等等,使用起来相当方便,但是也要注意可能引起的页面rebuild问 ...
- 【python基础】基本数据类型-数字类型
Python3 支持int(整型数据).float(浮点型数据).bool(布尔类型) 1.int(整型数据) 在Python 3里,只有一种整数类型 int,表示为长整型.像大多数语言一样,数值类型 ...
- 一分钟学一个 Linux 命令 - ls
前言 大家好,我是 god23bin.今天我给大家带来的是 Linux 命令系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天,我们要介绍的是一个常用而又强大的命令:ls(list). 什 ...
- java中接口,抽象类,具体类之间的关系
抽象类实现接口,具体类继承于抽象类
- 论c++实现sql连接
寻找关于c++ 对 sql连接的过程非常艰辛. 今天要做一个简单项目,要求在远程sql上实现对数据的实时模拟,每五分钟进行一次随机产生数据并写入. 在此之前我并没有用过代码实现sql连接的经历,在翻阅 ...
- #PowerBi Superchange PowerBi 序言部分笔记(2)
Xmind本文思维导图 序言部分,主要讲述了BI的分类及发展,以及作者推荐的学习方法.重点是介绍了powerbi的主要四大步骤. 即: 一:数据采集 Data acquisition: Power B ...
- 探秘高逼格艺术二维码的制作过程-AI绘画图生图
在之前的文章<AI制作艺术二维码-文生图>中,我介绍了一种直接通过提示词生成高逼格二维码的方法,但是通过提示词我们无法很好的控制生成图片的样式,特别是有些同学想要将自己的Logo或者头像附 ...
- 基于 Surfel 的实时全局光照方案(Surfel-based Global Illumination)
目录 Global Illumination based on Surfels [SIGGRAPH 2021] Surfel 持久化存储 surfel 数据组成 surfel 回收机制 Surfeli ...