01基于Langchain开发并部署一个简单大模型应用

基于Langchain开发并部署一个简单大模型应用

https://python.langchain.com/v0.2/docs/tutorials/llm_chain/

在这个快速入门中,我们将向您展示如何构建一个简单的LLM应用程序。此应用程序将把英文翻译成其他语言。这是一个相对简单的LLM应用程序 - 它只是一个加上一些提示词的LLM调用。然而,这是开始使用LangChain的好方法 - 很多功能只需要一些提示和一个LLM调用就可以构建出来!

相关概念

我们将涵盖的概念包括:

  • 语言模型:gpt3.5、kimi、文心一言
  • PromptTemplates :提示词模版
  • OutputParsers:输出转换器
  • LangChain Expression Language (LCEL):以下我们称之为“链”,让开发者能够轻松地将不同的功能模块串联起来,形成一个完整的工作流程。你可以像搭积木一样串联整个流程,简化开发到生产部署的过程
  • 使用LangSmith 调试和跟踪你的应用
  • LangServe 部署你的应用

这是相当多的内容!我们开始吧。

环境安装

Jupyter Notebook

本指南(以及文档中的大部分其他指南)使用Jupyter notebooks,并假设读者也是如此。Jupyter notebooks 非常适合学习如何使用LLM系统,因为经常会出现问题(意外的输出,API关闭等),在交互式环境中浏览指南是更好地理解它们的好方法。

这个和其他教程可能最方便在Jupyter笔记本中运行。关于如何安装的说明,请看这里

安装

安装langchain

pip install langchain

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
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")

让我们先直接使用模型。ChatModel 是 LangChain "Runnable" 的实例,这意味着它们公开了一个标准的接口用于与之交互。要简单地调用模型,我们可以向 .invoke 方法传入一系列消息。

from langchain_core.messages import HumanMessage, SystemMessage
messages = [
    SystemMessage(content="Translate the following from English into Italian"),
    HumanMessage(content="hi!"),
]
model.invoke(messages)

API Reference:

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中,并且可以看到

OutputParsers

请注意,模型的响应是一个 AIMessage。这包含了一个字符串响应以及有关响应的其他元数据。我们通常可能只想使用字符串响应。我们可以通过使用简单的输出解析器来解析出这个响应。

首先,我们导入简单的输出解析器。

from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()

API Reference:

使用它的一种方法是单独使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。

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

API Reference:

首先,让我们创建一个字符串,然后我们将对其进行格式化,使其成为系统消息。

system_template = "Translate the following into {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='Translate the following into italian:'), HumanMessage(content='hi')])

我们可以看到它返回一个 ChatPromptValue,其中包括两条消息。如果我们想直接访问这些消息,我们可以这样做:

result.to_messages()
[SystemMessage(content='Translate the following into italian:'),
 HumanMessage(content='hi')]

我们现在可以将这个与上面的模型和输出解析器相结合。这将把所有三个组件链接在一起。

chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})
'ciao'

If we take a look at the LangSmith trace, we can see all three components show up in the LangSmith trace

Serving with LangServe

现在我们已经构建了一个应用程序,我们需要为其提供服务。这就是LangServe的作用。LangServe帮助开发人员将LangChain链部署为REST API。您不需要使用LangServe来使用LangChain,但在本指南中,我们将展示如何使用LangServe部署您的应用程序。

这个指南的第一部分旨在在Jupyter Notebook或脚本中运行,但现在我们将离开那个环境。我们将创建一个Python文件,然后通过命令行与它交互。

Install with:

pip install "langserve[all]"
pip install uvicorn

Server

为了为我们的应用创建一个服务器,我们将制作一个serve.py文件。这个文件将包含我们提供应用程序的逻辑。它由三部分组成:

  1. 我们刚刚建立的链的定义
  2. 我们的FastAPI应用程序
  3. 一个路由的定义,用于通过 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. Create prompt template
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
# 2. Create model
model = ChatOpenAI()
# 3. Create parser
parser = StrOutputParser()
# 4. Create chain
chain = prompt_template | model | parser
# 4. App definition
app = FastAPI(
  title="LangChain Server",
  version="1.0",
  description="A simple API server using LangChain's Runnable interfaces",
)
# 5. Adding chain route
add_routes(
    app,
    chain,
    path="/chain",
)
if __name__ == "__main__":
		import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

API Reference:

我们执行这个文件:

python serve.py

Playground

每个LangServe服务都配备了一个简单的内置UI,用于配置和调用应用程序,具有流式输出和查看中间步骤的功能。前往 http://localhost:8000/chain/playground/ 尝试它吧!传入与之前相同的输入 - {"language": "italian", "text": "hi"} - 它应该会像之前一样做出响应。

Client

现在让我们为与我们的服务进行程序化交互设置一个客户端。我们可以使用 langserve.RemoteRunnable 来轻松做到这一点。借助这个功能,我们可以像运行客户端一样与服务端交互。

from langserve import RemoteRunnable
remote_chain = RemoteRunnable("<http://localhost:8000/chain/>")
remote_chain.invoke({"language": "italian", "text": "hi"})
'Ciao'

Conclusion

这就是全部!在本教程中,我们已经介绍了如何创建我们的第一个简单的LLM应用程序。我们已经学会了如何使用语言模型,如何解析它们的输出,如何创建提示模板,如何在使用LangSmith创建的链条中获得良好的可观测性,以及如何使用LangServe部署它们。

这只是为了让你了解成为一名熟练的人工智能工程师你需要学习的一小部分内容。

posted @ 2024-11-12 10:14  onecyl  阅读(27)  评论(0编辑  收藏  举报