现在我们已经建立了一个应用程序,但如果需要让它对外提供服务,就需要引入 LangServe 。LangServe 帮助开发人员将 LangChain 链部署为 REST API。使用 LangChain 并不一定需要使用 LangServe,但在本指南中,我们将展示如何使用 LangServe 部署您的应用程序。
虽然之前大部分程序/示例都是在 Jupyter Notebook 中运行的,现在我们离开那个环境。我们将创建一个 Python 文件,然后从命令行与之交互。

在开始之前,先安装LangServe

1
pip install "langserve[all]"

Server端

要创建一个LangChain应用服务器,我们首先需要编写一个serve.py文件。该文件包含LangChain应用的服务逻辑,包括:

  1. 刚刚构建的链定义
  2. 一个 FastAPI 应用(这里使用FastAPI框架)
  3. 通过 langserve.add_routes 定义一个链服务提供的路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python
from typing import List

from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools.retriever import create_retriever_tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain.agents import AgentExecutor
from langchain.pydantic_v1 import BaseModel, Field
from langchain_core.messages import BaseMessage
from langserve import add_routes

# 1. 装载检索器
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vector = FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever()

# 2. 创建工具集
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search",
"Search for information about LangSmith. For any questions about LangSmith, you must use this tool!",
)
search = TavilySearchResults()
tools = [retriever_tool, search]


# 3. 创建Agent
prompt = hub.pull("hwchase17/openai-functions-agent")
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)


# 4. 开启FastAPI应用
app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain's Runnable interfaces",
)

# 5. 增加API路由

# 添加API输入/输出模式
class Input(BaseModel):
input: str
chat_history: List[BaseMessage] = Field(
...,
extra={"widget": {"type": "chat", "input": "location"}},
)


class Output(BaseModel):
output: str

add_routes(
app,
agent_executor.with_types(input_type=Input, output_type=Output), # 注意这个写法
path="/agent",
)

if __name__ == "__main__":
import uvicorn

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

文件编辑完毕,即可用python命令行来启动。

1
python serve.py

启动之后,可以在 http://127.0.0.1:8000 看到提供的服务。

Playground

每个 LangServe 服务都附带一个简单的内置 UI,用于配置和调用应用程序,以及提供流式输出和中间步骤的可见性。可以通过 http://127.0.0.1:8000/agent/playground/ 来访问它。传入之前的问题 - “how can langsmith help with testing?” - 它应该会像之前一样回应。

Client端

现在让我们再配置一个客户端,从而以编程方式与我们的刚搭建的服务端进行交互。我们可以使用 [langserve.RemoteRunnable](/docs/langserve#client) 函数轻松实现这一点。通过该函数我们可以像使用本地链一样在客户端运行并与之交互。

1
2
3
4
5
6
7
from langserve import RemoteRunnable

remote_chain = RemoteRunnable("http://127.0.0.1:8000/agent/")
remote_chain.invoke({
"input": "how can langsmith help with testing?",
"chat_history": [] # 第一次调用,传入一个空数据
})

要了解更多关于 LangServe 的功能,请点击这里