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
模块,将从用户输入依次执行各个模块。
这样说还有些模糊,让我们用代码演示一下各个工具的功能,注意观察如何使用,及其各自的输出。
- 首先观察一下
model
和StrOutputParser()
的使用,这里我用的模型是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
中跟踪到调用信息:
- 接下来看一下
PromptTemplate
和chain
是怎么个事:
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
(您的文件名) 以启动服务。
LangServe
在 http://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