🪄 过滤功能:修改输入与输出
欢迎来到 Open WebUI 中关于过滤功能的全面指南!过滤器是一种灵活且强大的插件系统,用于在数据发送到大型语言模型(LLM)之前(输入)或从 LLM 返回之后(输出)进行修改。不管您是为了更好地设置上下文而转化输入,还是为了提高可读性整理输出,过滤功能都可以胜任。
本指南将详细介绍什么是过滤器、它们如何工作、它们的结构,以及构建您自己的强大且用户友好的过滤器所需的一切知识。让我们开始吧,别担心—我会用比喻、实例和提示来让一切变得清晰易懂!🌟
🌊 什么是 Open WebUI 中的过滤器?
将 Open WebUI 想象成一股流经管道的水流:
- 用户输入和LLM 输出就是水。
- 过滤器是水处理阶段,在最终目的地之前对水进行清洁、修改和调整。
过滤器坐在数据流中间——类似于检查点——您可以决定需要调整什么。
以下是过滤器的功能概述:
- 修改用户输入(入口函数):在数据到达 AI 模型之前调整输入数据。在这里,您可以增强清晰度、添加上下文、清理文本或重新格式化消息以满足特定需求。
- 拦截模型输出(流函数):在模型生成回复的过程中捕获并调整输出。这在实时修改中非常有用,比如过滤敏感信息或为了提高可读性对输出进行格式化。
- 修改模型输出(出口函数):在 AI 的回复被处理之后,在展示给用户之前再进行调整。这有助于优化数据、记录日志或改善用户体验。
关键概念: 过滤器不是独立的模型,而是增强或转化数据在模型之间流动的工具。
过滤器就像 AI 工作流中的翻译员或编辑:您可以拦截并改变对话,而不打断流程。
🗺️ 过滤功能的结构:骨架
让我们从过滤功能的最简单表示开始。如果有些部分乍一看感觉技术性较强,请别担心——我们会逐步解析!
🦴 过滤器的基本骨架
from pydantic import BaseModel
from typing import Optional
class Filter:
# Valves: 过滤器的配置选项
class Valves(BaseModel):
pass
def __init__(self):
# 初始化阀门(过滤器的可选配置)
self.valves = self.Valves()
def inlet(self, body: dict) -> dict:
# 在此处操作用户输入。
print(f"入口函数被调用:{body}")
return body
def stream(self, event: dict) -> dict:
# 在此处修改模型输出的流数据块。
print(f"流事件:{event}")
return event
def outlet(self, body: dict) -> None:
# 在此处操作模型输出。
print(f"出口函数被调用:{body}")
🆕 🧲 切换过滤器示例:添加交互性和图标(Open WebUI 0.6.10 新功能)
过滤器不仅可以修改文本,它们还可以提供 UI 切换按钮和显示自定义图标。例如,您可能需要一个过滤器可以通过用户界面的按钮开启/关闭,并在 Open WebUI 的消息输入界面中显示特殊图标。
以下是如何创建这样一个切换过滤器:
from pydantic import BaseModel, Field
from typing import Optional
class Filter:
class Valves(BaseModel):
pass
def __init__(self):
self.valves = self.Valves()
self.toggle = True # 重要: 这将在 Open WebUI 中创建一个切换 UI
# 提示: 使用 SVG 数据 URI!
self.icon = """data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBjbGFzcz0ic2l6ZS02Ij4KICA8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xMiAxOHYtNS4yNW0wIDBhNi4wMSA2LjAxIDAgMCAwIDEuNS0uMTg5bS0xLjUuMTg5YTYuMDEgNi4wMSAwIDAgMS0xLjUtLjE4OW0zLjc1IDcuNDc4YTEyLjA2IDEyLjA2IDAgMCAxLTQuNSAwbTMuNzUgMi4zODNhMTQuNDA2IDE0LjQwNiAwIDAgMS0zIDBNMTQuMjUgMTh2LS4xOTJjMC0uOTgzLjY1OC0xLjgyMyAxLjUwOC0yLjMxNmE3LjUgNy41IDAgMSAwLTcuNTE3IDBjLjg1LjQ5MyAxLjUwOSAxLjMzMyAxLjUwOSAyLjMxNlYxOCIgLz4KPC9zdmc+Cg=="""
pass
async def inlet(
self, body: dict, __event_emitter__, __user__: Optional[dict] = None
) -> dict:
await __event_emitter__(
{
"type": "status",
"data": {
"description": "已切换!",
"done": True
"hidden": False,
},
}
)
return body
🖼️ 什么事情正在发生?
- toggle = True 在 Open WebUI 中创建一个切换开关 UI——用户可以实时手动启用或禁用过滤器。
- icon(携带一个数据 URI)将作为一个小图标显示在过滤器名称的旁边。您可以使用任何经过数据 URI 编码的 SVG!
inlet
函数 使用__event_emitter__
特殊参数向 UI 广播反馈/状态,例如一个小的 toast/通知提示 "已切换!"
您可以使用这些机制使您的过滤器在 Open WebUI 的插件生态系统中变得动态、互动、并具有视觉上的独特性。