Spaces:
Configuration error
Configuration error
from __future__ import annotations | |
from typing import Any | |
from typing_extensions import TypedDict | |
from neollm import MyL3M2, MyLLM | |
from neollm.types import LLMSettings, Messages, Response | |
_MyLLM = MyLLM[Any, Any] | |
_MyL3M2 = MyL3M2[Any, Any] | |
class PromptCheckerInput(TypedDict): | |
myllm: _MyLLM | _MyL3M2 | |
model: str | |
platform: str | |
llm_settings: LLMSettings | None | |
class APromptCheckerInput(TypedDict): | |
myllm: _MyLLM | |
class APromptChecker(MyLLM[APromptCheckerInput, str]): | |
def _preprocess(self, inputs: APromptCheckerInput) -> Messages: | |
system_prompt = ( | |
"あなたは、AIへの指示(プロンプト)をより良くすることが仕事です。\n" | |
"あなたは言語能力が非常に高く、仕事も丁寧なので小さなミスも気づくことができる天才です。" | |
"誤字脱字・論理的でない点・指示が不明確な点を箇条書きで指摘し、より良いプロンプトを提案してください。\n" | |
"# 出力例: \n" | |
"[指示の誤字脱字/文法ミス]\n" | |
"- ...\n" | |
"- ...\n" | |
"[指示が論理的でない点]\n" | |
"- ...\n" | |
"- ...\n" | |
"[指示が不明確な点]\n" | |
"- ...\n" | |
"- ...\n" | |
"[その他気になる点]\n" | |
"- ...\n" | |
"- ...\n" | |
"[提案]\n" | |
"- ...\n" | |
"- ...\n" | |
) | |
if inputs["myllm"].messages is None: | |
return [] | |
user_prompt = "# プロンプト\n" + "\n".join( | |
# [f"<{message['role']}>\n{message['content']}\n" for message in inputs.messages] | |
[str(message) for message in inputs["myllm"].messages] | |
) | |
messages: Messages = [ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": user_prompt}, | |
] | |
return messages | |
def _postprocess(self, response: Response) -> str: | |
if response.choices[0].message.content is None: | |
return "contentがないンゴ" | |
return response.choices[0].message.content | |
def _ruleprocess(self, inputs: APromptCheckerInput) -> str | None: | |
if inputs["myllm"].messages is None: | |
return "ruleprocessが走って、リクエストしてないよ!" | |
return None | |
def __call__(self, inputs: APromptCheckerInput) -> str: | |
outputs: str = super().__call__(inputs) | |
return outputs | |
class PromptsChecker(MyL3M2[PromptCheckerInput, None]): | |
def _link(self, inputs: PromptCheckerInput) -> None: | |
if isinstance(inputs["myllm"], MyL3M2): | |
for myllm in inputs["myllm"].myllm_list: | |
prompts_checker = PromptsChecker(parent=self, verbose=True) | |
prompts_checker( | |
inputs={ | |
"myllm": myllm, | |
"model": inputs["model"], | |
"platform": inputs["platform"], | |
"llm_settings": inputs["llm_settings"], | |
} | |
) | |
elif isinstance(inputs["myllm"], MyLLM): | |
a_prompt_checker = APromptChecker( | |
parent=self, | |
llm_settings=inputs["llm_settings"], | |
verbose=True, | |
platform=inputs["platform"], | |
model=inputs["model"], | |
) | |
a_prompt_checker(inputs={"myllm": inputs["myllm"]}) | |
def __call__(self, inputs: PromptCheckerInput) -> None: | |
super().__call__(inputs) | |
def check_prompt( | |
myllm: _MyLLM | _MyL3M2, | |
llm_settings: LLMSettings | None = None, | |
model: str = "gpt-3.5-turbo", | |
platform: str = "openai", | |
) -> MyL3M2[Any, Any]: | |
prompt_checker_2 = PromptsChecker(verbose=True) | |
prompt_checker_2(inputs={"myllm": myllm, "llm_settings": llm_settings, "model": model, "platform": platform}) | |
return prompt_checker_2 | |