模型

在上篇文章里,咱们一同了解了LangChain是什么、LangChain组件的根底概念和LangChain的运用场景,现在咱们经过实例,来学习LangChain的核心组件—模型。

模型

从零开始学LangChain(2):模型
现在市面上的模型多如牛毛,各式各样的模型不断出现,最火的当属openai推出的GPT模型,GPT3.5对一切用户公开,GPT4则需求注册plus会员才干运用,国内百度文心一言、阿里通义千问也现已对部分用户开放。

LangChain模型组件供给了与各种模型的集成,并为一切模型供给一个精简的统一接口。

LangChain支撑的模型能够分为三类,它们的运用场景不同,输入和输出不同,开发者需求根据项目需求挑选相应的类型。

LLMs(大言语模型)

大言语模型接纳字符串作为输入,并回来字符串作为输出,大部分场景下运用这类模型。

从零开始学LangChain(2):模型

咱们以OpenAI的GPT模型为例,看看怎样运用这类模型组件。

首先需求安装langchain和OpenAI

pip install openai
pip install langchain

要注意的是,运用openai模型前,需求注册OpenAI API服务(不是chatGPT plus),怎样注册OpenAI API服务,能够检查OpenAI API权限注册经历共享 – 知乎 (zhihu.com),并在当时shell下增加环境变量,如下:

export OPENAI_API_KEY="你的OpenAI API token"

或许在代码中参加:

import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI API token"

导入OpenAI模型:

# 导入OpenAI模型
from langchain.llms import OpenAI

让OpenAI回来一个笑话:

llm = OpenAI(model_name="text-davinci-003", n=2, temperature=0.3)
llm("给我讲一个笑话")
#一个山公去河里洗澡,洗完后他看见自己的影子,他觉得自己太瘦了,所以他又把头放进河里洗了一遍!

运用generate方法能够一同接纳多个输入,而且回来token运用信息,如下:

llm.generate(["给我讲一个故事", "给我讲一个笑话"])
# generations=[
#   [Generation(text='\n\n一个叫玛丽的小女子,有一只叫毛毛的小猫。\n\n每天晚上,玛丽都会和毛毛一同游玩,一同跳舞,一同歌唱,一同玩游戏。\n\n有一天,玛丽和毛毛一同去海滨玩,忽然,毛毛被一只海鸥抓走了。玛丽十分悲伤,她跑到海滨哭了起来,哭着喊着毛毛的', 
#       generation_info={'finish_reason': 'length', 'logprobs': None}),
#     Generation(text='\n\n一个叫小明的男孩,他很喜爱探险。有一天,他和他的朋友们一同去森林里玩,忽然,他发现一个洞穴,他十分猎奇,所以他决定去看看洞穴里边到底有什么。\n\n他走进洞穴,里边黑暗而又潮湿,他继续前行,忽然,他看到一只大山君,它正在吃一只小兔子。', 
#       generation_info={'finish_reason': 'length', 'logprobs': None})], 
#   [Generation(text='\n\n两个熊在森林里走,一个熊说:“嘿,你知道为什么树林里没有路吗?”另一个熊回答:“不知道,为什么?”第一个熊说:“因为它们都在绕树林跑!”', generation_info={'finish_reason': 'stop', 'logprobs': None}), Generation(text='\n\n两个熊在森林里拔萝卜,一个熊拔出一个萝卜,另一个熊说:“你拔的太慢了,我拔的快一点!”', 
#       generation_info={'finish_reason': 'stop', 'logprobs': None})]
#  ] 
# llm_output={'token_usage': {'prompt_tokens': 28, 'completion_tokens': 771, 'total_tokens': 799}, 'model_name': 'text-davinci-003'}

现在LangChain支撑的LLMs模型有:

模型 介绍
AI21 docs.ai21.com/是构建了解和生成天然语…
Aleph Alpha docs.aleph-alpha.com/docs/introd…
Azure OpenAI 微软Azure供给的OpenAI云端API
Banana www.banana.dev/about-us专注于…
CerebriumAI Cerebrium是AWS Sagemaker的一个替代品,它供给对docs.cerebrium.ai/cerebrium/p…
Cohere cohere.ai/about是一家加拿大…
DeepInfra DeepInfra供给了deepinfra.com/models。
Forefront Forefront渠道让你有能力微调和运用docs.forefront.ai/forefront/m…
GooseAI GooseAI是一个彻底办理的NLP-as-a-服务,经过API交付。GooseAI供给对goose.ai/docs/models…
gpt4all github.com/nomic-ai/gp…
Hugging Face Hub huggingface.co/docs/hub/in…
Llama-cpp github.com/abetlen/lla…
Manifest github.com/HazyResearc…
Modal modal.com/docs/guide提…
NLP Cloud nlpcloud.io/供给高性能的预训练或定… API供给服务。
OpenAI platform.openai.com/docs/introd…
Petals Petals以BitTorrent的方法运转100B以上的言语模型。
PipelineAI PipelineAI允许你在云中大规模地运转你的ML模型,供给了对pipeline.ai/的API访问。
PredictionGuard 一个帮助你监测和改进生产中机器学习模型性能的渠道
PromptLayer www.promptlayer.com/是第一个允许你盯梢、管… python库中间件的人物。
Replicate replicate.com/blog/machin…
Runhouse github.com/run-house/r…
SageMakerEndpoint aws.amazon.com/sagemaker/是…
StochasticAI docs.stochastic.ai/docs/introd…
Writer writer.com/是一个运用AI提高公司…

谈天模型

谈天模型根据LLMs,不同的是LLMs的输入输出是字符串,而谈天模型的输入输出是谈天音讯。

谈天音讯包括下面几种类型,运用时需求依照约定传入合适的值:

  • AIMessage

    用来保存LLM的响应,以便在下次请求时把这些信息传回给LLM。

  • HumanMessage

    发送给LLMs的提示信息,比方“完成一个快速排序方法”

  • SystemMessage

    设置LLM模型的行为方法和方针。你能够在这里给出详细的指示,比方“作为一个代码专家”,或许“回来json格局”。

  • ChatMessage

    ChatMessage能够接纳任意方式的值,但是在大多数时间,咱们应该运用上面的三种类型

咱们看一个谈天模型的比方:

首先导入ChatOpenAI 模型:

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

让OpenAI查询ModelY的尺度数据,而且指定json格局回来:

chat = ChatOpenAI(temperature=0)
messages = [
        SystemMessage(content="回来json object,不要纯文本,依照每项参数拆分,不要说明和解释信息"),
        HumanMessage(content="告诉我model Y轿车的尺度参数")
]
print(chat(messages))
# content='{\n "车长": "4,750 mm",\n "车宽": "1,921 mm",\n "车高": "1,624 mm",\n "轴距": "2,890 mm",\n "最小离地空隙": "162 mm",\n "行李箱容积": "1,900 L"\n}' additional_kwargs={} example=False

和LLMs模型相同,谈天模型也有generate方法,接纳多组输入,回来token运用信息。

提示模板

在上面的比方中,模型默认是回来纯文本成果的,如下:

# content='以下是Model Y轿车的尺度参数:\n\n- 长度:4,750毫米\n- 宽度(包括外部镜子):2,189毫米\n- 高度:1,624毫米\n- 轴距:2,890毫米\n- 最小离地空隙:162毫米\n- 车重:1,996-2,162千克(取决于配置和电池选项)\n\n请注意,这些尺度或许因配置和选项而有所不同。' additional_kwargs={} example=False

为了让模型回来json格局的数据,我进行了很屡次测验,不断优化SystemMessage中的条件,最终才完成了需求,对于小白怎样才干快速地让AI模型回来想要的成果呢?提示模板就出现了。

提示模板就是把一些常见的提示整理成模板,用户只需求修改模板中特定的词语,就能快速精确地告诉模型自己的需求。咱们看个比方:

首先导入依赖

from langchain.chat_models import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

完成提示模板:

system_template="你是一个把{input_language}翻译成{output_language}的帮手"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
messages = chat_prompt.format_prompt(input_language="英语", output_language="汉语", text="I love programming.")
print(messages)
#messages=[SystemMessage(content='你是一个把英语翻译成汉语的帮手', additional_kwargs={}), HumanMessage(content='I love programming.', additional_kwargs={}, example=False)]

把messages传给ChatOpenAI 模型

chat = ChatOpenAI(temperature=0)
print(chat(messages.to_messages()))
# content='我喜爱编程。' additional_kwargs={} example=False

LangChain现在支撑的谈天模型有:

模型 介绍
ChatAnthropic 一个前OpenAI员工创建的AI谈天帮手,相比其他谈天工具,它的有害答案更少
AzureChatOpenAI Azure供给的OpenAI谈天模型
ChatOpenAI OpenAI谈天模型
PromptLayerChatOpenAI 根据OpenAI的提示模板渠道

文本嵌入模型(Text Embedding Model)

文本嵌入模型将字符串作为输入,回来一个浮动数的列表。

从零开始学LangChain(2):模型

嵌入(Embedding)是NLP中的一个专业名词,把不可核算的非结构化数据转换成可核算的结构化数据,比方在一个语句中,单词的序列是“A B C D E”,NLP处理这个语句时,并不是把“A”、“B”、“C”这些单词输入模型,而是把单词转换为向量,比方“A”对应的向量为[0.7 0.5],“B”对应的向量为[0.2 -0.1],再把这些向量输入模型。

文本嵌入模型能够为文本创建向量映射,这样就能在向量空间里去考虑文本,履行比如语义查找之类的操作,比方说寻觅类似的文本片段。

咱们看一个OpenAI文本嵌入模型的比方。

首先导入依赖:

from langchain.embeddings import OpenAIEmbeddings

完成文本嵌入:

embeddings = OpenAIEmbeddings()
text = "这是一个测试文档。"
query_result = embeddings.embed_query(text)
doc_result = embeddings.embed_documents([text])
print(query_result)
# [-0.009422866627573967, 0.004315766040235758, 0.002380653750151396, -0.010300650261342525, -0.010433647781610489, 0.004894305020570755, -0.018366944044828415, -0.0019317874684929848, -0.004282516892999411, -0.017076868563890457, 0.0149622093886137, 0.024006033316254616, -0.014097725972533226, 0.007141961250454187, -0.004149519372731447, 0.012588205747306347, 0.012668004259467125, -0.018712736666202545, 0.005163624882698059, -0.00768725061789155, 0.002561862813308835, 0.002515313681215048, -0.010673042386770248, 0.007840197533369064, -0.038170259445905685, 0.010819340124726295, 0.01157077495008707, -0.02557540312409401, 0.011072034947574139, -0.01421742420643568, 0.018912233412265778, ...]

在这段代码中咱们运用了embed_queryembed_documents两个方法,它们最大的不同是embed_query接纳一个字符串作为输入,而embed_documents能够接纳一组字符串,一些模型自身划分了这两个方法,LangChain也保留了下来。

LangChain集成的文本嵌入模型有:

模型
Aleph Alpha
AzureOpenAI
Cohere
Fake Embeddings
Hugging Face Hub
InstructEmbeddings
Jina
Llama-cpp
OpenAI
SageMaker Endpoint
Self Hosted Embeddings
SentenceTransformers
TensorflowHub

小结

这篇文章咱们学习了LangChain的核心组件—模型,经过示例介绍了LangChain支撑的三种模型的根本运用,在后面的教程里再去学习模型的高档操作。

因为示例触及到了提示模板,这篇文章对提示模板做了简略介绍,下篇文章咱们全面地学习提示模板是怎样工作的。