崔少飞
发布于 2026-03-11 / 19 阅读
0
0

Open-webui vs vllm二次开发

vllm开发的优势

1.环境是现成的

2.已经有了当前打包流程

3.已经有一部分写好的代码

4.不影响与ragflow的流式接口

vllm劣势

1.gpu资源有限,在开发时,ragflow的请求会受影响

2.vllm编译时间较长,CPU满负荷运转,执行pip install -e . 初次要15~20分钟

3.vllm属于推理引擎,与模型的关系很近,未来如果想换vllm版本是无法更换的

open web ui 开发优势

1.open web ui开发不影响现有ragflow的请求,开发环境可以选择windows

2.vllm未来升级,只要open ai api不变,就不用处理

3.前端ui本来就要变,业务上本来就要二次开发open web ui的代码

4.一些功能可以直接对接open web ui,如:统计

5.vllm 和 open web ui的代码都是py的,迁移一定是可以的

6.据官网的文档,open web ui有 “滤波功能”可以在数据发送到大型语言模型(LLM)(输入)之前或从LLM返回(输出)后修改数据。
Filter Function | Open WebUI

open web ui开发的劣势

1.之前的代码要迁移,不过涉及的代码也不多,目前只有敏感词过滤的逻辑

2.对open web ui不熟悉

3.open web ui作为ragflow的中转站会多一次请求,中间的流式衔接好不好搞尚未可知,但open web ui有滤波功能,或许可以参考

我的想法:选择open web ui

1.与业务贴合近

2.开发不影响推理引擎

3.开发不必非要在linux上,调试直接在windows上

4.AI辅助开发

对比方向:

1、开放模型接口是否可以转移到openWebUI; /v1/chat/completion

a、rag接入

b、第三方开放接口

2、敏感词过滤业务:在openWebUI和vllm的效率、作用、性能【敏感词至少W的量级】是否差别

3、开发工作量:未完成功能的开发难易度,已完成部分迁移的时间

a、一些功能可以直接对接open web ui,如:统计

4、补充其他

迁移到open web ui上

接口上:

  • rag 与 open web ui的接口对接?

如果真的要在 rag 上 请求 open web ui的接口,让open web ui 做中间跳板,那么

1.rag上的模型配置怎么改?

2.rag上和open web ui上用户信息的对接

3.rag 与 open web ui上的流式接口的数据格式也要对接

open web ui上的流:

data: {"id":"chatcmpl-92b287c8e85c61da","object":"chat.completion.chunk","created":1773292369,"model":"DeepSeek-R1-0528-Qwen3-8B","choices":[{"index":0,"delta":{"content":"有什么","reasoning_content":null},"logprobs":null,"finish_reason":null,"token_ids":null}]}

rag 则是直接对接的vllm的数据流

这里有个难点,就是需要修改原有的open web ui的代码,记录用户的对话信息,原有的sse不会记录用户的会话信息

4.bge模型怎么做?

向bge模型进行提问,open web ui -> The model does not support Chat Completions API
当前方案,包一个中间接口,做转发.

  • open web ui 第三方使用?

敏感词业务:

内置过滤函数,但这个过滤函数是open webui提供的一项功能,可以在

写了一个日志打印的filter,sse只看到了入模型前的数据,没有看到从模型出来的数据,这一块需要再修改。

前端:

用的不是vue,是svelte

保持原有的vllm,将用户与统计信息传递给open web ui

接口上:

rag 与 open web ui 在会话接口上

对接用户信息

对接会话信息

研究统计信息

第三方开放接口?

敏感词迁移上:

当前已经有 “数据入模型前的过滤代码”,需要调试和测试

1.服务启动时敏感词数据结构的构建
2.敏感词数据库的增删改查与接口

模型出来的数据尚未处理.


open web ui:
接口:
前台向后台请求的接口是 api/chat/completions

后台返回有两种情况:

第一种:异步返回,返回给前端json串,json串中带有taskid,然后走websocket

地址是:ws://localhost:8080/ws/socket.io/?EIO=4&transport=websocket

第二种:同步返回,返回的流协议是sse

接口中区分以上两种的类型就是不传递 session_id、chat_id、message_id三个中的任意一个

影响:

1.同步返回的sse,不会统计模型的用量、用户的动态,不会记录用户与模型的问答

新会话的创建会先调用 http://localhost:8080/api/v1/chats/new 获取chat_id 和 message_id

当传递chat_id 与 message_id,平台只记录对话数量,但没有记录用户对话与tokens数值,用户的对话记录和websocket绑定。

注意点:

1.token统计功能,需要在模型设置界面,将“用量”打钩

sse的调用流程:

接口

@app.post("/api/chat/completions")

@app.post("/api/v1/chat/completions")

async def chat_completion

return await process_chat(request, form_data, user, metadata, model)

async def process_chat(request, form_data, user, metadata, model)

请求前的参数配置:

form_data, metadata, events = await process_chat_payload(

request, form_data, user, metadata, model

)

处理聊天请求的主要函数,它会根据请求的参数和状态来调用不同的聊天生成函数:

response = await chat_completion_handler(request, form_data, user)

创建处理聊天响应所需的所有上下文信息:

ctx = build_chat_response_context(

request, form_data, user, model, metadata, tasks, events

)

处理模型返回数据:

return await process_chat_response(response, ctx)


评论