Skip to content

部署指南

部署是 LangChain 应用开发的最后一个环节,它将开发好的应用部署到生产环境中。本节将详细介绍如何部署 LangChain 1.2 应用。

部署前准备

在部署 LangChain 应用之前,需要进行以下准备工作:

  1. 代码优化:优化代码结构,使用 LCEL 语法提高代码的可读性和可维护性
  2. 依赖管理:确保所有依赖都已正确安装,并生成依赖文件
  3. 环境配置:配置环境变量,如 API 密钥等
  4. 测试:确保应用在本地运行正常
  5. 监控:设置监控和日志系统,以便及时发现和解决问题

部署方式

LangChain 应用可以通过多种方式部署,以下是一些常用的部署方式:

1. 本地部署

本地部署是指在本地机器上运行应用,适用于开发和测试环境。

示例:本地部署 LangChain 应用

bash
# 安装依赖
pip install -r requirements.txt

# 运行应用
python app.py

2. 容器化部署

容器化部署是指使用 Docker 等容器技术部署应用,适用于开发、测试和生产环境。

示例:使用 Docker 部署 LangChain 应用

  1. 创建 Dockerfile
dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV OPENAI_API_KEY=your-api-key

CMD ["python", "app.py"]
  1. 创建 requirements.txt
langchain
langchain-openai
fastapi
uvicorn
langchain-community
  1. 构建和运行 Docker 容器
bash
# 构建 Docker 镜像
docker build -t langchain-app .

# 运行 Docker 容器
docker run -p 8000:8000 langchain-app

3. 云平台部署

云平台部署是指将应用部署到云平台上,如 AWS、Azure、Google Cloud 等,适用于生产环境。

示例:部署到 AWS Lambda

  1. 创建 Lambda 函数
python
# lambda_function.py
import os
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

def lambda_handler(event, context):
    # 初始化语言模型
    llm = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
    
    # 创建提示词模板
    template = """You are a helpful assistant. Answer the following question:
    
    Question: {question}
    Answer:"""
    prompt = PromptTemplate(template=template, input_variables=["question"])
    
    # 创建输出解析器
    output_parser = StrOutputParser()
    
    # 使用 LCEL 语法创建链
    chain = prompt | llm | output_parser
    
    # 运行链
    question = event["queryStringParameters"]["question"]
    response = chain.invoke({"question": question})
    
    return {
        "statusCode": 200,
        "body": response
    }
  1. 创建 deployment package
bash
# 创建部署包
mkdir package
pip install --target package langchain langchain-openai langchain-community
cp lambda_function.py package/
cd package
zip -r ../lambda-deployment-package.zip .
cd ..
  1. 部署到 AWS Lambda
  • 登录 AWS 控制台
  • 导航到 Lambda 服务
  • 创建新函数
  • 上传 deployment package
  • 配置环境变量(如 OPENAI_API_KEY)
  • 配置触发方式(如 API Gateway)

4. Web 服务部署

Web 服务部署是指将应用部署为 Web 服务,使用 FastAPI、Flask 等框架,适用于生产环境。

示例:使用 FastAPI 部署 LangChain 应用

  1. 创建 app.py
python
from fastapi import FastAPI, Query
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os

app = FastAPI()

# 初始化语言模型
llm = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# 创建提示词模板
template = """You are a helpful assistant. Answer the following question:

Question: {question}
Answer:"""
prompt = PromptTemplate(template=template, input_variables=["question"])

# 创建输出解析器
output_parser = StrOutputParser()

# 使用 LCEL 语法创建链
chain = prompt | llm | output_parser

@app.get("/query")
async def query(question: str = Query(..., description="The question to ask")):
    response = chain.invoke({"question": question})
    return {"answer": response}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
  1. 创建 requirements.txt
langchain
langchain-openai
fastapi
uvicorn
langchain-community
  1. 运行应用
bash
# 安装依赖
pip install -r requirements.txt

# 运行应用
python app.py
  1. 部署到云平台

可以使用以下云平台部署 FastAPI 应用:

  • Heroku:使用 Procfile 和 Heroku CLI
  • AWS EC2:使用 SSH 部署
  • Google Cloud Run:使用 Docker 部署
  • Azure App Service:使用 Azure CLI 部署

部署的最佳实践

1. 环境变量管理

使用环境变量管理敏感信息,如 API 密钥、数据库连接字符串等。

示例:使用 .env 文件管理环境变量

bash
# 安装 python-dotenv
pip install python-dotenv
python
# app.py
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()

# 使用环境变量
api_key = os.environ["OPENAI_API_KEY"]
# .env
OPENAI_API_KEY=your-api-key

2. 依赖管理

使用 requirements.txt 或 pyproject.toml 管理依赖,确保所有依赖都已正确安装。

示例:生成 requirements.txt

bash
# 生成 requirements.txt
pip freeze > requirements.txt

3. 日志和监控

设置日志和监控系统,以便及时发现和解决问题。

示例:使用 logging 模块

python
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

logger = logging.getLogger(__name__)

# 使用日志
logger.info("Application started")
try:
    # 代码
    logger.info("Operation successful")
except Exception as e:
    logger.error(f"Error: {e}")

4. 性能优化

优化应用的性能,提高响应速度和并发处理能力。

示例:使用异步处理

python
from fastapi import FastAPI
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os

app = FastAPI()

# 初始化聊天模型
chat_model = ChatOpenAI(api_key=os.environ["OPENAI_API_KEY"])

# 创建聊天提示词模板
chat_template = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant"),
    ("human", "{question}")
])

# 创建输出解析器
output_parser = StrOutputParser()

# 使用 LCEL 语法创建链
chain = chat_template | chat_model | output_parser

@app.get("/query")
async def query(question: str):
    # 异步运行链
    response = await chain.ainvoke({"question": question})
    return {"answer": response}

5. 安全性

确保应用的安全性,防止 API 密钥泄露和恶意攻击。

示例:使用环境变量和 API 密钥管理

python
import os
from langchain_openai import OpenAI

# 从环境变量获取 API 密钥
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise ValueError("OPENAI_API_KEY environment variable is not set")

# 初始化语言模型
llm = OpenAI(api_key=api_key)

示例:完整的部署流程

1. 准备应用

python
# app.py
from fastapi import FastAPI, Query
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
import os
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# 加载环境变量
load_dotenv()

app = FastAPI()

# 初始化语言模型
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise ValueError("OPENAI_API_KEY environment variable is not set")

llm = OpenAI(api_key=api_key)

# 创建提示词模板
template = """You are a helpful assistant. Answer the following question:

Question: {question}
Answer:"""
prompt = PromptTemplate(template=template, input_variables=["question"])

# 创建输出解析器
output_parser = StrOutputParser()

# 使用 LCEL 语法创建链
chain = prompt | llm | output_parser

@app.get("/query")
async def query(question: str = Query(..., description="The question to ask")):
    logger.info(f"Received query: {question}")
    try:
        response = chain.invoke({"question": question})
        logger.info(f"Generated response: {response}")
        return {"answer": response}
    except Exception as e:
        logger.error(f"Error processing query: {e}")
        return {"error": "An error occurred while processing your query"}

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

2. 创建依赖文件

# requirements.txt
langchain
langchain-openai
fastapi
uvicorn
python-dotenv
langchain-community

3. 创建 Dockerfile

dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV OPENAI_API_KEY=your-api-key

CMD ["python", "app.py"]

4. 构建和运行

bash
# 构建 Docker 镜像
docker build -t langchain-app .

# 运行 Docker 容器
docker run -p 8000:8000 langchain-app

5. 部署到云平台

可以使用以下命令部署到 Heroku:

bash
# 登录 Heroku
heroku login

# 创建 Heroku 应用
heroku create langchain-app

# 推送代码
git push heroku main

# 设置环境变量
heroku config:set OPENAI_API_KEY=your-api-key

# 打开应用
heroku open

总结

部署是 LangChain 应用开发的最后一个环节,它将开发好的应用部署到生产环境中。在 LangChain 1.2 中,推荐使用 LCEL 语法创建链,并使用相应的部署方式来部署应用。

通过本文的介绍,您应该已经了解了如何部署 LangChain 应用,包括本地部署、容器化部署、云平台部署和 Web 服务部署等方式。在实际应用中,您可以根据具体需求选择合适的部署方式,配置适当的环境和监控,确保应用的稳定运行。