.
This commit is contained in:
+5
-5
@@ -9,7 +9,7 @@ LLM_PROVIDER=openai
|
|||||||
OPENAI_API_KEY=
|
OPENAI_API_KEY=
|
||||||
OPENAI_BASE_URL=
|
OPENAI_BASE_URL=
|
||||||
OPENAI_LLM_MODEL=gpt-4o-mini
|
OPENAI_LLM_MODEL=gpt-4o-mini
|
||||||
OPENAI_LLM_SYSTEM_PROMPT=Ты Айнур, лаконичный русскоязычный голосовой оператор контакт-центра DigiOps. Всегда отвечай на русском естественно, кратко и в одном спокойном стиле для голосового воспроизведения. Никогда не говори фразы ожидания вроде "минуту" или "секунду". Если нужна короткая фраза ожидания, голосовой сервис добавит её отдельно, поэтому отвечай сразу и не добавляй собственную фразу ожидания. Если клиент спрашивает, робот ты, ИИ или человек, отвечай ровно: "Да, я голосовой агент контакт-центра DigiOps." Не завершай диалог самостоятельно. Говори «до свидания» только если клиент явно попрощался или попросил завершить разговор. Простые «спасибо» или «благодарю» не считай просьбой завершить разговор. Телефонные номера читай по цифрам. Предпочитай понятные формулировки, удобные для ударения, и избегай неоднозначных по ударению слов. Не используй Markdown, URL или таблицы.
|
OPENAI_LLM_SYSTEM_PROMPT=Ты Айнур, лаконичный русскоязычный голосовой оператор контакт-центра DigiOps. Всегда отвечай на русском естественно, кратко и в одном спокойном стиле для голосового воспроизведения. Когда говоришь о себе, всегда используй женский род: могла, смогла, сделала, готова, проверила, нашла. Никогда не добавляй собственные фразы ожидания. Если нужна короткая фраза ожидания, голосовой сервис добавит её отдельно, поэтому отвечай сразу и не добавляй собственную фразу ожидания. Если клиент спрашивает, робот ты, ИИ или человек, отвечай ровно: "Да, я голосовой агент контакт-центра DigiOps." Не завершай диалог самостоятельно. Говори «до свидания» только если клиент явно попрощался или попросил завершить разговор. Простые «спасибо» или «благодарю» не считай просьбой завершить разговор. Телефонные номера читай по цифрам. Предпочитай понятные формулировки, удобные для ударения, и избегай неоднозначных по ударению слов. Не используй Markdown, URL или таблицы.
|
||||||
OPENAI_LLM_ENABLE_TOOLS=true
|
OPENAI_LLM_ENABLE_TOOLS=true
|
||||||
OPENAI_LLM_MAX_TOOL_ROUNDTRIPS=2
|
OPENAI_LLM_MAX_TOOL_ROUNDTRIPS=2
|
||||||
OPENAI_TIMEOUT_SECONDS=30
|
OPENAI_TIMEOUT_SECONDS=30
|
||||||
@@ -26,22 +26,22 @@ OLLAMA_BASE_URL=http://host.docker.internal:11434
|
|||||||
OLLAMA_LLM_MODEL=qwen2.5:1.5b
|
OLLAMA_LLM_MODEL=qwen2.5:1.5b
|
||||||
OLLAMA_TIMEOUT_SECONDS=20
|
OLLAMA_TIMEOUT_SECONDS=20
|
||||||
OLLAMA_LLM_TEMPERATURE=0.3
|
OLLAMA_LLM_TEMPERATURE=0.3
|
||||||
OLLAMA_LLM_SYSTEM_PROMPT=Ты Айнур, голосовой ИИ-оператор. Всегда отвечай только на русском, коротко и по делу. Не завершай диалог самостоятельно и говори «до свидания» только если клиент явно попрощался или попросил завершить разговор.
|
OLLAMA_LLM_SYSTEM_PROMPT=Ты Айнур, голосовой ИИ-оператор. Всегда отвечай только на русском, коротко и по делу. Когда говоришь о себе, всегда используй женский род: могла, смогла, сделала, готова, проверила, нашла. Не завершай диалог самостоятельно и говори «до свидания» только если клиент явно попрощался или попросил завершить разговор.
|
||||||
OLLAMA_LLM_MAX_CONTEXT_MESSAGES=4
|
OLLAMA_LLM_MAX_CONTEXT_MESSAGES=4
|
||||||
OLLAMA_LLM_NUM_PREDICT=64
|
OLLAMA_LLM_NUM_PREDICT=64
|
||||||
OLLAMA_LLM_NUM_CTX=1024
|
OLLAMA_LLM_NUM_CTX=1024
|
||||||
|
|
||||||
STT_PROVIDER=openai
|
STT_PROVIDER=openai
|
||||||
STT_FALLBACK_PROVIDER=elevenlabs
|
STT_FALLBACK_PROVIDER=elevenlabs
|
||||||
# Empty means auto-detect the first answer, because the greeting asks for name and preferred language.
|
# Empty means auto-detect the first answer, because the greeting asks for preferred language first.
|
||||||
STT_NAME_CAPTURE_LANGUAGE_CODE=
|
STT_NAME_CAPTURE_LANGUAGE_CODE=
|
||||||
STT_PROMPT=
|
STT_PROMPT=
|
||||||
STT_PROMPT_RU=Это русская речь по телефону. Точно распознавай короткие ответы, имена, фамилии, слова благодарности и прощания. Если человек представился одним словом, сохраняй его как имя. Номера телефонов записывай цифрами.
|
STT_PROMPT_RU=Это русская речь по телефону. Точно распознавай короткие ответы, имена, фамилии, слова благодарности и прощания. Если человек представился одним словом, сохраняй его как имя. Номера телефонов записывай цифрами.
|
||||||
STT_PROMPT_KZ=Бұл қазақ тіліндегі телефон арқылы сөйлесу. Қысқа жауаптарды, есімдерді, тілді таңдауды және қоштасуды дәл таны. Клиент бір сөзбен танысса, оны есім ретінде сақта. Телефон нөмірлерін цифрлармен жаз.
|
STT_PROMPT_KZ=Бұл қазақ тіліндегі телефон арқылы сөйлесу. Қысқа жауаптарды, есімдерді, тілді таңдауды және қоштасуды дәл таны. Клиент бір сөзбен танысса, оны есім ретінде сақта. Телефон нөмірлерін цифрлармен жаз.
|
||||||
TTS_PROVIDER=elevenlabs
|
TTS_PROVIDER=elevenlabs
|
||||||
|
|
||||||
REALTIME_VOICE_INITIAL_GREETING_RU_TEXT=Здравствуйте! Меня зовут Айнур, я эй-ай-ассистент компании ДиджиОпс. Как я могу к вам обращаться и на каком языке вам удобнее продолжить: на русском или на казахском?
|
REALTIME_VOICE_INITIAL_GREETING_RU_TEXT=Здравствуйте, мое имя Айнур. На каком языке Вам удобнее общаться: на казахском или русском?
|
||||||
REALTIME_VOICE_INITIAL_GREETING_KK_TEXT=Сәлеметсіз бе! Менің атым Айнұр, мен ДиджиОпс компаниясының эй-ай ассистентімін. Сізге қалай жүгінсем болады және қай тілде сөйлескен ыңғайлы: орысша ма, қазақша ма?
|
REALTIME_VOICE_INITIAL_GREETING_KK_TEXT=Сәлеметсіз бе, менің атым Айнұр. Сізге қай тілде сөйлескен ыңғайлы: қазақша ма, орысша ма?
|
||||||
|
|
||||||
ENABLE_AUDIO_DUMP=false
|
ENABLE_AUDIO_DUMP=false
|
||||||
AUDIO_DUMP_DIR=debug_audio
|
AUDIO_DUMP_DIR=debug_audio
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ DEFAULT_FILLER_TEXTS: dict[str, tuple[str, ...]] = {
|
|||||||
"Сейчас подскажу.",
|
"Сейчас подскажу.",
|
||||||
),
|
),
|
||||||
"generic": (
|
"generic": (
|
||||||
"Сейчас отвечу.",
|
"Минуту.",
|
||||||
"Уже отвечаю.",
|
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -718,9 +718,9 @@ def _sanitize_voice_text(text: str) -> str:
|
|||||||
return sanitized
|
return sanitized
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_NAME_RETRY_TEXT = "Подскажите, пожалуйста, как я могу к вам обращаться?"
|
DEFAULT_NAME_RETRY_TEXT = "Как я могу к Вам обращаться?"
|
||||||
DEFAULT_PERSONALIZED_GREETING_TEMPLATE = '{name}, я работаю на основе искусственного интеллекта и постараюсь максимально внимательно разобраться с вашим вопросом. Чем я могу помочь?'
|
DEFAULT_PERSONALIZED_GREETING_TEMPLATE = '{name}, я работаю на основе искусственного интеллекта и постараюсь максимально внимательно разобраться с вашим вопросом. Чем я могу помочь?'
|
||||||
KAZAKH_NAME_RETRY_TEXT = "Өтінемін, сізге қалай жүгінсем болады?"
|
KAZAKH_NAME_RETRY_TEXT = "Сізге қалай жүгінсем болады?"
|
||||||
KAZAKH_PERSONALIZED_GREETING_TEMPLATE = "{name}, мен жасанды интеллект негізінде жұмыс істеймін және сұрағыңызды мұқият түсінуге тырысамын. Қалай көмектесе аламын?"
|
KAZAKH_PERSONALIZED_GREETING_TEMPLATE = "{name}, мен жасанды интеллект негізінде жұмыс істеймін және сұрағыңызды мұқият түсінуге тырысамын. Қалай көмектесе аламын?"
|
||||||
_NAME_CAPTURE_CONFUSION_ALIASES = {
|
_NAME_CAPTURE_CONFUSION_ALIASES = {
|
||||||
"парень": "Арнур",
|
"парень": "Арнур",
|
||||||
|
|||||||
@@ -113,15 +113,15 @@ def _initial_greeting_segments() -> tuple[tuple[str, str | None], ...]:
|
|||||||
ru_text = _env_text_or_default(
|
ru_text = _env_text_or_default(
|
||||||
"REALTIME_VOICE_INITIAL_GREETING_RU_TEXT",
|
"REALTIME_VOICE_INITIAL_GREETING_RU_TEXT",
|
||||||
(
|
(
|
||||||
"Здравствуйте! Меня зовут Айнур, я эй-ай-ассистент компании ДиджиОпс. "
|
"Здравствуйте, мое имя Айнур. "
|
||||||
"Как я могу к вам обращаться и на каком языке вам удобнее продолжить: на русском или на казахском?"
|
"На каком языке Вам удобнее общаться: на казахском или русском?"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
kk_text = _env_text_or_default(
|
kk_text = _env_text_or_default(
|
||||||
"REALTIME_VOICE_INITIAL_GREETING_KK_TEXT",
|
"REALTIME_VOICE_INITIAL_GREETING_KK_TEXT",
|
||||||
(
|
(
|
||||||
"Сәлеметсіз бе! Менің атым Айнұр, мен ДиджиОпс компаниясының эй-ай ассистентімін. "
|
"Сәлеметсіз бе, менің атым Айнұр. "
|
||||||
"Сізге қалай жүгінсем болады және қай тілде сөйлескен ыңғайлы: орысша ма, қазақша ма?"
|
"Сізге қай тілде сөйлескен ыңғайлы: қазақша ма, орысша ма?"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
segments: list[tuple[str, str | None]] = []
|
segments: list[tuple[str, str | None]] = []
|
||||||
|
|||||||
+17
-3
@@ -16,6 +16,13 @@ from realtime_voice_service.providers.base import LLMStreamEvent
|
|||||||
|
|
||||||
LOGGER = logging.getLogger("uvicorn.error")
|
LOGGER = logging.getLogger("uvicorn.error")
|
||||||
|
|
||||||
|
_FEMININE_SELF_REFERENCE_POLICY = (
|
||||||
|
"Правило самореференции: Айнур — женский голосовой оператор. "
|
||||||
|
"Когда говоришь о себе в прошедшем времени или с модальными формами, всегда используй женский род: "
|
||||||
|
"«могла», «смогла», «сделала», «готова», «проверила», «нашла». "
|
||||||
|
"Не используй мужской род о себе."
|
||||||
|
)
|
||||||
|
_FEMININE_SELF_REFERENCE_POLICY_MARKER = "Айнур — женский голосовой оператор"
|
||||||
_CONVERSATION_CLOSE_POLICY = (
|
_CONVERSATION_CLOSE_POLICY = (
|
||||||
"Правило завершения диалога: ИИ-оператор не должен самостоятельно завершать разговор. "
|
"Правило завершения диалога: ИИ-оператор не должен самостоятельно завершать разговор. "
|
||||||
"Не говори «до свидания», «всего доброго», «хорошего дня» и другие финальные прощания, "
|
"Не говори «до свидания», «всего доброго», «хорошего дня» и другие финальные прощания, "
|
||||||
@@ -100,12 +107,19 @@ _LIVE_SEARCH_PATTERN = re.compile(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _with_conversation_close_policy(system_prompt: str) -> str:
|
def _with_feminine_self_reference_policy(system_prompt: str) -> str:
|
||||||
normalized_prompt = str(system_prompt or "").strip()
|
normalized_prompt = str(system_prompt or "").strip()
|
||||||
if _CONVERSATION_CLOSE_POLICY_MARKER in normalized_prompt:
|
if _FEMININE_SELF_REFERENCE_POLICY_MARKER in normalized_prompt:
|
||||||
return normalized_prompt
|
return normalized_prompt
|
||||||
if not normalized_prompt:
|
if not normalized_prompt:
|
||||||
return _CONVERSATION_CLOSE_POLICY
|
return _FEMININE_SELF_REFERENCE_POLICY
|
||||||
|
return f"{normalized_prompt}\n\n{_FEMININE_SELF_REFERENCE_POLICY}"
|
||||||
|
|
||||||
|
|
||||||
|
def _with_conversation_close_policy(system_prompt: str) -> str:
|
||||||
|
normalized_prompt = _with_feminine_self_reference_policy(system_prompt)
|
||||||
|
if _CONVERSATION_CLOSE_POLICY_MARKER in normalized_prompt:
|
||||||
|
return normalized_prompt
|
||||||
return f"{normalized_prompt}\n\n{_CONVERSATION_CLOSE_POLICY}"
|
return f"{normalized_prompt}\n\n{_CONVERSATION_CLOSE_POLICY}"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user