64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
class LLMInstructions:
|
||
"""
|
||
Helper class to construct the system instructions for the LLM.
|
||
|
||
It combines the base persona (Pepper robot) with dynamic norms and goals
|
||
provided by the BDI system.
|
||
|
||
If no norms/goals are given it assumes empty lists.
|
||
|
||
:ivar norms: A list of behavioral norms.
|
||
:ivar goals: A list of specific conversational goals.
|
||
"""
|
||
|
||
@staticmethod
|
||
def default_norms() -> list[str]:
|
||
return [
|
||
"Be friendly and respectful.",
|
||
"Make the conversation feel natural and engaging.",
|
||
]
|
||
|
||
@staticmethod
|
||
def default_goals() -> list[str]:
|
||
return [
|
||
"Try to learn the user's name during conversation.",
|
||
]
|
||
|
||
def __init__(self, norms: list[str] | None = None, goals: list[str] | None = None):
|
||
self.norms = norms or self.default_norms()
|
||
self.goals = goals or self.default_goals()
|
||
|
||
def build_developer_instruction(self) -> str:
|
||
"""
|
||
Builds the final system prompt string.
|
||
|
||
The prompt includes:
|
||
1. Persona definition.
|
||
2. Constraint on response length.
|
||
3. Instructions on how to handle goals (reach them in order, but prioritize natural flow).
|
||
4. The specific list of norms.
|
||
5. The specific list of goals.
|
||
|
||
:return: The formatted system prompt string.
|
||
"""
|
||
sections = [
|
||
"You are a Pepper robot engaging in natural human conversation.",
|
||
"Keep responses between 1–3 sentences, unless told otherwise.\n",
|
||
"You're given goals to reach. Reach them in order, but make the conversation feel "
|
||
"natural. Some turns you should not try to achieve your goals.\n",
|
||
]
|
||
|
||
if self.norms:
|
||
sections.append("Norms to follow:")
|
||
for norm in self.norms:
|
||
sections.append("- " + norm)
|
||
sections.append("")
|
||
|
||
if self.goals:
|
||
sections.append("Goals to reach:")
|
||
for goal in self.goals:
|
||
sections.append("- " + goal)
|
||
sections.append("")
|
||
|
||
return "\n".join(sections).strip()
|