07篇 AI从零开始 - LangChain学习与实战(4) LangServer部署

做一个有温度和有干货的技术分享作者 ------ Qborfy

从 LangChain系列文章开始到现在,我们学习 LangChain的基础知识和实战撸代码,现在我们假设已经开发好一个 LangChain链式任务,那么如何部署以及如何与 web服务进行互相调用呢?

那么接下来我们应该就学习LangServer与LangSmith,如何让 LangChain进行企业级开发。

LangServer: 帮开发者将 LangChain 部署一个 Restful 服务。

LangSmith: 监控 LangChain调用链路服务和提供更加友好的可视化界面。

认识 LangServer

LangServer是集成了FastApi + Pydantic的Restful框架。它提供了一些特性:

  • 每次 API调用都会返回丰富的错误信息
  • 自带 JSON Schema和 Swagger API文档
  • 高效的/invokebatch/stream接口服务,支持单个服务器多个并发请求
  • 支持调用/stream_log接口,实现链式任务中间态步骤返回
  • /stream_events更加清晰任务事件状态信息
  • 提供LangServer SDK,调用 Restful 和 直接调用大模型一样简单

实战教程

环境准备

安装langchain-cli全局命令,方便快速启动 Lang Server项目

shell 复制代码
pip install -U langchain-cli 

安装poetry管理项目的依赖,更好管理服务依赖 pip包。

poetry Python packaging and dependency management made easy, 翻译过来就是更加轻松管理 python项目和依赖

shell 复制代码
# 安装 pipx
pip install pipx
# pipx添加到环境变量
pipx ensurepath
# 安装 poetry
pipx install poetry

初始化和运行项目

  1. 项目初始化 利用langchain-cli 脚手架, 初始化一个 langserver项目
shell 复制代码
# 初始化一个langserver的项目
# https://github.com/langchain-ai/langchain/tree/master/templates
langchain app add mylangserver

pipx run langchain app add mylangserver

# 进入项目目录
cd mylangserver

# 安装项目依赖
poetry install

# 安装后续依赖的包
poetry add langchain
poetry add langchain_ollama
  1. 项目结构说明 生成的目录结构与说明如下:
csharp 复制代码
mylangserver # 项目名
├─.gitignore
├─Dockerfile 
├─README.md
├─pyproject.toml # 项目结构说明文件
├─poetry.lock # poetry依赖锁文件 类似前端的yarn.lock
├─packages
|    └README.md
├─app
|  ├─__init__.py
|  ├─server.py  # 服务主入口 后续开发都在这里
  1. 运行项目

在根目录下运行如下命令:

vbscript 复制代码
langchain server

就可以直接访问 http://localhost:8080,效果具体如下图:

接口开发

  1. server.py文件 在接口开发之前我们先看看 server.py文件,具体如下:
python 复制代码
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from langserve import add_routes

app = FastAPI()

# 这里是定义路由和对应路由实现的方法
@app.get("/")
async def redirect_root_to_docs():
    return RedirectResponse("/docs")


# 这里我们可以添加路由
# add_routes(app, NotImplemented)

if __name__ == "__main__":
    import uvicorn
    # 这里通过 uvicorn启动服务,端口为8000
    uvicorn.run(app, host="0.0.0.0", port=8000)
  1. 添加一个调用DeepSeek-R1模型的接口

通过 add_routes新增一个模型对象,会自动封装成对应的 Restful接口,具体如下:

python 复制代码
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from langserve import add_routes
from langchain_ollama.llms import OllamaLLM

deepseek = OllamaLLM(base_url="http://127.0.0.1:11434", model="deepseek-r1:32b")

app = FastAPI(
    title="Qborfy个人 LangServer",
    version="0.1.0",
    description="Qborfy个人 LangServer,学习测试使用",
)


@app.get("/")
async def redirect_root_to_docs():
    return RedirectResponse("/docs")

# 添加 deepseek路由
add_routes(app, deepseek, path="/deepseek")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

接下来我们访问 http://localhost:8000/,就会出现和/deepseek相关的文档,具体如下图:

接口测试

接口测试我们可以通过ApiFox (一个和 Postman类似 API 测试工具)进行测试,具体如下.

  1. /invoke 发起一个对话请求, 具体如下图:
  1. /stream 流式调用,具体如下图:

SDK调用

在LangChain中是可以通过 LangServe提供的 RemoteRunable 进行远程调用,和原来的调用大模型的使用方式其实是一样的, 具体代码如下:

python 复制代码
# 实现langchain调用远端调用 LangServer
from langchain.schema.runnable import RunnableMap
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langserve import RemoteRunnable

llm = RemoteRunnable("http://127.0.0.1:8000/deepseek")

template = "你是世界级的 AI 技术专家, {input}"
# 这里我们使用一个简单的模板
prompt = PromptTemplate(
    input_variables=["input"],
    template=template
)
# 创建一个简单的链式调用
chain = prompt | llm | StrOutputParser()

# 执行链式调用
for chunk in llm.stream("海洋是什么颜色"):
    print(chunk, end="|", flush=True)

这样子我们不仅可以在本地调用大模型,还能调用其他人提供 LangChain服务,从而实现更加复杂的功能。

生产部署

LangServer生产部署,按照 LangChain官方推荐是通过Dockerfile打包进行部署,其中也比较简单,具体执行如下命令:

shell 复制代码
# 打包镜像
docker build . -t my-langserve-app

# 运行镜像
docker run -p 8080:8080 my-langserve-app

或者是通过 docker-compose启动 docker服务,具体如下:

yaml 复制代码
version: '3'
services:
  langserver:
    image: my-langserve-app
    ports:
      - 8080:8080

最终执行docker-compose up -d启动服务后,就可以通过http://localhost:8080/docs访问到服务了。

监控与日志

LangSmith监控

LangSmith是 LangChain官方提供的监控工具,可以监控模型运行情况,一个 SASS服务需要我们将服务相关信息注册到 LangSmith网站上,因此可以按个人或公司需要判断是否允许使用。

LangSmith是一个用于构建生产级应用的平台。它允许您密切监控和评估您的应用,以便您可以快速而自信地发布应用。

传统软件应用程序是通过编写代码来构建的,而 AI 应用程序则需要编写提示来指导应用程序执行哪些操作。

LangSmith 提供了一套旨在实现和促进提示工程的工具,以帮助您找到适合您的应用程序的完美提示。

PS:LangSmith这里提示未来编程开发者的思维转变,我们实现功能的思路不再是针对一些实现逻辑,而是面向不同的 AI 模型,优化提示语实现我们想要的功能。

在 LangServer 中使用 LangSmith,需要先注册一个账号,然后获取 api key 添加到 LangServer中,具体使用代码如下:

python 复制代码
import os

# 设置LangSimth 环境变量
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGSMITH_API_KEY"] = "<LANG_SIMTH_KEY>"
os.environ["LANGSMITH_PROJECT"] = "mylangserver"

具体使用教程可以参考LangSmith官方文档

LangSmith主要作用是监控 链路任务节点调用和扭转情况,可以更加清晰的分析链的运行情况和日志,具体效果如下图所示:

Verbose关键日志

如果我们不想把自己的服务相关的日志信息暴露给 LangSmith, 我们还可以通过设置set_verbose设置详细日志开关, 从而实现我们调用 LangChain链路的完整日志,具体如下:

python 复制代码
from langchain.globals import set_verbose
# 全局 verbose配置开关
set_verbose(True)

# 针对部分链接调用设置详细日志开关

llm = OllamaLLM(base_url="http://127.0.0.1:11434", model="deepseek-r1:32b", verbose=True)

打开开关后,我们再调用helloworld.py大模型,可以看到关键的日志信息,但是verbose只会输出关键日志,下面我们还可以 debug查看更加详细的日志信息。

Debug日志

我们可以通过debug设置日志级别,从而查看更加详细的日志信息,具体如下:

python 复制代码
from langchain.globals import set_debug
# 全局 debug配置开关
set_debug(True)

打开开关后,我们再调用helloworld.py大模型,可以看到更加详细的日志信息,具体如下图:

总结

本文我们主要学习了LangServer的去部署一个 LangChain链,通过 LangServe对于第三方就能加友好的访问我们的提供 LangChain服务,从而实现更加复杂的功能。回顾一下,我们主要学习了以下内容:

  • LangServer 安装与运行:通过 LangChain-Cli脚手架创建项目和langchain serve运行项目
  • LangServer 接口开发:add_routes添加接口,可以直接把一个 LangChain添加到 LangServer中且自动生成 Swagger文档
  • LangServer监控与日志:LangSmith是LangChain官方提供的监控工具,但是会上报我们服务相关的日志信息,因此我们可以设置set_verbose或者set_debug设置详细日志开关, 从而实现我们调用 LangChain链路的完整日志

参考资料

声明:本文部分材料是基于DeepSeek-R1模型生成。

相关推荐
月落星还在10 分钟前
AI学习——图像分类技术深度解析:从传统方法到深度学习的演进
人工智能·分类
既见君子12 分钟前
透明视频
前端
竹等寒15 分钟前
Go红队开发—web网络编程
开发语言·前端·网络·安全·web安全·golang
若兰幽竹17 分钟前
【机器学习】主成分分析法(PCA)
人工智能·机器学习·信息可视化
lhhbk19 分钟前
angular中下载接口返回文件
前端·javascript·angular·angular.js
YUELEI11824 分钟前
Vue使用ScreenFull插件实现全屏切换
前端·javascript·vue.js
巫山老妖44 分钟前
我的智能写作&知识库管理搭子--ima.copilot
人工智能
俄城杜小帅1 小时前
opencv+ONNX模型的推理
人工智能·opencv·计算机视觉
shengjk11 小时前
只会写代码的程序员,注定没有出路!
人工智能·后端
shengjk11 小时前
Flink 中RocksDB 为什么将每个键和值的限制为 2^31 字节
人工智能·后端