m97j's picture
Initial commit
5fc69e4
raw
history blame
5.46 kB
from typing import Dict, Any
def build_main_prompt(pre: Dict[str, Any], session_id: str, npc_id: str) -> str:
tags = pre.get("tags", {})
ps = pre.get("player_state", {})
rag_docs = pre.get("rag_main_docs", [])
# RAG ๋ฌธ์„œ ๋ถ„๋ฆฌ
lore_text = ""
desc_text = ""
for doc in rag_docs:
if "LORE:" in doc:
lore_text += doc + "\n"
elif "DESCRIPTION:" in doc:
desc_text += doc + "\n"
else:
# fallback: type ๊ธฐ๋ฐ˜ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ
if "lore" in doc.lower():
lore_text += doc + "\n"
elif "description" in doc.lower():
desc_text += doc + "\n"
prompt = [
"<SYS>",
f"NPC_ID={tags.get('npc_id','')}",
f"NPC_LOCATION={tags.get('location','')}",
"TAGS:",
f" quest_stage={tags.get('quest_stage','')}",
f" relationship={tags.get('relationship','')}",
f" trust={tags.get('trust','')}",
f" npc_mood={tags.get('npc_mood','')}",
f" player_reputation={tags.get('player_reputation','')}",
f" style={tags.get('style','')}",
"</SYS>",
"<RAG>",
f"LORE: {lore_text.strip() or '(์—†์Œ)'}",
f"DESCRIPTION: {desc_text.strip() or '(์—†์Œ)'}",
"</RAG>",
"<PLAYER_STATE>"
]
if ps.get("items"):
prompt.append(f"items={','.join(ps['items'])}")
if ps.get("actions"):
prompt.append(f"actions={','.join(ps['actions'])}")
if ps.get("position"):
prompt.append(f"position={ps['position']}")
prompt.append("</PLAYER_STATE>")
prompt.append("<CTX>")
for h in pre.get("context", []):
prompt.append(f"{h['role']}: {h['text']}")
prompt.append("</CTX>")
prompt.append(f"<PLAYER>{pre.get('player_utterance','').rstrip()}")
prompt.append("<STATE>")
prompt.append("<NPC>")
return "\n".join(prompt)
def build_fallback_prompt(pre: Dict[str, Any], session_id: str, npc_id: str) -> str:
"""
additional_trigger ๊ฐ’์— ๋”ฐ๋ผ ์ผ๋ฐ˜ fallback / ํŠน์ˆ˜ fallback ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ•œ ํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌ
"""
tags = pre.get("tags", {})
ps = pre.get("player_state", {})
gs = pre.get("game_state", {})
rag_text = "\n".join(f"- {doc}" for doc in pre.get("rag_fallback_docs", []))
fb_style = pre.get("fallback_style") or {}
trigger_meta = pre.get("trigger_meta", {}) or {}
items = ",".join(ps.get("items", []))
actions = ",".join(ps.get("actions", []))
location = gs.get("location") or ps.get("location", "unknown")
quest_stage = gs.get("quest_stage", "unknown")
# ๊ธฐ๋ณธ ์•ˆ๋‚ด๋ฌธ
instr = (
"๋‹น์‹ ์€ NPC persona๋ฅผ ๊ฐ€์ง„ ์บ๋ฆญํ„ฐ์ž…๋‹ˆ๋‹ค. "
"ํ”Œ๋ ˆ์ด์–ด ๋ฐœํ™”์— ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๋งฅ๋ฝ์— ๋งž๋Š” ๋Œ€์‚ฌ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. "
"์Šคํ† ๋ฆฌ ์ง„ํ–‰ ์กฐ๊ฑด์€ ์ถฉ์กฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
)
# additional_trigger=True โ†’ ํŠน์ˆ˜ fallback
if pre.get("additional_trigger"):
# trigger_meta ๊ธฐ๋ฐ˜ ๊ตฌ์ฒดํ™”
s = fb_style.get("style") or trigger_meta.get("npc_style")
a = fb_style.get("npc_action") or trigger_meta.get("npc_action")
e = fb_style.get("npc_emotion") or trigger_meta.get("npc_emotion")
more = []
if s: more.append(f"๋Œ€ํ™” ์Šคํƒ€์ผ={s}")
if a: more.append(f"NPC ํ–‰๋™={a}")
if e: more.append(f"NPC ๊ฐ์ •={e}")
if more:
instr += " " + "; ".join(more) + "."
# ํŠน์ˆ˜ fallback์ž„์„ ๋ช…์‹œ
instr += " ์ด ๋ฐ˜์‘์€ ํ”Œ๋ ˆ์ด์–ด์˜ ํŠน์ • ๋ฐœํ™”(๊ธˆ์ง€ ํŠธ๋ฆฌ๊ฑฐ)์— ์˜ํ•ด ์œ ๋ฐœ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค."
return f"""
<FALLBACK>
NPC_ID={npc_id}
SESSION_ID={session_id}
LOCATION={location}
QUEST_STAGE={quest_stage}
MOOD={tags.get("npc_mood","neutral")}
STYLE={tags.get("style","neutral")}
ITEMS={items}
ACTIONS={actions}
EMOTION_SUMMARY={', '.join([f"{k}:{round(v,2)}" for k,v in pre.get('emotion',{}).items()])}
INPUT="{pre['player_utterance']}"
RAG_CONTEXT:
{rag_text or "(none)"}
INSTRUCTION:
{instr}
</FALLBACK>
""".strip()
'''
def build_fallback_prompt(pre: dict, session_id: str, npc_id: str) -> str:
tags = pre.get("tags", {})
ps = pre.get("player_state", {})
gs = pre.get("game_state", {})
rag_text = "\n".join(f"- {doc}" for doc in pre.get("rag_fallback_docs", []))
fb = pre.get("fallback_style") or {}
items = ",".join(ps.get("items", []))
actions = ",".join(ps.get("actions", []))
location = gs.get("location") or ps.get("location", "unknown")
quest_stage = gs.get("quest_stage", "unknown")
instr = "์กฐ๊ฑด ๋ถˆ์ถฉ์กฑ. ์Šคํ† ๋ฆฌ ์ง„ํ–‰์€ ํ•˜์ง€ ์•Š๊ณ , ์บ๋ฆญํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‘๋‹ตํ•˜๋ผ."
if fb:
# ์„ ํƒ์  ๊ตฌ์ฒดํ™”
s = fb.get("style"); a = fb.get("npc_action"); e = fb.get("npc_emotion")
more = []
if s: more.append(f"๋Œ€ํ™” ์Šคํƒ€์ผ={s}")
if a: more.append(f"NPC ํ–‰๋™={a}")
if e: more.append(f"NPC ๊ฐ์ •={e}")
if more:
instr += " " + "; ".join(more) + "."
return f"""
<FALLBACK>
NPC_ID={npc_id}
SESSION_ID={session_id}
LOCATION={location}
QUEST_STAGE={quest_stage}
MOOD={tags.get("npc_mood","neutral")}
STYLE={tags.get("style","neutral")}
ITEMS={items}
ACTIONS={actions}
EMOTION_SUMMARY={', '.join([f"{k}:{round(v,2)}" for k,v in pre.get('emotion',{}).items()])}
INPUT="{pre['player_utterance']}"
RAG:
{rag_text or "(none)"}
INSTRUCTION:
{instr}
</FALLBACK>
""".strip()
'''