在应用流开发完成后,您可以将其部署为EAS服务。EAS提供自动扩缩容和全面的运维监控等功能,能够确保应用灵活应对业务需求的变化和增长,提升系统的稳定性与性能,从而更好地支持生产环境的需求。
前提条件
已创建应用流,并完成调试。详情请参见应用流开发。
部署应用流
进入LangStudio,选择工作空间后,在应用流页签下单击已调试完的应用流,然后在页面右上角单击部署(仅当运行时启动时才可进行部署)。关键参数说明:
参数 | 描述 |
资源部署 | |
资源类型 | |
实例数 | 配置服务实例数。在生产阶段,建议配置多个服务实例,以降低单点故障的风险。 |
部署资源 | 如果仅作为业务流调度使用,您可以根据业务流复杂程度选择合适的CPU资源。相对于GPU资源,CPU资源通常更加经济实惠。部署后会产生EAS相关的资源费用,计费详情请参见模型在线服务(EAS)计费说明。 |
专有网络:由于部署应用流实际上是将其部署为EAS服务,为确保服务部署后客户端能正常访问EAS在线服务,您可以选择专有网络连通方案,将客户端与EAS服务间的网络连通。需要注意的是,EAS服务内部默认与公网不通,如果您有EAS服务访问公网的需求,需配置具备公网访问能力的VPC,详情请参见配置网络连通。 说明 如果应用流中包含向量数据库连接(如Milvus),请确保配置的专有网络与向量数据库实例所在的专有网络一致,或确保两者网络互通。 | |
对话历史 | |
开启对话历史 | 仅适用于“对话型”应用流的配置,开启后支持存储和传递多轮对话的历史消息,需要配合服务请求头参数使用。 |
对话历史存储 | 本地存储不支持多实例部署,如果您部署的服务为生产使用,建议使用外部存储,如阿里云数据库RDS。详情请参见附录:对话历史。 重要 采用本地存储方案时,不支持多实例部署,也不支持单实例扩容到多实例,否则会导致对话历史功能出现异常。 |
链路追踪:开启后,可在服务部署完成后查看Trace详情,以评估应用流的效果。 | |
角色与权限:在应用流程中,如果使用了Faiss向量数据库(创建知识库时需要选择Faiss或Milvus向量数据库)或“阿里云IQS-标准搜索”(IQS联网搜索聊天助手模板会使用到该组件),则需要根据实际情况选择相应的角色。 |
更多参数配置说明,请参见控制台自定义部署参数说明。
在线调试
调用服务
在线调试
部署成功后,跳转到PAI-EAS,在在线调试页签下配置并发送请求。请求Body中的Key与应用流中“开始节点”中的参数“对话输入”字段一致,本文使用默认字段question
。
API调用
在概览页签下获取调用服务的Endpoint和Token。
发送API请求。
支持以简单模式和完整模式调用,两者区别如下:
属性
简单模式
完整模式
请求路径
<Endpoint>/
<Endpoint>/run
功能描述
直接返回应用流的输出结果。
返回一个复杂的结构,包括应用流的节点状态、流的错误信息、流的输出消息等。
适用场景
用户只需要应用流的最终输出结果,而不关心流的内部处理过程或状态。
适用于简单的查询或操作,快速获取结果。
用户需要详细了解应用流的执行过程,包括每个节点的状态和可能的错误信息。
适用于调试、监控或分析应用流的执行情况。
优点
使用简单,无需解析复杂的结构。
提供全面的信息,帮助用户深入理解应用流的执行过程。
有助于故障排查和优化应用流的性能。
简单模式
完整模式
Langstudio支持SSE(Server-Sent Events),在发送请求时可以输出应用流(Flow)执行时对应各节点的状态、错误信息、输出消息等,同时支持定制事件中
node_run_infos
的内容组成。本文以在线调试方式举例说明,您需要在调用地址后面追加/run
,然后编辑请求Body:请求Body参数字段说明:
字段名
类型
默认值
描述
inputs
Mapping[str, Any]
无
Flow的输入数据字典。键(Key)应与Flow定义的输入字段名称匹配。如果Flow无输入,则忽略此字段。
stream
bool
True
控制响应格式。取值:
True:以SSE流式响应。响应Header中的Content-Type为
text/event-stream
,数据采用DataOnly的方式返回,按照事件不同,分为RunStarted、NodeUpdated、RunOutput和RunTerminated,详情请参见表格下文。False:以单个JSON体响应。响应Header中的Content-Type为
application/json
,可参见在线调试中的响应信息。
response_config
Dict[str, Any]
-
控制流式响应(当stream=True) 中包含的节点详细信息。
∟ include_node_description
bool
False
(response_config内)是否在SSE事件流中包含节点描述。
∟ include_node_display_name
bool
False
(response_config内)是否在SSE事件流中包含节点名称。
∟ include_node_output
bool
False
(response_config内)是否在SSE事件流中包含节点输出。
∟ exclude_nodes
List[str]
[]
(response_config内)要从SSE事件流中排除的节点名称列表。
返回数据按事件不同,分为RunStarted、NodeUpdated、RunOutput和RunTerminated:
OpenAI兼容方式调用
部署的对话应用流(ChatFlow)支持以兼容OpenAI的方式进行调用,同时也允许被其他支持OpenAI的客户端使用。
基于OpenAI API的方式
本文以cURL命令进行流式调用举例说明,请求/返回示例如下:
请求示例:
curl --location '<Endpoint>/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "default",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Who are you?"
}
],
"stream":true
}'
请求参数配置说明:
参数 | 描述 |
--location '<Endpoint>/v1/chat/completions' | 请求的目标URL。其中 |
--header "Authorization: Bearer $DASHSCOPE_API_KEY" | HTTP头部信息。其中 |
"model": "default" | 模型名称,固定为 |
"stream":true | 返回的信息是否为流式信息。注:仅当LLM节点作为应用流的输出节点时(结束节点的直接输入必须是LLM节点),才支持流式调用。 |
返回示例:
data: {"choices":[{"delta":{"content":"","role":"assistant"},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"finish_reason":null,"delta":{"content":"I am"},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"delta":{"content":"a large"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"delta":{"content":"language model"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"delta":{"content":"created by Alibaba Cloud"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"delta":{"content":". I am called Qwen."},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: {"choices":[{"delta":{"content":""},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1715931028,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-3bb05cf5cd819fbca5f0b8d67a025022"}
data: [DONE]
被其他客户端应用集成
本文以Windows平台上的ChatBox v1.13.4应用举例说明。其他客户端应用(如Cherry Studio、AnythingLLM等)请参见本地App集成RAG服务。
下载并安装Chatbox。
打开ChatBox,按照以下方式配置模型提供方名称,如LangStudio。
选择已配置的模型提供方,配置服务请求参数。
关键参数说明:
参数
描述
API 模式
固定为
OpenAI API兼容
。API 密钥
配置已部署LangStudio服务的Token,获取方式见API调用-步骤1。
API 主机
配置已部署LangStudio服务的调用地址(获取方式见API调用-步骤1),并在末尾添加
/v1
后缀。本文以公网调用地址为例,则API主机需配置为http://langstudio-20250319153409-xdcp.115770327099****.cn-hangzhou.pai-eas.aliyuncs.com/v1
。API 路径
固定为
/chat/completions
。模型
单击新建,输入自定义模型ID,如qwen3-8b。
在Chat对话框中调用已部署的LangStudio服务。
查看Trace
在调用服务后,系统会自动生成一条Trace记录。您可以在链路追踪页签下单击指定链路操作列的查看链路,通过查看Trace详情进行应用流效果的评估。
该Trace数据支持您查看应用流中各个节点的输入和输出信息,如向量数据库召回的结果,或LLM节点的输入和输出信息等。
附录:对话历史
对于“对话型”应用流,LangStudio提供了多轮对话的历史消息存储功能。您可以选择使用本地存储或外部存储来保存对话历史。
存储类型
本地存储:服务将利用本地磁盘,在部署应用流的EAS实例上自动创建一个名为chat_history.db的SQLite数据库来保存对话历史记录,默认存储路径为
/langstudio/flow/
。需要注意,本地存储方案不支持多实例部署。请定期检查本地磁盘的使用情况,您也可以通过下文提供的API接口进行对话历史数据的查询和删除操作。当EAS实例被移除时,相关的对话历史数据也将一并被清除。外部存储:目前支持使用RDS MySQL进行存储。您需要在部署服务时,为对话历史存储配置一个RDS MySQL连接,具体配置方法请参见服务连接配置-数据库。服务将在您配置的RDS MySQL数据库中自动创建以服务名称为后缀的表,例如
langstudio_chat_session_<服务名称>
和langstudio_chat_history_<服务名称>
,分别用于存储对话Session及对话历史消息。
Session/User支持
每一次对应用流服务的对话请求都是无状态的,当您希望多次请求被当作是同一个对话时,需要通过手动配置请求头的方式完成。服务请求方式详情请参见API调用。
请求头名称 | 数据类型 | 说明 | 备注 |
Chat-Session-Id | String | 会话ID,每一次对服务的请求,系统会自动向本次会话分配唯一标识符,用以区分不同会话,并通过Response Header中 | 支持使用自定义会话ID,为了保证唯一性,会话ID规范为长度为32-255个字符,支持大小写字母、数字、下划线(_)、中划线(-)、英文冒号(:)。 |
Chat-User-Id | String | 用户ID,标识对话所属用户。系统不会自动分配,支持用户自定义。 | - |
对话历史API
应用流服务还提供了对话历史数据管理API,您可以方便地通过API来查看和删除这些数据。只需通过GET请求访问 {Endpoint}/openapi.json
,即可获取完整的API Schema。该Schema基于Swagger标准构建,为了更直观地理解和探索这些API,建议您使用Swagger UI进行可视化操作,使操作更加简单明了。