模型
在上篇文章里,咱们一同了解了LangChain是什么、LangChain组件的根底概念和LangChain的运用场景,现在咱们经过实例,来学习LangChain的核心组件—模型。
模型
现在市面上的模型多如牛毛,各式各样的模型不断出现,最火的当属openai推出的GPT模型,GPT3.5对一切用户公开,GPT4则需求注册plus会员才干运用,国内百度文心一言、阿里通义千问也现已对部分用户开放。
LangChain模型组件供给了与各种模型的集成,并为一切模型供给一个精简的统一接口。
LangChain支撑的模型能够分为三类,它们的运用场景不同,输入和输出不同,开发者需求根据项目需求挑选相应的类型。
LLMs(大言语模型)
大言语模型接纳字符串作为输入,并回来字符串作为输出,大部分场景下运用这类模型。
咱们以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)
文本嵌入模型将字符串作为输入,回来一个浮动数的列表。
嵌入(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_query
和embed_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支撑的三种模型的根本运用,在后面的教程里再去学习模型的高档操作。
因为示例触及到了提示模板,这篇文章对提示模板做了简略介绍,下篇文章咱们全面地学习提示模板是怎样工作的。