跳至主要内容

使用 LangServe 部署 LLM 应用

学习如何使用 LangServe 部署 LLM 应用。本指南全面涵盖安装、集成与高效部署的最佳实践。
· 11分钟 阅读

使用 AI 探索

将大语言模型(LLM)部署到生产环境可以重塑您的应用,为其带来自然语言理解与生成等高级功能。然而,这一过程充满挑战,即便是经验丰富的开发者也可能受阻。

在本指南中,我们将介绍如何使用 LangServe 部署 LLM 应用。LangServe 旨在简化并优化这一复杂流程。从安装到集成,您将掌握成功落地 LLM 并释放其全部潜力的关键步骤。

构建基于 LLM 的应用面临的挑战

构建基于 LLM 的应用并不只是简单调用一个 API。虽然将 LLM 集成到项目中能显著增强能力,但它也伴随着一系列独特挑战,需要谨慎权衡。下面我们将拆解主要障碍,并指出部署过程中需要关注的要点。

模型选择与定制

为您的应用选择合适的模型是首要难题。模型的选择取决于多种因素,例如具体任务、所需准确度以及可用算力资源。此外,将预训练模型定制为满足应用需求的版本也不简单,通常需要使用领域数据进行微调。

资源管理

LLM 计算开销大,对资源要求高。必须确保基础设施能够满足高内存与高算力的需求。同时还要规划可扩展性,以应对未来的增长与潜在的使用量提升。

时延与性能

低时延对良好用户体验至关重要。LLM 在高并发下处理请求可能较慢。性能优化可涉及模型压缩、高效的服务框架,甚至将部分处理任务下沉到边缘设备。

监控与维护

一旦部署上线,LLM 应用需要持续监控,包括跟踪性能指标、检测异常以及管理模型漂移。定期维护有助于模型长期保持准确高效,这通常需要基于新数据进行周期性更新与再训练。

集成与兼容性

将 LLM 与现有系统和工作流集成并不容易。要确保与多种软件环境、API 与数据格式兼容,需要周密规划与严谨执行。无缝集成是充分发挥 LLM 在您应用中价值的关键。

成本管理

LLM 的高算力需求可能带来可观的运营成本。在性能与成本效率间取得平衡至关重要。可行策略包括优化资源分配、采用性价比更高的云服务,并定期回顾使用模式以发现节省空间。

将 LLM 部署到生产环境需要了解什么

将 LLM 部署到生产是一个需要编排多种系统与组件的复杂过程。它不只是把一个强大的语言模型接入您的应用,更需要构建一个各部分紧密协作的基础设施,每个环节都至关重要。

LLM 应用的构成

要理解部署 LLM 应用的复杂性,必须了解所涉组件及其交互。下图展示了现代 LLM 应用的架构,突出系统中的关键要素及其关系。

现代 LLM 应用架构示意图

现代 LLM 应用架构示意图。来源

LLM 应用的架构可拆分为若干核心方面:

向量数据库

向量数据库是管理 LLM 生成的高维数据的基础。它们能够高效存储与检索向量,支持快速且准确的相似度搜索。语义搜索、推荐系统与个性化体验等应用离不开它们。

在部署 LLM 时,选择能够随应用扩展的高可靠向量数据库,是保持性能与响应性的关键。

提示模板

提示模板是预定义的结构,用于规范与 LLM 的交互。它们有助于确保模型生成的响应一致且可信。

设计高质量的提示模板,需要既理解模型的特性,也把握应用的具体需求。精心打造的模板能够显著提升输出的质量与相关性,从而提升用户满意度。

编排与工作流管理

部署 LLM 应用需要协调多项任务,如数据预处理、模型推理与后处理。工作流管理工具与编排框架(如 Apache Airflow 或 Kubernetes)可帮助自动化并简化这些流程,确保各组件高效顺畅运行,降低错误与停机风险。

基础设施与可扩展性

支撑 LLM 应用的基础设施必须稳健且可扩展。这包括云服务、硬件加速器(如GPU 或 TPU)以及网络能力。可扩展性确保应用在负载与用户需求提升时不牺牲性能。

利用自动伸缩策略与负载均衡可有效管理资源并维持服务质量。

监控与日志

持续的监控与日志记录对维护 LLM 应用的健康与性能至关重要。监控工具可提供系统性能、使用模式与潜在问题的实时洞察。

日志机制记录应用运行的详细信息,对调试与优化极为宝贵。二者结合可确保应用平稳运行,并能快速应对变化或异常。

安全与合规

部署 LLM 还需满足安全与合规要求,包括保护敏感数据、实施访问控制,并确保遵循相关法规(如 GDPR 或 HIPAA)。安全措施应渗透部署流程的各个层面,防范数据泄露与未授权访问。

与现有系统集成

LLM 应用必须与现有系统与工作流无缝集成。这涉及确保与组织内使用的其他软件工具、API 与数据格式兼容。

有效集成能增强应用的整体功能与效率,使其充分利用现有资源与基础设施。

将 LLM 部署到生产的不同路径

将 LLM 部署到生产有多种方式,每种都有其优势与挑战。

本地化部署是在本地服务器或数据中心托管 LLM,可对数据与基础设施有更强的掌控,但需要在硬件与维护上投入大量资源。

基于云的部署利用云服务托管 LLM,具备良好的可扩展性、灵活性与较低的前期成本,但可能引入数据隐私与持续运营成本方面的顾虑。

混合部署结合本地与云端资源,在可控性与可扩展性之间取得平衡,使组织能根据具体需求优化性能与成本。

理解各路径的利弊,有助于做出与组织目标与资源相匹配的明智决策。

LLM 生产化的优秀工具

将大语言模型部署到生产需要一套工具,覆盖从基础设施管理到监控与优化的各个环节。本节将介绍五款在 LLM 部署中广泛使用的顶级工具。

我们从可扩展性、易用性、集成能力与成本效益等维度进行评估。

LangServe

LangServe 专为部署 LLM 应用而设计。它通过提供强大的安装、集成与优化工具来简化部署流程。LangServe 支持多种 LLM,并可与现有系统无缝集成。

  • 可扩展性:高
  • 易用性:高
  • 集成能力:卓越
  • 成本效益:中等

Kubernetes

Kubernetes 是一个开源的容器编排平台,可自动化容器化应用的部署、伸缩与管理。它高度灵活,可用于管理 LLM 部署所需的基础设施。

  • 可扩展性:高
  • 易用性:中等
  • 集成能力:卓越
  • 成本效益:高(开源)

TensorFlow Serving

TensorFlow Serving 是为生产环境打造的灵活高性能模型服务系统。它让您在保持相同服务架构与 API 的同时,轻松部署新算法与实验。

  • 可扩展性:高
  • 易用性:中等
  • 集成能力:卓越
  • 成本效益:高(开源)

Amazon SageMaker

Amazon SageMaker 是全托管服务,使每位开发者与数据科学家都能快速构建、训练与部署机器学习模型。它与其他 AWS 服务深度集成,是 LLM 部署的一体化工具。

  • 可扩展性:高
  • 易用性:高
  • 集成能力:卓越(与 AWS 生态)
  • 成本效益:中至高(取决于用量)

MLflow

MLflow 是一个开源平台,用于管理机器学习生命周期,包括实验、可复现与部署。它提供模型的集中式存储库,并可与多种机器学习库集成。

  • 可扩展性:中至高
  • 易用性:中等
  • 集成能力:卓越
  • 成本效益:高(开源)

总结

工具

可扩展性

易用性

集成能力

成本效益

LangServe

高

高

卓越

中等

Kubernetes

高

中等

卓越

高(开源)

TensorFlow Serving

高

中等

卓越

高(开源)

Amazon SageMaker

高

高

卓越(与 AWS)

中至高

MLflow

中至高

中等

卓越

高(开源)

使用 LangServe 部署 LLM 应用

LangServe 是一款专用工具,旨在简化 LLM 应用的部署流程。本节将以技术演示的形式,说明如何使用 LangServe 部署一个用于文本摘要的 chatGPT 应用。

1. 安装

首先需要安装 LangServe。您可以根据需要安装客户端与服务端组件,或只安装其一。

pip install "langserve[all]"

或者,您也可以分别安装各组件:

install "langserve[client]"
install "langserve[server]"

LangChain CLI 可用于快速引导一个 LangServe 项目。请确保已安装较新的版本:

install -U langchain-cli

2. 配置

2.1 创建新应用

使用 LangChain CLI 创建新应用,并将当前工作目录切换到 my-app:

app new my-app
my-app

2.2 使用 Poetry 添加第三方包

LangServe 使用 Poetry 进行依赖管理。如不熟悉 Poetry,请参阅Poetry 文档了解详情。

添加相关依赖:

add langchain-openai langchain langchain community

该命令可确保项目所需依赖齐备。

2.3 设置环境变量

请为应用设置必要的环境变量。本例中需要设置 OpenAI API 密钥以发起有效请求:

OPENAI_API_KEY="sk-..."

请将“sk-...”替换为您的实际 API 密钥。您可通过 OpenAI 平台创建密钥。

3. 服务端

打开 ```server.py``` 文件。这里将包含 LangServe 应用的主要逻辑。下面是一个简单的 LangServe 应用示例,其中包含使用 OpenAI 语言模型进行文本摘要的路由:

fastapi import FastAPI
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langserve import add_routes
app = FastAPI(
	title="LangChain Server",
	version="1.0",
	description="A simple API server using Langchain's Runnable interfaces",
)
# Define a route for the OpenAI chat model
add_routes(
	app,
	ChatOpenAI(),
	path="/openai",
)
# Define a route with a custom prompt
summarize_prompt = ChatPromptTemplate.from_template("Summarize the following text: {text}")
add_routes(
	app,
	summarize_prompt | ChatOpenAI(),
	path="/summarize",
)
if __name__ == "__main__":
	import uvicorn
	uvicorn.run(app, host="localhost", port=8000)

下面我们更近一步查看这个基础 LangServe 应用的关键组件:

3.1 导入必要模块

  • FastAPI 用于创建 Web 服务器。
  • 从 LangChain 引入的 ChatPromptTemplate 与 ChatOpenAI 用于定义提示与模型。
  • LangServe 的 add_routes 用于向 FastAPI 应用添加路由。

3.2 初始化 FastAPI 应用

  • 通过元数据(如标题、版本与描述)初始化 FastAPI 应用。

3.3 添加路由

  • 第一次调用 add_routes 添加 /openai 路由,直接对接 OpenAI 的聊天模型。
  • 第二次调用 add_routes 定义自定义提示的 /summarize 路由。该路由接收输入文本,并使用提示通过 OpenAI 模型生成文本摘要。

4. 运行服务

使用 uvicorn.run 在 localhost 的 8000 端口启动 FastAPI 服务器。

在本示例中,我们添加了使用提示进行文本摘要的 /summarize 路由。您也可以通过定义更多路由与提示来拓展 LangServe 应用的功能。例如:

joke_prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")
add_routes(
            app,
            joke_prompt | ChatOpenAI(),
            path="/joke",
)

5. 启动服务

最后,使用 Poetry 在指定端口启动您的应用:

run langchain serve --port=8100

如果一切配置正确,您应能在终端看到类似如下的输出:

终端输出展示 LangServe 应用成功启动终端输出展示 LangServe 应用成功启动。

现在,您可以在浏览器中访问 http://127.0.0.1:8100/summarize/playground/。该 URL 提供了一个用户友好的界面,便于您测试应用。T

he playground 支持执行 runnable、查看流式输出并观察中间步骤,帮助您更轻松地与已部署的 LLM 应用交互与调试。

LangServe playground 界面示例

LangServe playground 界面示例

此外,您还可以访问 http://127.0.0.1:8100/docs,查看由 FastAPI 自动生成的 API 文档。

这份交互式文档允许您探索并测试 LangServe 应用的全部端点。您可以查看每个端点的详细信息,包括所需输入与预期输出,有助于了解如何与 API 交互并验证各路由是否正常工作。

使用 LangServe 监控 LLM 应用

在生产环境中确保 LLM 应用的可靠性、性能与准确性至关重要。虽然 LangServe 本身不包含内置监控功能,但它可与广泛使用的监控工具无缝集成,以追踪并分析应用健康状况。

本节将以技术演示的方式,介绍如何将 LangServe 与这些工具配合使用,以维护与监控 LLM 应用。

1. 设置日志

日志是监控 LLM 应用的第一步。它有助于跟踪应用行为并识别异常。以下展示如何在集成 LangServe 的 FastAPI 应用中设置日志:

import logging

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("langchain_server")

app = FastAPI()

# Example of logging within a route
@app.get("/status")
async def status():
	logger.info("Status endpoint was called")
	return {"status": "Running"}

通过上述设置,每次调用 /status 端点都会记录一条日志,指示该端点被访问。您可以据此扩展,记录更多重要事件与错误。

2. 集成 Prometheus 采集指标

Prometheus 是广受欢迎的监控与告警工具。它可与 FastAPI 集成,用于采集指标并洞察应用性能。以下展示如何在 LangServe 中配置 Prometheus:

2.1 安装 Prometheus 客户端

install prometheus_client

2.2 在 server.py 中加入 Prometheus 中间件

import time
from prometheus_client import start_http_server, Summary
from fastapi.middleware import Middleware

# Start Prometheus server
start_http_server(8001)

# Define a Prometheus metric
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')

app = FastAPI()

# Middleware for tracking request processing time
@app.middleware("http")
async def add_prometheus_middleware(request: Request, call_next):
	start_time = time.time()
	response = await call_next(request)
	duration = time.time() - start_time
	REQUEST_TIME.observe(duration)
	return response

该配置将在 8001 端口启动 Prometheus 服务器,并跟踪每个请求的处理时长。

使用 Prometheus 与 Grafana 配置告警

Prometheus 可基于特定条件触发告警,Grafana 则可用于可视化这些指标。以下为配置告警的简要步骤:

3.1 配置 Prometheus 告警规则

创建名为 alert.rules 的文件:

groups:
- name: example
  rules:
  - alert: HighRequestLatency
	expr: request_processing_seconds_bucket{le="0.5"} > 0.5
	for: 5m
	labels:
  	severity: page
	annotations:
  	summary: High request latency
  	description: "Request latency is above 0.5 seconds for more than 5 minutes."

3.2 在 Prometheus 中加载告警规则

更新 Prometheus 配置(prometheus.yml):

rule_files:
  - "alert.rules"

3.2 配置 Grafana 可视化

安装与配置 Grafana 请参阅其安装与配置文档。完成后,您即可创建仪表盘与面板,用于可视化请求时延、错误率等指标。

4. 实现健康检查

健康检查用于监控应用健康状况并确保其按预期运行。以下是一个简单的健康检查端点:

@app.get("/health")
async def health():
	return {"status": "Healthy"}

监控工具可定期调用此端点,确保应用处于健康状态。

5. 监控错误与异常

捕获与监控错误和异常对定位应用问题至关重要。下面展示如何扩展日志记录以捕获异常:

from fastapi import Request, HTTPException
from fastapi.responses import JSONResponse

@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
	logger.error(f"An error occurred: {exc}")
             return JSONResponse(status_code=500, content={"message": "Internal Server Error"})
@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
	logger.error(f"HTTP error occurred: {exc.detail}")
	return JSONResponse(status_code=exc.status_code, content={"message": exc.detail})

通过上述设置,任何未处理的异常都会被记录,帮助您洞察潜在问题。

结语

将大语言模型(LLM)部署到生产环境能够改变您的应用,但过程需要穿越模型选择、资源管理与集成等复杂环节。LangServe 简化了这些挑战,帮助开发者高效部署、监控与维护 LLM 应用。

借助 LangServe,您可以精简部署流程,确保稳健性能,并实现与系统的无缝集成。

若想更深入学习 LLM 应用的构建与部署,欢迎查看 DataCamp 的 Developing LLM Applications with LangChain 课程。该资源涵盖聊天机器人构建、使用 LangChain 表达式语言(LCEL)集成外部数据等核心主题。

常见问题

LangServe 是否可用于任意 LLM,还是仅支持特定模型?

LangServe 具有高度灵活性,可支持多种 LLM,尤其是与 LangChain 集成的模型。它对 OpenAI 的 GPT、Anthropic 的 Claude 等流行模型提供开箱即用的支持,同时也可以扩展到其他模型。

LangServe 是否可以用于部署非 LLM 的机器学习模型?

尽管 LangServe 针对大语言模型的部署进行了优化,但它也可适配用于部署其他类型的机器学习模型。其架构的灵活性允许与多种机器学习框架与模型集成,使其能满足不同的部署需求。

如何在高流量场景下使用 LangServe 实现可扩展性?

对于高流量应用,可将您的应用部署在具备伸缩能力的基础设施上,如 Kubernetes,或 AWS、Azure、GCP 等云平台。同时应配置自动伸缩策略与负载均衡,以应对流量增长并确保高可用性。

安装 LangServe 的系统要求是什么?

具体系统要求取决于您要部署的 LLM。一般而言,需要较新版本的 Python、充足的内存与 CPU 资源,且最好能使用 GPU 以提升推理效率。

Stanislav Karzhev

作者

Stanislav Karzhev

刚毕业的理学硕士,专攻人工智能

主题