Langchain:模型I/O封装

langchain版本: V0.1.16。目前langchain更新较快,会及时更新。
目前langchain只是刚入门,对langchain的学习和理解可能会有错误,后续会回来修改。

  LangChain是一个大语言模型(LLM)的应用开发框架(SDK),可以帮助开发人员快速搭建大模型应用。在Python上可以使用如下命令安装Langchain。

pip install langchain

1. Message封装和Prompt封装

1.1 Messages类

  Messages对象可以用在提示词和聊天信息中。目前主要有MessageMessageChunk两种类型,这里仅以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类:PromptTemplateFewShotPromptTemplateFewShotPromptWithTemplates。其用法举例如下 :

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子类:ChatMessagePromptTemplateHumanMessagePromptTemplateAIMessagePromptTemplateSystemMessagePromptTemplate。这几种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.llmslangchain_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让它写一首诗,它却返回了《静夜思》):

你好,世界!
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
很高兴你决定享受这样的好天气!你可以选择去户外散步,感受阳光和清新的空气,或者去公园野餐,呼吸大自然的芬芳。如果你喜欢运动,可以打打球、骑自行车或者做一些户外健身活动。如果你更喜欢安静,那么找个舒适的地方阅读一本好书,或者欣赏周围的风景也是不错的选择。无论你做什么,记得保护好自己,避免长时间暴露在阳光下,保持水分和防晒。祝你度过愉快的一天!
西红柿鸡蛋是一道家常菜,将鸡蛋打散煎至金黄,西红柿切块后与鸡蛋同炒,加盐、糖调味,翻煮均匀即可,简单快捷,色香味俱全。

参考资料

  1. https://zhuanlan.zhihu.com/p/647610087
  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值