中文文档目录
这篇文章是关于如何构建一个简单的大型语言模型(LLM)应用程序的快速入门指南。这个应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个单一的LLM调用加上一些提示。尽管如此,这是开始使用LangChain的好方法——只需一些提示和一个LLM调用,就可以构建许多特性!
概念
我们将涵盖以下概念:
- 使用语言模型
- 使用PromptTemplates(提示模板)和OutputParsers(输出解析器)
- 使用LangChain将PromptTemplate(提示模板)+ LLM(大型语言模型)+ OutputParser(输出解析器)串联起来
- 使用LangSmith调试和追踪你的应用程序
- 使用LangServe部署你的应用程序
这是一个相当多的内容!让我们开始吧。
设置
Jupyter Notebook
本指南(以及文档中的大多数其他指南)使用Jupyter笔记本,并假设读者也是如此。Jupyter笔记本非常适合学习如何使用LLM系统,因为事情有时会出错(意外输出,API宕机等),在交互式环境中通过指南是更好地理解它们的好方法。
这篇和其他教程可能最方便地在Jupyter笔记本中运行。有关如何安装的说明,请看这里。
安装
要安装LangChain,请运行:
- 使用pip
pip install langchain
- 使用conda
conda install langchain -c conda-forge
有关更多详细信息,请查看我们的安装指南。
LangSmith
你使用LangChain构建的许多应用程序将包含多个步骤,每个步骤都有多个LLM调用的调用。
随着这些应用程序变得越来越复杂,能够精确地检查链或代理内部发生的事情变得至关重要。
最好的方法是使用LangSmith。
在上述链接注册后,请确保设置你的环境变量以开始记录追踪:
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."
或者,如果在笔记本中,你可以使用以下方式设置它们:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
详细教程
在本指南中,我们将构建一个应用程序,将用户输入从一种语言翻译成另一种语言。
使用语言模型
首先,让我们学习如何单独使用语言模型。LangChain支持许多不同的语言模型,你可以互换使用——在下面选择你想要使用的模型!
- OpenAI
- Anthropic
- Cohere
- FireworksAI
- MistralAI
- TogetherAI
安装对应模型的LangChain库,以下是不同语言模型的安装脚本:
#OpenAI
pip install -qU langchain-openai
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")
#Anthropic
pip install -qU langchain-anthropic
import getpass
import os
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass()
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-sonnet-20240229")
#Google
pip install -qU langchain-google-vertexai
import getpass
import os
os.environ["GOOGLE_API_KEY"] = getpass.getpass()
from langchain_google_vertexai import ChatVertexAI
model = ChatVertexAI(model="gemini-pro")
#Cohere
pip install -qU langchain-cohere
import getpass
import os
os.environ["COHERE_API_KEY"] = getpass.getpass()
from langchain_cohere import ChatCohere
model = ChatCohere(model="command-r")
#FireworksAI
pip install -qU langchain-fireworks
import getpass
import os
os.environ["FIREWORKS_API_KEY"] = getpass.getpass()
from langchain_fireworks import ChatFireworks
model = ChatFireworks(model="accounts/fireworks/models/mixtral-8x7b-instruct")
#MistralAI
pip install -qU langchain-mistralai
import getpass
import os
os.environ["MISTRAL_API_KEY"] = getpass.getpass()
from langchain_mistralai import ChatMistralAI
model = ChatMistralAI(model="mistral-large-latest")
#TogetherAI
pip install -qU langchain-openai
import getpass
import os
os.environ["TOGETHER_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key=os.environ["TOGETHER_API_KEY"],
model="mistralai/Mixtral-8x7B-Instruct-v0.1",)
让我们首先直接使用这个模型。ChatModel
是LangChain“Runnables”的实例,这意味着它们提供了一个标准接口与它们交互。要简单地调用模型,我们可以将一系列消息传递给.invoke
方法。
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="将以下内容从英语翻译成意大利语"),
HumanMessage(content="hi!"),
]
model.invoke(messages)
AIMessage(content=‘ciao!’, response_metadata={‘token_usage’: {‘completion_tokens’: 3, ‘prompt_tokens’: 20, ‘total_tokens’: 23}, ‘model_name’: ‘gpt-4’, ‘system_fingerprint’: None, ‘finish_reason’: ‘stop’, ‘logprobs’: None}, id=‘run-fc5d7c88-9615-48ab-a3c7-425232b562c5-0’)
如果启用了LangSmith,我们可以看到这次运行已记录在LangSmith中,并且可以看到LangSmith的追踪。
输出解析器
注意,模型的响应是一个AIMessage
。这包含了一个字符串响应以及有关响应的其他元数据。通常我们可能只想处理字符串响应。我们可以使用一个简单的输出解析器来解析出这个响应。
我们首先导入简单的输出解析器。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
使用它的一种方法是单独使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。
result = model.invoke(messages)
parser.invoke(result)
‘Ciao!’
更常见的是,我们可以将模型与这个输出解析器“串联”起来。这意味着这个输出解析器将在链中的每次调用中被调用。这个链接受语言模型的输入类型(字符串或消息列表)并返回输出解析器的输出类型(字符串)。
我们可以使用|
运算符轻松创建链。在LangChain中,|
运算符用于将两个元素组合在一起。
chain = model | parser
chain.invoke(messages)
‘Ciao!’
如果我们现在查看LangSmith,我们可以看到链有两个步骤:首先调用语言模型,然后将结果传递给输出解析器。我们可以在LangSmith追踪中看到这一点。
提示模板
现在我们直接将消息列表传递给语言模型。这个消息列表从何而来?它通常是用户输入和应用程序逻辑的结合。这个应用程序逻辑通常采用原始用户输入,将其转换为准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。
PromptTemplates是LangChain中的一个概念,旨在帮助这种转换。它们接受原始用户输入并返回数据(一个提示),这些数据已准备好传递给语言模型。
让我们在这里创建一个PromptTemplate。它将接受两个用户变量:
language
:要翻译成的目标语言text
:要翻译的文本
from langchain_core.prompts import ChatPromptTemplate
system_template = “将以下内容翻译成 {language}:”
接下来,我们可以创建 PromptTemplate。这将是 的组合,system_template以及用于放置文本的更简单的模板
prompt_template = ChatPromptTemplate.from_messages([
("system", system_template),
("user", "{text}"),
])
此提示模板的输入是一本字典。我们可以单独试用此提示模板,看看它自己能做什么
result = prompt_template.invoke({"language": "italian", "text": "hi"})
result
ChatPromptValue(messages=[SystemMessage(content='将以下内容翻译成 italian:'), HumanMessage(content='hi')])
我们可以看到它返回了一个ChatPromptValue
,它由两个消息组成。如果我们想直接访问消息,我们可以这样做:
[SystemMessage(content='将以下内容翻译成 italian:'),
HumanMessage(content='hi')]
我们现在可以将这个与上面的模型和输出解析器结合起来。这将把所有三个组件串联在一起。
chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})
‘ciao’
如果我们查看LangSmith追踪,我们可以看到所有三个组件都出现在LangSmith追踪中。
使用LangServe提供服务
现在我们已经构建了一个应用程序,我们需要提供它。这就是LangServe的用处所在。LangServe帮助开发人员将LangChain链作为REST API部署。你不需要使用LangServe就可以使用LangChain,但在本指南中,我们将展示如何使用LangServe部署你的应用程序。
虽然本指南的第一部分旨在在Jupyter Notebook或脚本中运行,但我们现在将从中退出。我们将创建一个Python文件,然后从命令行与之交互。
安装LangServe:
pip install "langserve[all]"
服务器
为了为我们的应用程序创建一个服务器,我们将制作一个serve.py
文件。这将包含我们提供应用程序逻辑的内容。它由三部分组成:
- 我们刚刚构建的链的定义
- 我们的FastAPI应用程序
- 使用
langserve.add_routes
定义一个路由,从该路由提供链
#!/usr/bin/env python
from typing import List
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langserve import add_routes
# 1. 创建提示模板
system_template = "将以下内容翻译成 {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}'),
])
# 2. 创建模型
model = ChatOpenAI()
# 3. 创建解析器
parser = StrOutputParser()
# 4. 创建链
chain = prompt_template | model | parser
# 4. 应用程序定义
app = FastAPI(
title="LangChain Server",
version="1.0",
description="使用LangChain的Runnable接口的简单API服务器",
)
# 5. 添加链路由
add_routes(
app,
chain,
path="/chain",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
就是这样!如果我们执行这个文件:
python serve.py
我们应该会看到我们的链在http://localhost:8000上提供服务。
Playground
每个LangServe服务都带有一个简单的内置UI,用于配置和调用应用程序,具有流式输出和对中间步骤的可见性。
前往http://localhost:8000/chain/playground/尝试吧!输入与之前相同的输入 - {"language": "italian", "text": "hi"}
- 它应该会像以前一样响应。
客户端
现在让我们设置一个客户端,以编程方式与我们的服务进行交互。我们可以使用langserve.RemoteRunnable
轻松实现这一点。
使用此功能,我们可以与提供的链进行交互,就像它在客户端运行一样。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/chain/")
remote_chain.invoke({"language": "italian", "
‘Ciao’
``
要了解更多关于LangServe的其他功能,请访问这里。
结论
就是这样!在本教程中,我们已经走过了创建我们的第一个简单的LLM应用程序的过程。我们学习了如何使用语言模型,如何解析它们的输出,如何创建提示模板,如何使用LangSmith获得对您创建的链的出色可观察性,以及如何使用LangServe部署它们。
这只是成为熟练的AI工程师所需学习的皮毛。幸运的是——我们有很多其他资源!
要获取更深入的教程,请查看我们的教程部分。
如果您有关于如何完成特定任务的具体问题,请查看我们的操作指南部分。
要了解LangChain的核心概念,请查看我们详细的概念指南。