ðª ãã£ã«ã¿é¢æ°: å ¥åãšåºåã倿Žãã
Open WebUIã«ããããã£ã«ã¿æ©èœã®å æ¬çãªã¬ã€ããžããããïŒãã£ã«ã¿ã¯ããã©ã°ã€ã³ã·ã¹ãã ãšããŠæè»ãã€åŒ·åãªãã®ã§ãããå€§èŠæš¡èšèªã¢ãã«ïŒLLMïŒãžéä¿¡ãããåã®å ¥åããŒã¿ãLLMããè¿ãããåŸã®åºåããŒã¿ã倿Žããããšãå¯èœã§ããã³ã³ããã¹ããåäžãããããã«å ¥åã倿ããããå¯èªæ§ãæ¹åããããã«åºåãæŽçãããããéã«ããã£ã«ã¿é¢æ°ããã¹ãŠãå®çŸããŸãã
ãã®ã¬ã€ãã§ã¯ããã£ã«ã¿ãšã¯äœããã®ä»çµã¿ããã®æ§é ããããŠèªåã ãã®åŒ·åã§äœ¿ãããããã£ã«ã¿ãæ§ç¯ããããã«å¿ èŠãªãã¹ãŠã詳ãã説æããŸããããã§ã¯å§ããŸãããïŒæ¯å©ãäŸããã³ãã䜿ã£ãŠãããããã説æããŸãã®ã§å¿é ãããŸãã ð
ð Open WebUIã«ããããã£ã«ã¿ãšã¯ïŒâ
Open WebUIãæ°Žãæµãããã€ãã©ã€ã³ãšã€ã¡ãŒãžããŠãã ããïŒ
- ãŠãŒã¶ãŒå ¥åãšLLMã®åºåãæ°Žã§ãã
- ãã£ã«ã¿ã¯ãç®çå°ã«å°éããåã«ãæµããæµåãä¿®æ£ãé©å¿ãããæ°ŽåŠçã¹ããŒãžã§ãã
ãã£ã«ã¿ã¯æµãã®äžéã«åº§ãããã§ãã¯ãã€ã³ãã®ããã«ã調æŽãå¿ èŠãªéšåãæ±ºå®ããŸãã
以äžã¯ãã£ã«ã¿ã®åœ¹å²ã®æŠèŠã§ãïŒ
- ãŠãŒã¶ãŒå ¥åã®å€æŽïŒInlet颿°ïŒïŒAIã¢ãã«ã«å±ãåã«å ¥åããŒã¿ã調æŽããŸããããã«ãããæç¢ºããé«ããããã³ã³ããã¹ãã远å ããããããã¹ããæŽçããããç¹å®ã®èŠä»¶ã«åãããŠã¡ãã»ãŒãžãåãã©ãŒãããããããšãã§ããŸãã
- ã¢ãã«åºåã®ã¹ããªãŒã ãã€ã³ã¿ãŒã»ããããïŒStream颿°ïŒïŒã¢ãã«ã«ãã£ãŠçæãããAIã®ã¬ã¹ãã³ã¹ããªã¢ã«ã¿ã€ã ã§èª¿æŽããŸããããã¯ãæ©å¯æ å ±ã®ãã£ã«ã¿ãªã³ã°ããåºåãããèªã¿ããããã©ãŒãããããã®ã«åœ¹ç«ã¡ãŸãã
- ã¢ãã«åºåã®å€æŽïŒOutlet颿°ïŒïŒAIã®ã¬ã¹ãã³ã¹ãåŠçãããåŸããŠãŒã¶ãŒã«è¡šç€ºããåã«èª¿æŽããŸããããã«ãããããŒã¿ãæŽç·Žããããããã°ãåã£ããããŠãŒã¶ãŒäœéšãåäžãããããã«é©å¿ãããããšãã§ããŸãã
éèŠãªæŠå¿µ: ãã£ã«ã¿ã¯ç¬ç«ããã¢ãã«ã§ã¯ãªããã¢ãã«ã«éä¿¡ãããããŒã¿ãã¢ãã«ããè¿ãããããŒã¿ã匷åãŸãã¯å€æããããŒã«ã§ãã
ãã£ã«ã¿ã¯ãAIã¯ãŒã¯ãããŒã®äžã§ç¿»èš³è ãç·šéè ã®ãããªåœ¹å²ãæãããæµãã劚ããããšãªãäŒè©±ãã€ã³ã¿ãŒã»ããããŠå€æŽã§ããŸãã
ðºïž ãã£ã«ã¿é¢æ°ã®æ§é : 骚çµã¿â
ãã£ã«ã¿é¢æ°ã®æãç°¡åãªè¡šçŸããå§ããŸããããäžéšãæåã«æè¡çã«æãããããããããŸããããåé¡ãããŸããâããããäžæ©äžæ©åè§£ããŠèª¬æããŸãïŒ
ðŠŽ ãã£ã«ã¿ã®åºæ¬çãªéªšçµã¿â
from pydantic import BaseModel
from typing import Optional
class Filter:
# ãã«ã: ãã£ã«ã¿ã®èšå®ãªãã·ã§ã³
class Valves(BaseModel):
pass
def __init__(self):
# ãã«ããåæå (ãã£ã«ã¿çšã®ãªãã·ã§ã³èšå®)
self.valves = self.Valves()
def inlet(self, body: dict) -> dict:
# ãŠãŒã¶ãŒå
¥åãæäœããå Žæã§ãã
print(f"inlet åŒã³åºã: {body}")
return body
def stream(self, event: dict) -> dict:
# ã¢ãã«åºåã®åå²ããããã£ã³ã¯ãæäœããå Žæã§ãã
print(f"stream ã€ãã³ã: {event}")
return event
def outlet(self, body: dict) -> None:
# ã¢ãã«åºåãæäœããå Žæã§ãã
print(f"outlet åŒã³åºã: {body}")
ð ð§² ãã°ã«ãã£ã«ã¿ã®äŸ: ã€ã³ã¿ã©ã¯ãã£ãæ§ãšã¢ã€ã³ã³ã®è¿œå (Open WebUI 0.6.10ã§æ°ç»å Ž)â
ãã£ã«ã¿ã¯åã«ããã¹ãã倿Žãã以äžã®ããšãå¯èœã§ãâUIãã°ã«ãå ¬éããããã«ã¹ã¿ã ã¢ã€ã³ã³ã衚瀺ãããã§ããŸããããšãã°ããã£ã«ã¿ãUIã®ãã¿ã³ã§ãªã³/ãªãã§ããããã«ããOpen WebUIã®ã¡ãã»ãŒãžå ¥åUIã«ç¹å¥ãªã¢ã€ã³ã³ã衚瀺ããããšãã§ããŸãã
以äžã¯ãã®ãããªãã°ã«ãã£ã«ã¿ãäœæããæ¹æ³ã§ã:
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 (Data URI ã䜿çš) ã¯ããã£ã«ã¿ãŒåã®é£ã«å°ããªç»åãšããŠè¡šç€ºãããŸããSVG ã Data URI ãšã³ã³ãŒã圢åŒã§äœ¿çšããããšãã§ããŸãã
inlet
颿° ã¯ã__event_emitter__
ç¹å¥ãªåŒæ°ã䜿çšããŠãUI ã«ãã£ãŒãããã¯/ã¹ããŒã¿ã¹ãæŸéããŸããäŸãã°ãåãæ¿ããŸããïŒããšããéç¥ãããŒã¹ãã®ããã«è¡šç€ºãããŸãã
ãããã®ã¡ã«ããºã ã䜿çšããŠããã£ã«ã¿ãŒãåçãã€ã³ã¿ã©ã¯ãã£ããèŠèŠçã«ãŠããŒã¯ ãªãã®ã«ããOpen WebUI ã®ãã©ã°ã€ã³ãšã³ã·ã¹ãã å ã§æŽ»çšã§ããŸãã
ð¯ äž»èŠã³ã³ããŒãã³ãã®èª¬æâ
1ïžâ£ Valves
ã¯ã©ã¹ (ãªãã·ã§ã³èšå®)â
Valves ããã£ã«ã¿ãŒã®ãããã¹ã©ã€ããŒãšèããŠãã ããããã£ã«ã¿ãŒã®åäœã調æŽããããã«ããŠãŒã¶ãŒã«èšå®å¯èœãªãªãã·ã§ã³ãæäŸãããå Žåãããã§å®çŸ©ããŸãã
class Valves(BaseModel):
OPTION_NAME: str = "Default Value"
äŸãã°ïŒ
ã¬ã¹ãã³ã¹ã倧æåã«å€æãããã£ã«ã¿ãŒãäœæããŠããå Žåããã¹ãŠã®åºåãå®å
šã«å€§æååããããã©ãããèšå®ããããã« TRANSFORM_UPPERCASE: bool = True/False
ã®ãããªãã«ããæäŸããããšãã§ããŸãã
2ïžâ£ inlet
颿° (å
¥åäºååŠç)â
inlet
颿°ã¯ã調çåã®é£ææºåã®ãããªãã®ã§ããæç人ã ãšæ³åããŠãã ãããææãã¬ã·ãã«å
¥ãåã«ïŒãã®å Žå LLM ã«éãããåã«ïŒãéèãæŽã£ãããçãããå»ãã ããèã«äžå³ãã€ããããããããããŸããããã®ã¹ãããããªããã°ãæçµçãªæçã峿°ãª ããçéèãå«ãããŸãã¯åã«äžè²«æ§ããªããã®ã«ãªãå¯èœæ§ããããŸãã
Open WebUI ã®äžçã§ã¯ãinlet
颿°ã¯ããŠãŒã¶ãŒå
¥å ãã¢ãã«ã«éä¿¡ããåã«éèŠãªæºåäœæ¥ãè¡ããŸãããã®æºåã«ãããAI ãåŠçããããã®å
¥åãå¯èœãªéãã¯ãªãŒã³ã§ãã³ã³ããã¹ãã«åºã¥ããŠåœ¹ã«ç«ã€ãã®ãšãªããŸãã
ð¥ å ¥å:
body
: Open WebUI ããã¢ãã«ãžã®çã®å ¥åãéåžžããã£ããå®äºãªã¯ãšã¹ãã®åœ¢åŒã§ïŒäŒè©±ã®ã¡ãã»ãŒãžãã¢ãã«èšå®ããã®ä»ã®ã¡ã¿ããŒã¿ãªã©ã®ãã£ãŒã«ããå«ãèŸæžïŒãããã¯ã¬ã·ãã®ææã®ãããªãã®ã§ãã
ð ããªãã®ã¿ã¹ã¯:
body
ãä¿®æ£ããŠè¿ãããã®ä¿®æ£ããã body
ã LLM ã«éããããã®ã§ãããããã«ãã£ãŠå
¥åã«æç¢ºããæ§é ãã³ã³ããã¹ããå ããæ©äŒãåŸãããŸãã
ð³ inlet
ã䜿çšããçç±â
-
ã³ã³ããã¹ãã®è¿œå : ç¹ã«ãŠãŒã¶ãŒã®ããã¹ããææ§ãŸãã¯äžå®å šãªå Žåã«éèŠãªæ å ±ãèªåçã«è¿œå ããŸããäŸãã°ãããªãã¯ãã¬ã³ããªãŒãªã¢ã·ã¹ã¿ã³ãã§ãããããã®ãŠãŒã¶ãŒããœãããŠã§ã¢ã®ãã°ã解決ããã®ãå©ããŠãã ããããªã©ã
-
ããŒã¿ã®ãã©ãŒãããã£ã³ã°: å ¥åã JSON ã Markdown ãªã©ç¹å®ã®åœ¢åŒãå¿ èŠãšããå Žåãã¢ãã«ã«éä¿¡ããåã«å€æããŸãã
-
å ¥åã®ãµãã¿ã€ãº: äžèŠãª æåãåé€ããããéå°ãªç©ºçœãçµµæåãªã©ã®æœåšçã«æå®³ãŸãã¯æ··ä¹±ãæãå¯èœæ§ã®ããèšå·ãåé€ããŸããææãªæ å ±ã眮ãæããããšããããŸãã
-
ãŠãŒã¶ãŒå ¥åã®ç°¡çŽ å: ã¢ãã«ã®åºåã远å ã®ã¬ã€ãã³ã¹ã«ãã£ãŠæ¹åãããå Žåã
inlet
ã䜿çšããŠèªåçã«æç¢ºãªæç€ºãæ¿å ¥ããããšãã§ããŸãã
ð¡ äŸïŒé£ææºåãããŒã¹ã«ãããŠãŒã¹ã±ãŒã¹â
ð¥ äŸ1: ã·ã¹ãã ã³ã³ããã¹ãã®è¿œå â
LLM ãã€ã¿ãªã¢æçã®èª¿çãæºåããŠããã·ã§ãã§ãããšä»®å®ããŠãã ããããããããŠãŒã¶ãŒããããã¯ã€ã¿ãªã¢æçã®èª¿çã®ããã§ãããšæèšããŠããªãå ŽåãããŒã¿ãã¢ãã«ã«éä¿¡ããåã«ãã®ã³ã³ããã¹ãã远å ããããšã§ãã¡ãã»ãŒãžãæç¢ºã«ãªããŸãã
def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
# äŒè©±å
ã§ã€ã¿ãªã¢æçã®ã³ã³ããã¹ãã远å
context_message = {
"role": "system",
"content": "ãŠãŒã¶ãŒãã€ã¿ãªã¢æçã®æºåãããŠããã®ãå©ããŸãã"
}
# ãã£ããå±¥æŽã®æåã«ã³ã³ããã¹ããæ¿å
¥
body.setdefault("messages", []).insert(0, context_message)
return body
ð äœãèµ·ããïŒ
- ãŠãŒã¶ãŒã®å ¥åãããããã®å€é£ã®ã¢ã€ãã¢ã¯ïŒãã«ã€ã¿ãªã¢ã®ããŒãã远å ãããŸãããããŠãã·ã¹ãã ã³ã³ããã¹ãã®ãããã§ããŒãºã±ãŒãã§ã¯ãªããã¹ã¿ãåçã«è¡šç€ºãããå¯èœæ§ãé«ããªããŸãã
ðª äŸ2: å ¥åã®ã¯ãªãŒãã³ã° (äžèŠãªæåã®åé€)â
ãŠãŒã¶ãŒå
¥åãä¹±éã§ã!!!
ãªã©ã®äž èŠãªèšå·ãå«ãŸããŠããå Žåãã¢ãã«ãè§£æãã«ããå¹çãäœäžããŸãããã®å
å®¹ãæŽçãã€ã€ãäž»ãªå
容ã¯ä¿æããŸãã
def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
# ãŠãŒã¶ãŒã®æåŸã®ã¡ãã»ãŒãžãã¯ãªãŒãã³ã° (ã¡ãã»ãŒãžãªã¹ãã®æåŸããååŸ)
last_message = body["messages"][-1]["content"]
body["messages"][-1]["content"] = last_message.replace("!!!", "").strip()
return body
ð äœãèµ·ããïŒ
- 倿å:
"ãã®åé¡ãã©ããã£ãŠãããã°ããã®!!!"
â¡ïž ã¢ãã«ã«éãããå 容:"ãã®åé¡ãã©ããã£ãŠãããã°ããã®"
泚æ: ãŠãŒã¶ãŒã®æãæ¹ã¯å€ãããŸããããã¢ãã«ã«ã¯ããã¯ãªãŒã³ã§çè§£ããããã¯ãšãªãåŠçãããŸãã
ð inlet
ãLLMã®å
¥åæé©åã«åœ¹ç«ã€æ¹æ³:â
- ææ§ãªã¯ãšãªãæç¢ºã«ããããšã§ç²ŸåºŠãåäžãããŸãã
- çµµæåãHTMLã¿ã°ãäœåãªå¥èªç¹ãªã©ã®äžèŠãªãã€ãºãåãé€ãããšã§AIãããå¹ççã«ããŸãã
- ãŠãŒã¶ãŒå ¥åãã¢ãã«ãæåŸ ãã圢åŒãã¹ããŒãïŒäŸãã°ç¹å®ã®å©çšã±ãŒã¹ã«ãããJSONãªã©ïŒã«ãã©ãŒãããããããšã§äžè²«æ§ã確ä¿ããŸãã
ð inlet
ããããã³ã®å¯æç人ãšèããŠã¿ãŠãã ãã â ã¢ãã«ïŒAIã®"ã¬ã·ã"ïŒã«å
¥ããã®ãã¹ãŠãæºåãããæž
æãããå®ç§ã«èª¿çãããŠããããšãä¿èšŒããŸããå
¥åãè¯ããã°ã¢ãŠãããããè¯ããªããŸãïŒ
ð 3ïžâ£ stream
ãã㯠(Open WebUI 0.5.17ã®æ°æ©èœ)â
ð stream
ããã¯ãšã¯äœã§ããïŒâ
stream
颿°ã¯ãOpen WebUI 0.5.17ã§å°å
¥ãããæ°æ©èœã§ãã¢ãã«ããã¹ããªãŒãã³ã°ãããã¬ã¹ãã³ã¹ããªã¢ã«ã¿ã€ã ã§ååããã³ä¿®æ£ã§ããæ©èœãæäŸããŸãã
outlet
ã宿ããã¬ã¹ãã³ã¹å
šäœãåŠçããã®ã«å¯Ÿããstream
ã¯ã¢ãã«ããåä¿¡ããåã
ã®ãã£ã³ã¯ã«å¯ŸããŠåäœããŸãã
ð ïž Streamããã¯ã䜿çšããã¿ã€ãã³ã°â
- ãŠãŒã¶ãŒã«è¡šç€ºãããåã«ã¹ããªãŒãã³ã°ã¬ã¹ãã³ã¹ãä¿®æ£ããã
- ãªã¢ã«ã¿ã€ã ãªæ€é²ãã¯ãªãŒã³ã¢ãããå®è£ ããã
- ã¹ããªãŒãã³ã°ããŒã¿ã®ã¢ãã¿ãªã³ã°ããã°/ãããã°ãè¡ãã
ð äŸ: ã¹ããªãŒãã³ã°ãã£ã³ã¯ã®ãã®ã³ã°â
次ã®ããã«ããŠãã¹ããªãŒãã³ã°ãããLLMã¬ã¹ãã³ã¹ãæ€æ»ããã³ä¿®æ£ã§ããŸã:
def stream(self, event: dict) -> dict:
print(event) # ååä¿¡ãã£ã³ã¯ãæ€æ»ããããã«å°å·
return event
äŸ: ã¹ããªãŒãã³ã°ã€ãã³ã:
{"id": "chatcmpl-B4l99MMaP3QLGU5uV7BaBM0eDS0jb","choices": [{"delta": {"content": "Hi"}}]}
{"id": "chatcmpl-B4l99MMaP3QLGU5uV7BaBM0eDS0jb","choices": [{"delta": {"content": "!"}}]}
{"id": "chatcmpl-B4l99MMaP3QLGU5uV7BaBM0eDS0jb","choices": [{"delta": {"content": " ð"}}]}
ð ã©ããªãã®ãïŒ
- åè¡ã¯ã¢ãã«ããã¹ããªãŒãã³ã°ãããã¬ã¹ãã³ã¹ã®å°ããªæçã衚ããŠããŸãã
delta.content
ãã£ãŒã«ãã«ã¯é次çæãããããã¹ããå«ãŸããŸãã
ð äŸ: ã¹ããªãŒãã³ã°ããŒã¿ããçµµæåããã£ã«ã¿ãªã³ã°â
def stream(self, event: dict) -> dict:
for choice in event.get("choices", []):
delta = choice.get("delta", {})
if "content" in delta:
delta["content"] = delta["content"].replace("ð", "") # çµµæåãé€å»
return event
ð 倿Žå: "Hi ð"
ð 倿ŽåŸ: "Hi"
4ïžâ£ outlet
颿° (åºååŸåŠç)â
outlet
颿°ã¯ãAIã®ã¬ã¹ãã³ã¹ãæŽçïŒãŸãã¯æçµçãªå€æŽãå ããïŒããæ ¡æ£è
ã®ãããªåœ¹å²ãæãããŸãã LLMã«ããåŠçãå®äºããåŸã«å¯Ÿå¿ããŸãã
ð€ å ¥å:
body
: ããã«ã¯ããã£ããå ã®çŸåšã®ãã¹ãŠã®ã¡ãã»ãŒãžïŒãŠãŒã¶ãŒå±¥æŽ + LLMå¿çïŒãå«ãŸããŸãã
ð ããªãã®ã¿ã¹ã¯: ãã®body
ãä¿®æ£ããŸããã¯ãªãŒã³ã¢ããã远å ã倿Žã®ãã°èšé²ãå¯èœã§ãããå調æŽããŠãŒã¶ãŒäœéšã«äžãã圱é¿ã«ã¯æ³šæãå¿
èŠã§ãã
ð¡ ãã¹ããã©ã¯ãã£ã¹:
- ãã®ã³ã°ãåªå ããã¢ãŠãã¬ããã§ã®çŽæ¥ç·šéãæ§ããïŒäŸ: ãããã°ãåæåãïŒã
- åºåã®ãã©ãŒããããªã©ã®å€§å¹ ãªå€æŽãå¿ èŠãªå Žåã¯ãpipe颿°ã®äœ¿çšãæ€èšããŠãã ããã
ð¡ ãŠãŒã¹ã±ãŒã¹äŸ: ãŠãŒã¶ãŒã«èŠããããªãæ©å¯APIã¬ã¹ãã³ã¹ãé€å»ãã:
def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
for message in body["messages"]:
message["content"] = message["content"].replace("<API_KEY>", "[REDACTED]")
return body
ð ãã£ã«ã¿ãŒã®å®è·µ:å®äŸã®æ§ç¯â
ãã£ã«ã¿ãŒã®äœ¿ç𿹿³ãçè§£ããããã«ãå®éã®äŸãããã€ãæ§ç¯ããŠã¿ãŸãããïŒ
ð äŸ #1: ãŠãŒã¶ãŒå ¥åã«åžžã«ã³ã³ããã¹ãã远å â
LLMã«å¯Ÿããåžžã«ãœãããŠã§ã¢ã®ãã°è§£æ±ºãæ¯æŽããããšãäŒããã«ã¯ããããªãã¯ãœãããŠã§ã¢ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ã¢ã·ã¹ã¿ã³ãã§ãããšãã£ãæç€ºãåãŠãŒã¶ãŒã¯ãšãªã«è¿œå ã§ããŸãã
class Filter:
def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
context_message = {
"role": "system",
"content": "ããªãã¯ãœãããŠã§ã¢ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ã¢ã·ã¹ã¿ã³ãã§ãã"
}
body.setdefault("messages", []).insert(0, context_message)
return body
ð äŸ #2: èªã¿ãããã®ããã«åºåã匷調â
Markdownããã®ä»ã®ãã©ãŒããããããã¹ã¿ã€ã«ã§åºåãè¿ãå Žåã¯ãoutlet
颿°ã䜿çšããŸãïŒ
class Filter:
def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
# åã¬ã¹ãã³ã¹ã«ã匷調ãããŒã¯ããŠã³ã远å
for message in body["messages"]:
if message["role"] == "assistant": # ã¢ãã«å¿çã察象
message["content"] = f"**{message['content']}**" # ããŒã¯ããŠã³ã§åŒ·èª¿è¡šç€º
return body
ð§ æ··ä¹±ãé²ã: FAQ ðâ
Q: ãã£ã«ã¿ãŒã¯Pipe颿°ãšã©ãéãã®ãïŒâ
ãã£ã«ã¿ãŒã¯ãã¢ãã«ã«éä¿¡ãããããŒã¿ãã¢ãã«ããè¿ãããããŒã¿ãä¿®æ£ããŸããããããã®æ®µéå€ã®ããžãã¯ã«å€§ããå¹²æžããããšã¯ãããŸãããäžæ¹ãPipe颿°ã¯æ¬¡ã®ããšãã§ããŸã:
- å€éšAPIãçµ±åããããŸãã¯ããã¯ãšã³ãã§ã®æäœã®æ¹æ³ãå€§å¹ ã«å€åœ¢ã
- å®å šã«æ°ãããã¢ãã«ããšããŠã«ã¹ã¿ã ããžãã¯ãå ¬éã
Q: outlet
å
ã§éããåŸåŠçãè¡ããŸããïŒâ
ã§ããŸãããæåã®æ¹æ³ã§ã¯ãããŸããã:
- ãã£ã«ã¿ãŒã¯è»œéãªå€æŽããã°èšé²ãè¡ãããã«èšèšãããŠããŸãã
- å€§å¹ ãªä¿®æ£ãå¿ èŠãªå Žåã¯ã代ããã«ãã€ã颿°ãæ€èšããŠãã ããã
ð ãŸãšã: ãã£ã«ã¿ãŒé¢æ°ãæ§ç¯ããçç±â
ãããŸã§ã«ããªããåŠãã ããš:
- ã€ã³ã¬ããã¯ãŠãŒã¶ãŒå ¥åãæäœããŸãïŒäºååŠçïŒã
- ã¹ããªãŒã ã¯ã¹ããªãŒã ãããã¢ãã«åºåã«ä»å ¥ã倿Žãå ããŸãïŒãªã¢ã«ã¿ã€ã ïŒã
- ã¢ãŠãã¬ããã¯AIåºåã埮調æŽããŸãïŒåŸåŠçïŒã
- ãã£ã«ã¿ãŒã¯ããŒã¿ãããŒãžã®è»œéã§ãªã¢ã«ã¿ã€ã ãªå€æŽã«æé©ã§ãã
- ãã«ãã䜿çšããã°ããã£ã«ã¿ãŒãåçã«èšå®ããããšã§ãŠãŒã¶ãŒã«åãããæåãå¯èœã«ããåãäžããããšãã§ããŸãã
ð ããªãã®çªã§ã: ããå®éšãå§ããŸãããïŒå°ããªå€æŽãã³ã³ããã¹ãã®è¿œå ã§Open WebUIäœéšãåäžãããã«ã¯ã©ãããã°è¯ãã§ããããïŒãã£ã«ã¿ãŒæ§ç¯ã¯æ¥œãããæè»ã«æŽ»çšã§ããããªãã®ã¢ãã«ã次ã®ã¬ãã«ãžåŒãäžããŸãïŒ
ããããŒã³ãŒãã£ã³ã°ïŒâš