怎么使用langchain加载模型?langchain加载模型的几种方式 原创
在前面关于怎么在大模型之上构建应用的文章中,简单介绍了langchain的功能以及几个核心模块,今天就其模型的功能模块介绍一下怎么加载模型。
langchain的官网架构图
目前来说langchain加载模型主要有三种形式:
加载第三方模型服务,比如openAI,阿里云通义千问,百度文心一言,chatGLM开源模型等。
包主要在langchain.llms中,代码如下所示:
from langchain.llms import ChatGLM
# 创建chatGLM模型 endpoint_url是chatGLM服务地址
glm = ChatGLM(endpoint_url="http://172.0.0.1")
resp = glm.invoke("你是谁?")
# 并发模型下,可以使用线程池的方式调用
chain = LLMChain(llm=glm)
chain.run("你是谁")
第二种是从huggingface上加载开源模型,huggingface是一个类似于github的开源模型仓库,上面有大量的开源大模型,不了解的可以看一下之前的文章Huggingface-个人和小微企业的福音。
这种方式是把大模型加载到本地,所以本地如果硬件配置不行一些模型可能会跑不起来。
开发者可以通过以下方式,对大模型进行封装API,然后对外提供服务。
from langchain import HuggingFacePipeline
from langchain import PromptTemplate, LLMChain
# 模型名词和任务类型
model = "facebook/bart-large-cnn"
task = "summarization"
# 从huggingface加载模型
llm = HuggingFacePipeline.from_model_id(model_id=model, task=task)
# 原生调用大模型
inv = llm.invoke("今天下雨了")
print("inv", inv)
template = """{input}"""
prompt = PromptTemplate(template=template, input_variables = ["input"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = """今天天气不错"""
# 使用LLMChain对象调用大模型
resp = llm_chain(question)
print("____________________________")
print("resp", resp)
# 使用线程池调用大模型
answer = llm_chain.run(question)
print("+++++++++++++++++++++++++")
print("answer", answer)
第三种是本地自定义大模型,在大部分情况下,我们直接使用第三方的模型服务或开源模型已经能够满足我们大部分需求;但在某些情况下,这些服务无法满足我们的需求,我们需要自定义模型。
但自定义模型又不能被langchain直接调用,所以我们就需要按照langchain的格式封装我们自己的大模型。也可以类似于第一种情况,把大模型打包成服务,然后让langchain通过API调用。
from langchain.llms.base import LLM
# langchain中文文档 自定义模型
# https://python.langchain.com.cn/docs/modules/model_io/models/llms/how_to/custom_llm
from typing import Any, List, Mapping, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
class CustomLLM(LLM):
n: int
@property
def _llm_type(self) -> str:
return "custom"
def _call(
self,
prompt: str,
stop: Optional[List[str]]
= None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
) -> str:
if stop is not None:
raise ValueError("stop kwargs are not permitted.")
return prompt[: self.n]
@property
def _identifying_params(self) -> Mapping[str, Any]:
"""Get the identifying parameters."""
return {"n": self.n}
总结来说,调用大模型无非两种形式,一种是通过API的方式调用,即把大模型打包成一个服务,所有请求都可以通过其提供的接口使用。类似于第一种情况。
后两种是自己部署大模型,一个是从huggingface仓库中下载模型,一个是自己设计开发模型。
第一种是langchain调用第三方大模型接口,后两种是自己直接把大模型与langchain进行集成。前者更方便,后者掌控性更强。
开发者可以根据自己的业务需求,选择合适的集成方法。
本文转载自公众号AI探索时代 作者:DFires
原文链接:https://mp.weixin.qq.com/s/fW-PGMzxBWKdN5y6dKsruQ