P1 LangChain 的快速上手

0 观前须知

  • 大家好,这里是 Yukiii,一个对大模型落地应用开发感兴趣的研0学生,正在自主学习开发所需的各种技能(并且被八股折磨中),期待如果有志同道合(LangChain或八股或开发)的小伙伴请私信我,大家一起学习 😃
  • LangChain 是一个使开发者更容易地构建和部署基于 LLM 的应用程序,简化与语言模型的交互。接下来,我将持续记录自己学习 LangChain 的学习过程,本篇先介绍如何快速上手 LangChain,我的学习过程只注重如何使用,并不在意其底层实现。


1 环境配置

  • 在使用前需要 pip install 几个包,并且申请希望实用的模型的 API_KEY非常简单,要安装的包有:
pip install langchain
pip install -qU langchain-openai
pip install langchain_community
  • 演示一下如何申请模型的 API_KEY,以智谱为例,可以在 API keys 页面创建新的 API_KEY:

在这里插入图片描述

在申请完成之后,在自己的程序中添加如下环境设置:

import os

os.environ["OPENAI_API_KEY"] = <YOUR_API_KEY>
os.environ["OPENAI_API_BASE"] = "https://open.bigmodel.cn/api/paas/v4/"
  • (可选) LangSmith 是一个用于监控跟踪模型调用情况的工具,可以添加配置以测试自己模型的调用情况,同样需要申请 API_KEY,可以在设置中进入如下界面并且申请:

在这里插入图片描述

申请完成后,同样需要添加环境设置:

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = <YOUR_API_KEY>


2 工具的介绍及使用

首先,让我们先认识几个 LangChain 的工具:

  • model: 您选择使用的模型,模型具体的信息都可以在开发文档中查看,比如智谱AI的官方文档
  • StrOutputParser(): 通常模型的输入会带有一些提示信息,使用输出转换器可以只保留模型的回复。
  • PromptTemplate: 提示词模板,用于接受用户的输入,并返回输入给大模型的 prompt 信息。
  • chain: 按顺序连接 LangChain 模块,将从用户输入依次执行各个模块。

这样说还有些模糊,让我们用代码演示一下各个工具的功能,注意观察如何使用,及其各自的输出。

  • 首先观察一下 modelStrOutputParser() 的使用,这里我用的模型是 GLM-4-Air,您当然可以按照自己的喜好选择模型(开发文档中有对各模型的介绍),如果选择用其他公司的模型记得把 OPENAI-API-BASE 的配置改成相应的 url
import os

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = <YOUR_API_KEY>

os.environ["OPENAI_API_KEY"] = <YOUR_API_KEY>
os.environ["OPENAI_API_BASE"] = "https://open.bigmodel.cn/api/paas/v4/"

model = ChatOpenAI(model="GLM-4-Air")
messages = [
    HumanMessage(content="你好,我是宇宙第一大帅比,请你给简单地和我打个招呼")
]
res = model.invoke(messages)
print(res)
print('---------------------------')

parser = StrOutputParser()
res = parser.invoke(res)
print(res)

​ 输入结果如下,上面的输出是未调用输出转换器前的输出,可以发现带了很多提示信息,下面的是使用输出转换器之后的结果:

content='你好,宇宙第一大帅比!很高兴认识你,祝你今天心情愉快,帅气十足!🌟🌟🌟' 
response_metadata={
    'token_usage': {'completion_tokens': 31, 'prompt_tokens': 19, 'total_tokens': 50}, 
    'model_name': 'GLM-4-Air', 
    'system_fingerprint': None, 
    'finish_reason': 'stop', 'logprobs': None
} 
id='<this_run_id>' 
usage_metadata={'input_tokens': 19, 'output_tokens': 31, 'total_tokens': 50}
---------------------------
你好,宇宙第一大帅比!很高兴认识你,祝你今天心情愉快,帅气十足!🌟🌟🌟

​ 如果您之前配置了 LangSmith,可以在 Projects 中跟踪到调用信息:

在这里插入图片描述

  • 接下来看一下 PromptTemplatechain 是怎么个事:
system_template = "你好,你的名字叫{name},你喜欢{hobby}"
prompt_template = ChatPromptTemplate.from_messages([
    ("system", system_template),
    ("user", "{text}"),
])

res = prompt_template.invoke({
    "name": "宇宙第一大帅比",
    "hobby": "打篮球",
    "text": "你喜欢干什么"
})
messages = res.to_messages()
print(messages)

model = ChatOpenAI(model="GLM-4-Air")
parser = StrOutputParser()
chain = prompt_template | model | parser

res = chain.invoke({
    "name": "宇宙第一大帅比",
    "hobby": "打篮球",
    "text": "根据你的设定,请问你叫什么,喜欢干什么"
})
print(res)

​ 在上面的例子中我创建了一个提示词模板,通过 system_template 给了大模型一个设定,其中的参数可以自定义,之后通过 prompt_template 规定了整个流程的格式,text 是用户的输入信息。

​ 整个 chain 的过程是: 用户输入 → 提示词模板 → 模型调用 → 输出转换器。让我们看一下上面 demo 的输出:

[SystemMessage(content='你好,你的名字叫宇宙第一大帅比,你喜欢唱,跳,rap,打篮球'), 
HumanMessage(content='你喜欢干什么')]

你好,既然你给我起了个名字“宇宙第一大帅比”,那么我就按照这个角色来设定。我叫李宇宙,除了喜欢打篮球,我还热衷于探索科技和宇宙奥秘。在业余时间,我也喜欢阅读和旅行,拓宽视野,增长见识。那么你呢,你叫什么名字?有什么兴趣爱好?我们可以一起交流。


3 翻译应用的部署与调用

3.1 翻译应用的实现

现在我们已经学会了一个简单的过程,让我们试着使用学到的知识来写一个简单的翻译任务:

import os
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = <YOUR_API_KEY>
os.environ["OPENAI_API_KEY"] = <YOUR_API_KEY>
os.environ["OPENAI_API_BASE"] = "https://open.bigmodel.cn/api/paas/v4/"

system_template = "将以下内容翻译成{language},如果我指定的不是日语,请你再翻译成日语"
prompt_template = ChatPromptTemplate.from_messages([
    ("system", system_template),
    ("user", "{text}")
])
model = ChatOpenAI(model="GLM-4-Air")
parser = StrOutputParser()
chain = prompt_template | model | parser

res = chain.invoke({
    "language": "法语",
    "text": "I like StarBucks and McD, and you?",
})
print(res)

输出结果:

法语翻译:
J'aime Starbucks et McD, et toi ?
日语翻译:
私はスターバックスとマクドナルドが好きです。あなたはどうですか?

3.2 翻译任务的部署及调用

现在我们已经学会了使用基本的 LangChain 工具,但是对于我们开发者而言更重要的一点是我们如何部署并且调用 API 来使用写好的翻译程序。LangServe 帮助我们实现了这一功能。

pip install "langserve[all]"
pip install uvicorn

整个部署的代码只需要在上面的程序后加入:

FastAPI 也中可以指明如标题,版本号,描述等参数。

app = FastAPI()
add_routes(app, chain, path="/chain",)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

通过在终端中执行 python serve.py (您的文件名) 以启动服务。

LangServehttp://localhost:8000/chain/playground/ 为我们提供了一个简单的 Playground:

在这里插入图片描述

如果要在其他应用中调用的方法如下:

from langserve import RemoteRunnable

remote_chain = RemoteRunnable("http://localhost:8000/chain/")
res = remote_chain.invoke({
    "language": "英语",
    "text": "我是宇宙第一大帅比"
})
print(res)

输出结果如下:

If the specified language is not Japanese, here is the translation in English:
"I am the handsomest guy in the universe."
If the specified language is Japanese, here is the translation:
「私は宇宙一のイケメンです。」


4 参考文章及视频

https://www.bilibili.com/video/BV1pH4y1u724/?vd_source=82db6d2a70fc95916528719bf996d78a

https://open.bigmodel.cn/dev/api

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值