2024-10-15 PitchPatterns Robo Caller Task

 

Telefonijas piekļuves

https://www.teltel.io/v2/login email: evald@asya.ai pass: jh1K0xU8C8KW

SIP device var atrast šeit: https://www.teltel.io/account/call_flow Dokumentācija: https://doc.teltel.io/en/integration-guide https://apidoc.teltel.io (ir arī REST API, bet cik man zināms ne priekš zvanīšanas)

 

TODO:

  1. Kodēt iekš https://github.com/asya-ai/pp-robocaller

  2. Fonā nepieciešams apmācīt TTS modeli V2, bet pagaidām var izmantot “Model V1”

  3. Izveidot Python Flask app, kura strādā ar:

    1. PostgreSQL datu bāzi (dev vide zemāk)

      1. PostgreSQL DB h: 62.122.20.14 d: robocall u: robocall p: Lle0tPbs90tkv5RNbUib

    2. STT websocket based realtime (Mārcis iedos API key) https://stt.asya.ai/docs Kods ir šeit: https://github.com/asya-ai/asya-master-api (pievienoju tevi). Man liekas kaut kas nav pareizi sakodēts ar websocket sessijām, jo 2 lietotāji vienlaicīgi izmanto, tad sāk miksēties responses. Ja nepieciešams nokomentē Mārcim kādas izmaiņas tur jāpalīdz veikt

    3. TTS websocket based realtime (pats izveido API key)

      https://ttsapi.asya.ai

    4. Tulkošanas API (Mārcis iedos key), tur ari ir websocket

      https://api.gramatins.lv

    5. Izvietota uz ventspils-1 servera zem lietotāja robocaller

      1. h: 62.122.20.14 u: robocall

    6. Vēlāk būs arī eldigen integrācija uz generic question answering

    7. DNS image-20241016161957448

  4. Servisi paceļās katru reizi ar /home/robocall/_startup.sh iekš linux lietotāja robocall

  5. Dummy serviss uz porta 7771 ir palaists screen -rd robodev.pitchpatterns.com

  6. Python environment atrodas micromamba activate robocall

  7. https://robodev.pitchpatterns.com

  8. Nepieciešams veikt integrācijas ar teltel SIP vai RTP

  9. Priekš UX izmantot Bootrstrap Flask https://bootstrap-flask.readthedocs.io/en/stable/basic/

  10. Nepieciešams izveidot UX, kurā var ģenerēt sarunas skriptu soli pa solim, datu struktūras (prefix visam robo_, jo vēlāk pievienosim PP repo iespējams) Visām datu bāzes tabulām pretī dataclasses

    1. robo_organization - organizācija

      1. robo_organization_id

      2. robo_organization_uuid - nekad lietotājam nerādam ID, bet rādam UUID

      3. robo_organization_name

      4. is_deleted (vienmēr soft delete)

      5. created

      6. modified

    2. robo_user - lietotājs, vienā organizācijā daudzi

      1. robo_user_id

      2. robo_user_uuid

      3. robo_organization_id

      4. email

      5. password

      6. limit_minutes

      7. is_deleted

      8. created

      9. modified

    3. robo_intent - nodoms, kuru atpazīst pēc frāzēm embeddings vai regex

      1. robo_intent_id

      2. robo_intent_uuid

      3. robo_organization_id

      4. intent_name

      5. intent_language: varchar

      6. is_deleted (vienmēr soft delete)

      7. created

      8. modified

    4. robo_intent_phrases - katram nodomam daudz frāzes (ievad ērtībai ar textarea jaunās rindās). Var būt gan embeddings, gan regex kopā kā vairāki phrases

      1. robo_intent_phrase_id

      2. robo_intent_phrase_uuid

      3. robo_organization_id

      4. robo_intent_id

      5. intent_language: varchar

      6. phrase_text (reg frāzes var atpazīt vai piemērus pēc sentence embeddings) - šeit neizmantojam īstu regex, bet vnk “*” nozīmē jebkādas vārda beigas vai sākums, atstarpes atdala secīgus vārdus frāzē. Case insensitve

      7. phrase_type: VARCHAR - REGEX, EMBEDDING

      8. phrase_text_en: Ja nav zvaigznītes - Embedings vienmēr taisam no English

      9. phrase_embedding_en: PGVector format (dabūt no betijas info kādu embedding izmantot piemērus no eldigen koda ) - šis ir tikai tām frāzēm, kuras nesatur “*” zvaigznītes

      10. created (vienmēr hard delete)

    5. robo_extracts - dati, kurus ar dažādu vaicājumu palīdzību var izgūt no konkrēta message sarunas laikā

      1. robo_extract_id

      2. robo_extract_uuid

      3. robo_organization_id

      4. extract_field_name

      5. is_deleted (vienmēr soft delete)

      6. created

      7. modified

    6. robo_extract_prompt (sākotnēji šim jānotiek asinhroni, nedrīkst bremzēt sarunas - var būt tikai atzaros!) - vaicājums ar kuru izgūst datus, izmantojot LLM (pagaidām openai API, velāk mūsu)

      1. robo_extract_prompt_id

      2. robo_extract_prompt_uuid

      3. robo_organization_id

      4. robo_extract_field_id - uz kurieni nonāks izgūtais saturs (tabulās)

      5. extract_language: varchar

      6. extract_prompt: TEXT - Jautājums ar kuru var dabūt ārā no iepriekšējā message informāciju un saglabāt kā field “Kad tiks veikts nākamais maksājums? Diena vai datums, ja nosaukts?”

      7. extact_prompt_en

      8. created (vienmēr hard delete)

    7. robo_responses - STT ģenerētās atbildes, vēlāk būs ar tokens, tagad ierakstītas, vienīgais varētu ar LLM uzģenerēt vairākus rephrase variantus, lai zvana saņēmējs nevar uzreiz atpazīt robotu. Responses kā audio faili ir jau cached uz diska

      1. robo_response_id

      2. robo_response_uuid

      3. robo_organization_id

      4. is_rephrase_enabled

      5. response_voice (no robo_script copy)

      6. response_language

      7. response_text: Tas ko robots saka. Vēlāk varēs arī izmantot tokens kā {full_name} un tos, kuri iegūti no extract vai integrations

      8. is_deleted (vienmēr soft delete)

      9. created

      10. modified

    8. robo_script - galvenais skripts, kurš izpildās

      1. robo_script_id

      2. robo_script_uuid

      3. robo_organization_id

      4. script_name

      5. script_type: INBOUND, OUTBOUND (pašlaik bus tikai OUTBOUND)

      6. script_voice_name (vēlāk maināms)

      7. script_sip_device (SIP ID)

      8. is_enabled

      9. is_deleted (vienmēr soft delete)

      10. created

      11. modified

    9. robo_script_steps - skripta soļi, kuri veido koku UX

      1. robo_script_step_id

      2. robo_script_step_uuid

      3. robo_script_id

      4. robo_organization_id

      5. step_type: VARCHAR - CLIENT_RESPINSE, AGENT_RESPONSE, INTENT, CONDITION, EXTRACT, END_CALL - Kā python Enum, Str

      6. robo_response_id - optional / NULL

      7. robo_extract_id - optional

      8. robo_intent_id - optional

      9. condition_is_true: bool / optional / NULL

      10. created (vienmēr hard delete)

    10. robo_script_steps_tree - jāvar uztaisīt koku, kur zari apvienojas uz priekšu ejot

      1. robo_script_steps_tree_id

      2. robo_script_step_id

      3. next_robo_script_step_id

      4. created

    11. robo_call_campaigns (grupa ar telefoniem, kuriem zvanīs robts) - Zvanu saraksts un zvanīšanas plāna nosacījumi ar kuriem zvana numuriem

      1. robo_call_campaign_id

      2. robo_call_campaign_uuid

      3. robo_batch_name

      4. robo_organization_id

      5. robo_script_id : kāds script ir pieslēgts

      6. is_deleted (vienmēr soft delete)

      7. time_from_hours_gmt : optional (padomā varbūt šos shcedules var grudrāk sataisīt)

      8. time_to_hours_gmt : optional

      9. scheduled_date_from : optional

      10. scheduled_date_to : optional

      11. is_scheduled_monday: bool

      12. is_scheduled_tuesday: bool

      13. is_scheduled_wednesday: bool

      14. is_scheduled_thursday: bool

      15. is_scheduled_friday: bool

      16. is_scheduled_saturday: bool

      17. is_scheduled_sunday: bool

      18. is_deleted (vienmēr soft delete)

      19. created

      20. modified

    12. robo_call_numbers - numuri, kurus caur UX ielādē ar CSV vai manuāli

      1. robo_call_number_id

      2. robo_call_number_uuid

      3. robo_call_campaign_id

      4. robo_organization_id

      5. phone_number: varchar

      6. full_name: varchar (optional)

      7. language: varchar

      8. last_call_timestamp :NULL

      9. number_of_times_called

      10. number_of_times_picked

      11. is_deleted (vienmēr soft delete)

      12. created

      13. modified

    13. robo_recording - notikušais zvans ar audio un meta dadiem

      1. robo_recording_id

      2. robo_recording_uuid - pēc UUID saglabājam audio failu

      3. robo_organization_id

    14. robo_recording_steps (robot or client) - koka zari, kuri tika izpildīti un to rezultāti

      1. robo_recording_step_id

      2. robo_recording_step_uuid

      3. robo_organization_id

      4. robo_batch_call_id - 🟡 Labāk likt vairāk IDs nekā mazāk, jo vieglāk un efektīvaķi būs SELECTs

      5. robo_batch_calls_number_id

      6. robo_script_step_id

      7. step_type: VARCHAR - CLIENT_RESPINSE, AGENT_RESPONSE, INTENT, CONDITION, EXTRACT, END_CALL

      8. robo_response_id - optional / NULL

      9. robo_extract_id - optional

      10. robo_intent_id - optional

      11. condition_is_true: bool / optional / NULL

      12. robo_recording_extract_id - ja notika extract

      13. robo_intent_evidence_rext: teksts, kas noteica intent

      14. is_last_step

      15. created - hard delete

    15. robo_recording_extracts - iegūtie dati no zvana - vēlak tie tiks novirzīti uz CRM, tagad var no batch iegūt CSV, kur katra rinda zvanītājs robo_batch_calls_numbers un kolonas robo_recording_extracts

      1. robo_recording_extract_id

      2. robo_recording_extract_uuid

      3. robo_recording_step_id

      4. robo_batch_calls_number_id

      5. robo_organization_id

      6. robo_extract_id

      7. robo_extract_value: text

      8. created - hard delete

Vēlāk vajadzēs ievākt arī statistiku pie kura atzara skriptā atbirst cilvēki

 

AI tools

To speed up implementation

  1. Try adding in comments pyhon code and generate Python code

  2. Try commanding selected code to be ported using http://cursor.com (if necessary we will buy pro version)

  3. perplexity.ai give example in Python how to ...


UX Mockups

1. Sarunu skripts

Sākumā būs tikai izejošie zvani, bet vēlāk varēs pievienot arī ienākošos zvanus.

Vairākām kampaņām var būt viens un tas pat skripts. Skriptu būvējam kā grafu, iespējams mermaidJS formātu var lietot vai ko citu. Vienā no iepriekšējiem projektiem esam jau lietojuši mermaidJS grafus UX - https://github.com/asya-ai/pitchpatterns-conversation-flow (pievienoju tevi). Bet var izmantot jebkādu UX bibliotēku, lai šādu vizualizāciju ātrāk uztaisītu.

Skriptam var norādīt atbalstītās aģenta un klienta valodas. Ja klients sarunas laikā nomaina valodu, tad aģents pielāgojas, ja šī valoda ir atbalstīta. Valodām ir prioritāte, kuras valodas skriptā ir svarīgākas. Vienmēr ir jābūt default valodai, kuru izmanto, ja nav atpazīta klienta valoda.

Sākotnēji būs tikai viena valoda, katrā skriptā, bet vēlāk varēs pievienot vairākas valodas, kurās skripts ir pieejams.

1.1. Skripta izveide - Nodoma definēšana un atpazīšana.

Lietotājs definē virsotnes grafā, kurās tiek atpazīts nodoms balstoties uz teksta paraugiem pēc tiešās un regex sakritības, bet arī pēc semantiskās sakritības ar text to embeddings. Svarīgi, ka visi intents kļūst par output vērtībām, kuras nonāk kampaņas kopejā rezultātu tabulā. Vēl svarīgi saglabāt visas darbības sarunas laikā, lai var šo skatu izmantot arī, lai ilustrētu kāda konkrēta zvana gaita notika. Vai arī ilustrētu vidējos rādītājus katrai kampaņai.

Uzbraucot uz virsotnēm, uz tām var uzklikšķināt un parādās menu "Pievienot apakš zaru" vai "Mainīt zaru", "Dzēst zaru"

Ja gadījumā LLM strādā pietiekami ātri varētu nākotnē ieviest arī Prompt based nodomus. image.png

1.2. Skripta izpilde - Aģenta runa

Teksts, kuru aģents saka. Var izmantot arī placeholders, kuri tiks aizpildīti ar extract datiem no zvana. Vēlāk varēs arī izmantot tokens kā {full_name} un tos, kuri iegūti no extract sarunas laikā vai no inputiem.

Svarīgi, ka visi audio tiek jau iepriekš uzģenerēti, lai nevajadzētu gaidīt uz atbildi no TTS servisa. Audio jāuzģenerē visās valodās, kuras ir atbalstītas konkrētajā skriptā. Ieskaitot arī rephrase variantus, lai zvana saņēmējs nevar uzreiz atpazīt robotu.

Aģenta runas virsotne būs pirmā (nākotnē varētu būt arī sekojošā, ienākošo zvanu gadījumā).

Pēc tam Runas virsotni var likt tikai pēc Nodomu virsotnēm, jo aģenta runa ir atkarīga no tā, kāds nodoms tika atpazīts.

image.png

1.3. . Skripta izpilde - Datu izgūšanas zars

Datu izgūšana notiek ar LLM palīdzību (jāparedz iespēja, ka tas varētu notikt arī post-processing, jo nevaram atļauties gaidīt, kamēr LLM atbild). Jāparedz arī iespēja, ka dati var tikt izgūti no vairākiem jautājumiem, jo daži dati var būt atkarīgi no iepriekšējiem jautājumiem.

image.png

2. Kampaņas

Kampaņas ir saraksts ar telefoniem, kuriem zvanīs robts. Kampaņām var būt dažādi laika plāni, kad zvanīt, bet arī atkarībā no tā, kāds ir zvana rezultāts, varētu būt iespēja zvanīt atpakaļ. Kampaņas izveides brīdī tā tiek sasaistīta ar konkrētu skriptu.

Līdz ar kampaņas sasisti ar skriptu, tad skripta koka struktūra tiek locked.

Skriptu neļaujam mainīt, kamēr ir aktīva kampaņa, bet var pievienot jaunu skriptu, ja ir nepieciešams. Vai duplicēt skriptu un veikt izmaiņas kopijā.

Kampaņas ievade būs Excel un izvade arī būs Excel. Fonā jāsaglabā visi ieraksti, tos mēs vēlāk sūtīsim uz pitchpatterns.

image.png