langchain版本: V0.1.16。目前langchain更新较快,会及时更新。
目前langchain只是刚入门,对langchain的学习和理解可能会有错误,后续会回来修改。
LangChain是一个大语言模型(LLM)的应用开发框架(SDK),可以帮助开发人员快速搭建大模型应用。在Python上可以使用如下命令安装Langchain。
pip install langchain
1. Message封装和Prompt封装
1.1 Messages类
Messages对象可以用在提示词和聊天信息中。目前主要有Message
和MessageChunk
两种类型,这里仅以Message
类为主进行介绍。Message
类主要有以下几种:
- AIMessage: 大模型返回的信息,类似于OpenAI模型中
assistant
类型的消息。 - ChatMessage: ChatMessage有一个
role
字段,用于标识消息发送者的角色或类型。 - FunctionMessage/ToolMessage:函数或工具调用输出的信息(后续会补充如何在langchain上实现function calling)。
- SystemMessage: 系统角色信息,类似于OpenAI模型中
system
类型的消息。 - HumanMessage:用户角色的信息,类似于OpenAI模型中
user
类型的消息。
关于Message
类信息其用法举例如下(目前只能用到content
参数):
from langchain_core.messages import SystemMessage,HumanMessage
messages=[
SystemMessage(content="你是一个客服助手。"),
HumanMessage(content="你能有什么产品?"),
]
1.2 Prompts类
Prompt提示通常由多个组件和提示值构成。Langchain提供的prompt子类可以在以下页面上查询到: https://api.python.langchain.com/en/latest/core_api_reference.html#module-langchain_core.prompts。这里按照这些prompt的父类的分类分别介绍:
1.2.1 StringPromptTemplate类
StringPromptTemplate类主要包括以下几种prompt类:PromptTemplate
、 FewShotPromptTemplate
和FewShotPromptWithTemplates
。其用法举例如下 :
from langchain_core.prompts import PromptTemplate
prompt=PromptTemplate.from_template(template="""
你是一个专业的翻译官,现在需要你帮助翻译以下英文文本:
{text}
请翻译成中文,并输出为Markdown格式。
""",template_format="f-string")
#template_format还可以接受jinja2类型
prompt_text=prompt.format(text="hello world")
print(prompt_text)
其输出结果为:
你是一个专业的翻译官,现在需要你帮助翻译以下英文文本:
hello world
请翻译成中文,并输出为Markdown格式。
1.2.2 BaseStringMessagePromptTemplate类
BaseStringMessagePromptTemplate的主要包括以下几种prompt子类:ChatMessagePromptTemplate
、HumanMessagePromptTemplate
、AIMessagePromptTemplate
和SystemMessagePromptTemplate
。这几种prompt类经过值填充后会生成Message
类数据。其用法举例如下(以千问大模型为例):
from langchain_community.chat_models import ChatTongyi
from langchain.schema import SystemMessage,AIMessage
from langchain_core.prompts import (ChatMessagePromptTemplate,
HumanMessagePromptTemplate,
PromptTemplate)
ChatMessage=ChatMessagePromptTemplate(role='system',prompt=PromptTemplate.from_template('{content}'))
sys_msg = ChatMessage.format(content="你是一个客服助手,你叫小爱。")
usr_template = HumanMessagePromptTemplate.from_template("{usr_question}")
usr_msg=usr_template.format(usr_question="你是谁?")
chat_Model=ChatTongyi(model_name="qwen-turbo")
messages=[sys_msg,usr_msg]
res=chat_Model.invoke(messages)
print(res.content)
其返回结果如下:
我是小爱,一个客服助手,专门在这里为您提供帮助和解答问题。有什么可以帮到您的吗?
2 模型封装
Langchain封装了很多第三方的模型,主要分成了两大类:LLMs和ChatModels。目前这些模型分别封装在langchain_community.llms
和langchain_community.chat_models
中。关于这两类模型,需要注意以下几点:
- LLM: 提供大语言模型的API接口,以文本字符串作为输入,并返回文本字符串。可以用于语言生成、语言理解和文本补全等单轮任务。
- ChatModel: LLM的一种变体,主要抽象了在聊天这一场景下的使用模式。以聊天信息作为输入,并输出聊天信息。(目前还没发现这两类模型在使用上有多大区别。)下面将介绍几个主要方法的用法。
- 另外,还有一些模型的封装已经从
langchain_community
中独立里出去,以独立的第三方包langchain-{package}
形式存在,这些包需要使用pip
指令单独下载。具体的模型列表可在该页面上查询到:https://python.langchain.com/docs/integrations/platforms/ - Langchain对常见大语言模型进行了封装,但是各个大语言模型对应的python包和模型的key都需要用户自己去弄。
LLM型模型和ChatModel型模型的主要方法都类似,这里将依次对这两类模型的重要方法进行介绍(持续补充)。
2.1 invoke方法
invoke
方法调用模型并获取相应。具体用法如下:
from langchain_community.chat_models import ChatTongyi
from langchain_community.llms import Tongyi
from langchain.schema import HumanMessage,SystemMessage,AIMessage
from langchain.prompts import PromptTemplate
#chat
chatTy=ChatTongyi(model_name="qwen-turbo")
llmTy=Tongyi(model_name="qwen-turbo")
#message
messages=[
HumanMessage(content="翻译一下这段话:Hello, world!")
]
#prompt
template=PromptTemplate(
input_variables=["question"],
template="{question}"
)
template=template.format(question="你是谁啊?")
for item in [messages,template]:
chat_resp=chatTy.invoke(item) #返回Message
print(chat_resp.content)
llm_resp=llmTy.invoke(item)
print(llm_resp)
其运行结果如下:
你好,世界!
你好,世界!
我是通义千问,由阿里云开发的AI助手。我被设计用来回答各种问题、提供信息和与用户进行对话。有什么我可以帮助你的吗?
我是通义千问,由阿里云开发的AI助手。我被设计用来回答各种问题、提供信息和与用户进行对话。有什么我可以帮助你的吗?
LLMs和ChatModels的invoke方法所接收的输入(input
参数指定,这里省略了参数名)完全相同。在LLMs中invoke方法中的input参数类型为:Union[PromptValue, str, Sequence[Union[BaseMessage, Tuple[str, str], str, Dict[str, Any]]]]
。而ChatModels的同名参数类型为:LanguageModelInput
。在Langchain的源码中发现:
LanguageModelInput = Union[PromptValue, str, Sequence[MessageLikeRepresentation]]
MessageLikeRepresentation = Union[BaseMessage, Tuple[str, str], str, Dict[str, Any]]
在LangChain以前的版本中,这两类模型都内置了__call__()
函数,在该函数中,LLMs模型接收str形式的输入,ChatModels接收messages形式的输入,但这个方法已经废弃了。
2.2 generate方法
generate
接收一系列的输入并同时返回多个输出,对于这个方法,LLMs模型接收字符串形式的输入,ChatModels接收messages形式的输入。具体代码如下:
from langchain_community.chat_models import ChatTongyi
from langchain_community.llms import Tongyi
from langchain.schema import HumanMessage,SystemMessage,AIMessage
from langchain.prompts import PromptTemplate
#chat
chatTy=ChatTongyi(model_name="qwen-turbo")
llmTy=Tongyi(model_name="qwen-turbo")
#message
messages=[
[HumanMessage(content="翻译一下这段话:Hello, world!")],
[HumanMessage(content="写一首五言绝句。")]
]
prompt=['今天天气很好,我决定',"50字以内介绍西红柿鸡蛋的做法"]
chat_resp=chatTy.generate(messages) #返回Message
print(chat_resp.generations[0][0].text)
print(chat_resp.generations[1][0].text)
llm_resp=llmTy.generate(prompt) # 返回字符串
print(llm_resp.generations[0][0].text)
print(llm_resp.generations[1][0].text)
其输出结果如下(prompt让它写一首诗,它却返回了《静夜思》):
你好,世界!
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
很高兴你决定享受这样的好天气!你可以选择去户外散步,感受阳光和清新的空气,或者去公园野餐,呼吸大自然的芬芳。如果你喜欢运动,可以打打球、骑自行车或者做一些户外健身活动。如果你更喜欢安静,那么找个舒适的地方阅读一本好书,或者欣赏周围的风景也是不错的选择。无论你做什么,记得保护好自己,避免长时间暴露在阳光下,保持水分和防晒。祝你度过愉快的一天!
西红柿鸡蛋是一道家常菜,将鸡蛋打散煎至金黄,西红柿切块后与鸡蛋同炒,加盐、糖调味,翻煮均匀即可,简单快捷,色香味俱全。
参考资料
- https://zhuanlan.zhihu.com/p/647610087