ЁЯдЦ Graph RAG, ADK, рдФрд░ Memory Bank рдХреА рдорджрдж рд╕реЗ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛

1. рдкрд░рд┐рдЪрдп

рдХрд╡рд░

1. рдЪреБрдиреМрддреА

рдЖрдкрджрд╛ рдХреЗ рдмрд╛рдж рд░рд╛рд╣рдд рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдореМрдЬреВрдж рдкреАрдбрд╝рд┐рддреЛрдВ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдФрд░ рдЙрдирдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдЗрд╕ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдПрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдЗрд╕рдореЗрдВ рдЗрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. ЁЯЧДя╕П рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ (Spanner): рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рдХреМрд╢рд▓, рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реЗрд╡ рдХрд░рдирд╛
  2. ЁЯФН рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ: рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рдФрд░ рдХреАрд╡рд░реНрдб рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ
  3. ЁЯУ╕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ: рдЗрдореЗрдЬ, рдЯреЗрдХреНрд╕реНрдЯ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛
  4. ЁЯдЦ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди: рдореБрд╢реНрдХрд┐рд▓ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП, рдЦрд╛рд╕ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рдирд╛
  5. ЁЯза рд▓реЙрдиреНрдЧ-рдЯрд░реНрдо рдореЗрдореЛрд░реА: Vertex AI Memory Bank рдХреА рдорджрдж рд╕реЗ, рд▓реЛрдЧреЛрдВ рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдирд╛

рдмрд╛рддрдЪреАрдд

2. рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ

рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕, рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • ЁЯЧ║я╕П рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ 3D рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдлрд╝ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
  • ЁЯФН рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ рд╕рд░реНрдЪ (рдХреАрд╡рд░реНрдб, рд╕рд┐рдореИрдВрдЯрд┐рдХ, рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб)
  • ЁЯУ╕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛)
  • ЁЯдЦ рдореБрд╢реНрдХрд┐рд▓ рдЯрд╛рд╕реНрдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо
  • ЁЯза рдореЗрдореЛрд░реА рдмреИрдВрдХ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд░реЗрдВ

3. рдореБрдЦреНрдп рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА

рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ

рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА

рдордХрд╕рдж

рдбреЗрдЯрд╛рдмреЗрд╕

Cloud Spanner Graph

рдиреЛрдб (рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рд╕реНрдХрд┐рд▓) рдФрд░ рдПрдЬ (рд░рд┐рд╢реНрддреЗ) рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ

рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

Gemini + Embeddings

рд╕рд┐рдореИрдВрдЯрд┐рдХ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ + рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреА рдЦреЛрдЬ

рдПрдЬреЗрдВрдЯ рдлрд╝реНрд░реЗрдорд╡рд░реНрдХ

ADK (рдПрдЬреЗрдВрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ)

рдПрдЖрдИ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛

рдореЗрдореЛрд░реА

Vertex AI Memory Bank

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЗрд╡ рдХрд░рдирд╛

Frontend

React + Three.js

рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ 3D рдЧреНрд░рд╛рдлрд╝ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди

2. рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рддреИрдпрд╛рд░ рдХрд░рдирд╛ (рдЕрдЧрд░ рдЖрдкрдиреЗ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВ)

рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддрд╛ рдЪрд╛рд▓реВ рдХрд░рдирд╛

  • рдкрд╛рдВрдЪ рдбреЙрд▓рд░ рдХреЗ рдХреНрд░реЗрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддреЗ рдкрд░ рджрд╛рд╡рд╛ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкрдбрд╝реЗрдЧреА. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ gmail рдЦрд╛рддреЗ рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд┐рдпрд╛ рд╣реЛ.

рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдУрдкрди рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ

  1. ЁЯСЙ рд╕реАрдзреЗ Cloud Shell Editor рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  2. ЁЯСЙ рдЕрдЧрд░ рдЖрдЬ рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. Cloud Shell рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  3. ЁЯСЙ рдЕрдЧрд░ рдЯрд░реНрдорд┐рдирд▓ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ:
    • рджреЗрдЦреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
    • рдЯрд░реНрдорд┐рдирд▓Cloud Shell Editor рдореЗрдВ рдирдпрд╛ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  4. ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд▓реА рд╣реИ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
    gcloud auth list
    
  5. ЁЯСЙЁЯТ╗ GitHub рд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдХреНрд▓реЛрди рдмрдирд╛рдПрдВ:
    git clone https://github.com/google-americas/way-back-home.git
    

3. рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛

1. рд╢реБрд░реВ рдХрд░реЗрдВ

рдЕрдЧрд░ Cloud Shell Editor рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдЯрд░реНрдорд┐рдирд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ:

  • рджреЗрдЦреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  • рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

Cloud Shell Editor рдореЗрдВ рдирдпрд╛ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, init рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЪрд▓рд╛рдПрдВ:

cd ~/way-back-home/level_2
./init.sh

2. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░реЗрдВ:

gcloud config set project $(cat ~/project_id.txt) --quiet

ЁЯСЙЁЯТ╗ рдЬрд╝рд░реВрд░реА рдПрдкреАрдЖрдИ рдЪрд╛рд▓реВ рдХрд░реЗрдВ. рдЗрд╕рдореЗрдВ рдХрд░реАрдм рджреЛ рд╕реЗ рддреАрди рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ:

gcloud services enable compute.googleapis.com \
                       aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       spanner.googleapis.com \
                       storage.googleapis.com

3. рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛

ЁЯСЙЁЯТ╗ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

cd ~/way-back-home/level_2
./setup.sh

рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП .env рдмрди рдЬрд╛рдПрдЧрд╛. рдЕрдкрдиреЗ Cloud Shell рдореЗрдВ, way_back_homeproject рдЦреЛрд▓реЗрдВ. level_2 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдЖрдкрдХреЛ .env рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦреЗрдЧреА. рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП View -> Toggle Hidden File рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. open_project

4. рд╕реИрдВрдкрд▓ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ

ЁЯСЙЁЯТ╗ рдмреИрдХрдПрдВрдб рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:

cd ~/way-back-home/level_2/backend
uv sync

ЁЯСЙЁЯТ╗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХрд╛ рд╢реБрд░реБрдЖрддреА рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ:

uv run python ~/way-back-home/level_2/backend/setup_data.py

рдЗрд╕рд╕реЗ рдпреЗ рдЬрдирд░реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ:

  • Spanner рдЗрдВрд╕реНрдЯреЗрдВрд╕ (survivor-network)
  • рдбреЗрдЯрд╛рдмреЗрд╕ (graph-db)
  • рд╕рднреА рдиреЛрдб рдФрд░ рдПрдЬ рдЯреЗрдмрд▓
  • рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдкрд░реНрдЯреА рдЧреНрд░рд╛рдлрд╝ рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:
============================================================
SUCCESS! Database setup complete.
============================================================

Instance:  survivor-network
Database:  graph-db
Graph:     SurvivorGraph

Access your database at:
https://console.cloud.google.com/spanner/instances/survivor-network/databases/graph-db?project=waybackhome

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ Access your database at рдХреЗ рдмрд╛рдж рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, Google Cloud Console Spanner рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

open_spanner

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ Google Cloud Console рдореЗрдВ Spanner рджрд┐рдЦреЗрдЧрд╛!

spanner

4. Spanner Studio рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛

рдЗрд╕ рдЧрд╛рдЗрдб рдХреА рдорджрдж рд╕реЗ, Spanner Studio рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, Google Cloud Console рдореЗрдВ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдФрд░ рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ.

1. Spanner Studio рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░рдирд╛

  1. рдЖрдЦрд┐рд░реА рдЪрд░рдг рдореЗрдВ, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ Spanner Studio рдЦреЛрд▓рд╛ рд╣реЛ.

spanner_studio

2. рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рдордЭрдирд╛ ("рдмрдбрд╝реА рддрд╕реНрд╡реАрд░")

Survivor Network рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд▓реЙрдЬрд┐рдХ рдкрдЬрд╝рд▓ рдпрд╛ рдЧреЗрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рддреМрд░ рдкрд░ рд╕рдордЭреЗрдВ:

рдЗрдХрд╛рдИ

рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднреВрдорд┐рдХрд╛

рдЙрдкрдорд╛

Survivors

рдПрдЬреЗрдВрдЯ/рдЦрд┐рд▓рд╛рдбрд╝реА

рдЦрд┐рд▓рд╛рдбрд╝реА

рдмрд╛рдпреЛрдо

рд╡реЗ рдХрд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИрдВ

рдореИрдк рдЬрд╝реЛрди

рд╕реНрдХрд┐рд▓

рд╡реЗ рдХреНрдпрд╛-рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрд╖рдорддрд╛рдПрдВ

рдЬрд╝рд░реВрд░реА рд╣реИ

рдЙрдирдореЗрдВ рдХреНрдпрд╛ рдХрдореА рд╣реИ (рд╕рдВрдХрдЯ)

рдХреНрд╡реЗрд╕реНрдЯ/рдорд┐рд╢рди

рд╕рдВрд╕рд╛рдзрди

рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдорд┐рд▓реЗ рдЖрдЗрдЯрдо

рд▓реВрдЯ

рд▓рдХреНрд╖реНрдп: рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдХрд╛ рдХрд╛рдо, рдмрд╛рдпреЛрдо (рдЬрдЧрд╣ рдХреА рдкрд╛рдмрдВрджрд┐рдпрд╛рдВ) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬрд╝рд░реВрд░рддреЛрдВ (рд╕рдорд╕реНрдпрд╛рдУрдВ) рдХреЛ рд╕реНрдХрд┐рд▓ (рд╕рдорд╛рдзрд╛рди) рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИ.

ЁЯФЧ рдПрдЬ (рд╕рдВрдмрдВрдз):

  • SurvivorInBiome: рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЯреНрд░реИрдХ рдХрд░рдирд╛
  • SurvivorHasSkill: рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА
  • SurvivorHasNeed: рдЪрд╛рд▓реВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА
  • SurvivorFoundResource: рдЖрдЗрдЯрдо рдХреА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА
  • SurvivorCanHelp: рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдмрдВрдз (рдПрдЖрдИ рдЗрд╕рдХрд╛ рд╣рд┐рд╕рд╛рдм рд▓рдЧрд╛рддрд╛ рд╣реИ!)

3. рдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛

рдЖрдЗрдП, рдХреБрдЫ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдХрд░ рдбреЗрдЯрд╛ рдореЗрдВ "рд╕реНрдЯреЛрд░реА" рджреЗрдЦрддреЗ рд╣реИрдВ.

Spanner Graph, GQL (рдЧреНрд░рд╛рдлрд╝ рдХреНрд╡реЗрд░реА рд▓реИрдВрдЧреНрд╡реЗрдЬ) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, GRAPH SurvivorNetwork рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдЪ рдкреИрдЯрд░реНрди рдбрд╛рд▓реЗрдВ.

ЁЯСЙ рдкрд╣рд▓реА рдХреНрд╡реЗрд░реА: рдЧреНрд▓реЛрдмрд▓ рд░реЛрд╕реНрдЯрд░ (рдХреМрди рдХрд╣рд╛рдВ рд╣реИ?) рдпрд╣ рдЖрдкрдХреА рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ. рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдордЭрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ.

GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[:SurvivorInBiome]->(b:Biomes)
RETURN TO_JSON(result) AS json_result

рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: query1

ЁЯСЙ рджреВрд╕рд░реА рдХреНрд╡реЗрд░реА: рд╕реНрдХрд┐рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдХреНрд╖рдорддрд╛рдПрдВ) рдЕрдм рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдХрд╣рд╛рдВ рд╣реИ. рдЕрдм рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.

GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[h:SurvivorHasSkill]->(k:Skills)
RETURN TO_JSON(result) AS json_result

рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: query2

ЁЯСЙ рддреАрд╕рд░реА рдХреНрд╡реЗрд░реА: рд╕рдВрдХрдЯ рдореЗрдВ рдХреМрди рд╣реИ? (The "Mission Board") рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдорджрдж рдЪрд╛рд╣рд┐рдП.

GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[h:SurvivorHasNeed]->(n:Needs)
RETURN TO_JSON(result) AS json_result

рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: query3

ЁЯФО рдРрдбрд╡рд╛рдВрд╕: рдореИрдЪрдореЗрдХрд┐рдВрдЧ - рдХреМрди рдХрд┐рд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХрд╛рдлрд╝реА рдлрд╝рд╛рдпрджрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕ рдХреНрд╡реЗрд░реА рд╕реЗ, рдРрд╕реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдРрд╕реА рд╕реНрдХрд┐рд▓ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╡реЗ рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

GRAPH SurvivorNetwork
MATCH result = (helper:Survivors)-[:SurvivorHasSkill]->(skill:Skills)-[:SkillTreatsNeed]->(need:Needs)<-[:SurvivorHasNeed]-(helpee:Survivors)
RETURN TO_JSON(result) AS json_result

рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: query4

aside positive рдЗрд╕ рдХреНрд╡реЗрд░реА рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

рд╕рд┐рд░реНрдлрд╝ "рдлрд╝рд░реНрд╕реНрдЯ рдПрдб рд╕реЗ рдЬрд▓рдиреЗ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" (рдЬреЛ рд╕реНрдХреАрдорд╛ рд╕реЗ рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ) рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХреНрд╡реЗрд░реА рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдвреВрдВрдврддреА рд╣реИ:

  • рдбреЙрдХреНрдЯрд░ рдПрд▓реАрдирд╛ рдлрд╝реНрд░реЙрд╕реНрдЯ (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реА рд╣реИ) тЖТ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддреА рд╣реИрдВ тЖТ рдХреИрдкреНрдЯрди Tanaka (рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ)
  • рдбреЗрд╡рд┐рдб рдЪреЗрди (рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдХрд╛ рд╕рд╛рдорд╛рди рд╣реИ) тЖТ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ тЖТ рд▓реЗрдлрд╝реНрдЯрд┐рдиреЗрдВрдЯ рдкрд╛рд░реНрдХ (рдЬрд┐рд╕рдХреЗ рдЯрдЦрдиреЗ рдореЗрдВ рдореЛрдЪ рдЖрдИ рд╣реИ)

рдпрд╣ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рдХрд╛рд░рдЧрд░ рд╣реИ:

рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛:

рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рдЬрд▓реЗ рд╣реБрдП рдШрд╛рд╡реЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХреМрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ?" рдкреВрдЫрддрд╛ рд╣реИ, рддреЛ рдПрдЬреЗрдВрдЯ:

  1. рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЧреНрд░рд╛рдлрд╝ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдирд╛
  2. рдЬрд╡рд╛рдм: "рдбреЙрдХреНрдЯрд░ рдлрд╝реНрд░реЙрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╣реИ рдФрд░ рд╡реЗ рдХреИрдкреНрдЯрди Tanaka рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЯреЗрдмрд▓ рдпрд╛ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ!

5. Spanner рдореЗрдВ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ

1. рдПрдВрдмреЗрдбрд┐рдВрдЧ рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░реА рд╣реИрдВ? (рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ, рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП)

рд╕рд░реНрд╡рд╛рдЗрд╡рд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдордп рдмрд╣реБрдд рдЕрд╣рдо рд╣реЛрддрд╛ рд╣реИ. рдЬрдм рдХреЛрдИ рдкреАрдбрд╝рд┐рдд рд╡реНрдпрдХреНрддрд┐ I need someone who can treat burns рдпрд╛ Looking for a medic рдЬреИрд╕реА рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореМрдЬреВрдж рдХреМрд╢рд▓ рдХреЗ рд╕рдЯреАрдХ рдирд╛рдо рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛.

рдЕрд╕рд▓ рд╕реНрдерд┐рддрд┐: рд╕рд░реНрд╡рд╛рдЗрд╡рд░: Captain Tanaka has burnsтАФwe need medical help NOW!

"рдбреЙрдХреНрдЯрд░" рдХреЗ рд▓рд┐рдП, рдХреАрд╡рд░реНрдб рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░ тЖТ 0 рдирддреАрдЬреЗ рдорд┐рд▓реЗ тЭМ

рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ тЖТ "рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ" рдФрд░ "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛" рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ тЬЕ

рдПрдЬреЗрдВрдЯ рдХреЛ рдареАрдХ рдЗрд╕реА рддрд░рд╣ рдХреА рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ, рдЗрдВрд╕рд╛рдиреЛрдВ рдЬреИрд╕реА рдЦреЛрдЬ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдпрд╣ рдЦреЛрдЬ, рд╕рд┐рд░реНрдлрд╝ рдХреАрд╡рд░реНрдб рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯреЗрдВрдЯ рдХреЛ рднреА рд╕рдордЭрддреА рд╣реИ.

2. рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдмрдирд╛рдирд╛

spanner_embedding

рдЕрдм рд╣рдо рдПрдХ рдРрд╕рд╛ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ Google рдХреЗ text-embedding-004 рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ.

ЁЯСЙ Spanner Studio рдореЗрдВ, рдЗрд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдЪрд▓рд╛рдПрдВ ($YOUR_PROJECT_ID рдХреА рдЬрдЧрд╣ рдЕрдкрдирд╛ рдЕрд╕рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдбрд╛рд▓реЗрдВ):

тА╝я╕П рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, Cloud Shell рдПрдбрд┐рдЯрд░ рдореЗрдВ File -> Open Folder -> way-back-home/level_2 рдЦреЛрд▓реЗрдВ.

project_id

ЁЯСЙ рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ Spanner Studio рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХреНрд╡реЗрд░реА рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдЪрд┐рдкрдХрд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, 'рдЪрд▓рд╛рдПрдВ' рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

CREATE MODEL TextEmbeddings
INPUT(content STRING(MAX))
OUTPUT(embeddings STRUCT<values ARRAY<FLOAT32>>)
REMOTE OPTIONS (
    endpoint = '//aiplatform.googleapis.com/projects/$YOUR_PROJECT_ID/locations/us-central1/publishers/google/models/text-embedding-004'
);

рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

  • Spanner рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдореЙрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╡реЗрдЯ рдХреЛ рд▓реЛрдХрд▓ рддреМрд░ рдкрд░ рд╕реЗрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
  • Vertex AI рдкрд░ Google рдХреЗ text-embedding-004 рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ
  • рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рддрдп рдХрд░рддрд╛ рд╣реИ: рдЗрдирдкреБрдЯ рдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ 768 рдбрд╛рдЗрдореЗрдВрд╢рди рд╡рд╛рд▓рд╛ рдлрд╝реНрд▓реЛрдЯ рдРрд░реЗ рд╣реЛрддрд╛ рд╣реИ

"REMOTE OPTIONS" рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

  • Spanner, рдореЙрдбрд▓ рдХреЛ рдЦреБрдж рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ
  • ML.PREDICT рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ рдЬрд╝рд░рд┐рдП Vertex AI рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
  • рдЬрд╝реАрд░реЛ-рдИрдЯреАрдПрд▓: рдбреЗрдЯрд╛ рдХреЛ Python рдореЗрдВ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ, рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ, рдФрд░ рдлрд┐рд░ рд╕реЗ рдЗрдВрдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА

рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

spanner_result

3. Embedding Column рдЬреЛрдбрд╝реЗрдВ

ЁЯСЙ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдЬреЛрдбрд╝реЗрдВ:

ALTER TABLE Skills ADD COLUMN skill_embedding ARRAY<FLOAT32>;

рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

embedding_result

4. рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛

ЁЯСЙ рд╣рд░ рд╕реНрдХрд┐рд▓ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

UPDATE Skills
SET skill_embedding = (
    SELECT embeddings.values
    FROM ML.PREDICT(
        MODEL TextEmbeddings,
        (SELECT name AS content)
    )
)
WHERE skill_embedding IS NULL;

рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

skills_result

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рд╣рд░ рд╕реНрдХрд┐рд▓ рдХрд╛ рдирд╛рдо (рдЬреИрд╕реЗ, "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛") рдХреЛ 768 рдбрд╛рдЗрдореЗрдВрд╢рди рд╡рд╛рд▓реЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрд╣ рд╡реЗрдХреНрдЯрд░, рдЗрд╕рдХреЗ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдорддрд▓рдм рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ.

5. рдПрдореНрдмреЗрдб рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

ЁЯСЙ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдПрдореНрдмреЗрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ:

SELECT 
    skill_id,
    name,
    ARRAY_LENGTH(skill_embedding) AS embedding_dimensions
FROM Skills
LIMIT 5;

рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:

spanner_result

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ, рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рд╕рдЯреАрдХ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ: "рдореЗрдбрд┐рдХ" рд╢рдмреНрдж рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЪрд┐рдХрд┐рддреНрд╕рд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╕реНрдХрд┐рд▓ рдвреВрдВрдврдирд╛.

ЁЯСЙ "рдбреЙрдХреНрдЯрд░" рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓ рдвреВрдВрдвреЗрдВ:

WITH query_embedding AS (
    SELECT embeddings.values AS val
    FROM ML.PREDICT(MODEL TextEmbeddings, (SELECT "medic" AS content))
)
SELECT
    s.name AS skill_name,
    s.category,
    COSINE_DISTANCE(s.skill_embedding, (SELECT val FROM query_embedding)) AS distance
FROM Skills AS s
WHERE s.skill_embedding IS NOT NULL
ORDER BY distance ASC
LIMIT 10;
  • рдпрд╣ рдХреБрдХреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЦреЛрдЬ рд╢рдмреНрдж "medic" рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рддреА рд╣реИ
  • рдЗрд╕реЗ query_embedding рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ

рдЕрдиреБрдорд╛рдирд┐рдд рдирддреАрдЬреЗ (рдХрдо рджреВрд░реА = рдЬрд╝реНрдпрд╛рджрд╛ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ):

spanner_result

7. рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП Gemini рдореЙрдбрд▓ рдмрдирд╛рдирд╛

spanner_gemini

ЁЯСЙ рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ рдореЙрдбрд▓ рдХрд╛ рд░реЗрдлрд╝рд░рдВрд╕ рдмрдирд╛рдПрдВ ($YOUR_PROJECT_ID рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗ рдмрджрд▓реЗрдВ):

CREATE MODEL GeminiPro
INPUT(prompt STRING(MAX))
OUTPUT(content STRING(MAX))
REMOTE OPTIONS (
    endpoint = '//aiplatform.googleapis.com/projects/$YOUR_PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-pro',
    default_batch_size = 1
);

рдПрдореНрдмреЗрдб рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдореЙрдбрд▓ рд╕реЗ рдЕрдВрддрд░:

  • рдПрдореНрдмреЗрдб рдХрд░рдирд╛: рдЯреЗрдХреНрд╕реНрдЯ тЖТ рд╡реЗрдХреНрдЯрд░ (рд╕рдорд╛рдирддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП)
  • Gemini: рдЯреЗрдХреНрд╕реНрдЯ тЖТ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ (рддрд░реНрдХ/рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП)

spanner_result

8. Gemini рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдХрдВрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛

ЁЯСЙ рдорд┐рд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:

WITH PairData AS (
    SELECT
        s1.name AS Name_A,
        s2.name AS Name_B,
        CONCAT(
            "Assess compatibility of these two survivors for a resource-gathering mission. ",
            "Survivor 1: ", s1.name, ". ",
            "Survivor 2: ", s2.name, ". ",
            "Give a score from 1-10 and a 1-sentence reason."
        ) AS prompt
    FROM Survivors s1
    JOIN Survivors s2 ON s1.survivor_id < s2.survivor_id
    LIMIT 1
)
SELECT
    Name_A,
    Name_B,
    content AS ai_assessment
FROM ML.PREDICT(
    MODEL GeminiPro,
    (SELECT Name_A, Name_B, prompt FROM PairData)
);

рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:

Name_A          | Name_B            | ai_assessment
----------------|-------------------|----------------
"David Chen"    | "Dr. Elena Frost" | "**Score: 9/10** Their compatibility is extremely high as David's practical, hands-on scavenging skills are perfectly complemented by Dr. Frost's specialized knowledge to identify critical medical supplies and avoid biological hazards."

6. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдирд╛ Graph RAG рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛

1. рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░рд╣ рдХреА рдХреНрд╡реЗрд░реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░ рдкрд╛рддрд╛ рд╣реИ. рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рддреАрди рд▓реЗрдпрд░ рд╣реЛрддреА рд╣реИрдВ: рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░, рдЯреВрд▓ рд▓реЗрдпрд░, рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрдпрд░.

architecture_hybrid_search

рддреАрди рд▓реЗрдпрд░ рдХреНрдпреЛрдВ?

  • рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдмрдВрдЯрд╡рд╛рд░рд╛: рдПрдЬреЗрдВрдЯ рдХрд╛ рдлрд╝реЛрдХрд╕ рдЗрдВрдЯреЗрдВрдЯ рдкрд░, рдЯреВрд▓ рдХрд╛ рдлрд╝реЛрдХрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░, рдФрд░ рд╕реЗрд╡рд╛ рдХрд╛ рдлрд╝реЛрдХрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИ
  • рд▓рдЪреАрд▓рд╛рдкрди: рдПрдЬреЗрдВрдЯ рдХреЗ рдкрд╛рд╕, рдХрд┐рд╕реА рдЦрд╛рд╕ рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпрд╛ рдПрдЖрдИ рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд░реВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ
  • рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди: рдЬрдм рддрд░реАрдХрд╛ рдкрддрд╛ рд╣реЛ, рддреЛ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╣рдВрдЧреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕реНрдХрд┐рдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреА. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдлрд╝ рдХреАрд╡рд░реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдорддрд▓рдм рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирддреАрдЬреЗ рдвреВрдВрдврдиреЗ рд╣реЛрдВрдЧреЗ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.

2. RAG рд╕реЗрд╡рд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/services/hybrid_search_service.py

рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдврдирд╛ # TODO: REPLACE_SQL

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

        # This is your working query from the successful run!
        sql = """
            WITH query_embedding AS (
                SELECT embeddings.values AS val
                FROM ML.PREDICT(
                    MODEL TextEmbeddings,
                    (SELECT @query AS content)
                )
            )
            SELECT
                s.survivor_id,
                s.name AS survivor_name,
                s.biome,
                sk.skill_id,
                sk.name AS skill_name,
                sk.category,
                COSINE_DISTANCE(
                    sk.skill_embedding, 
                    (SELECT val FROM query_embedding)
                ) AS distance
            FROM Survivors s
            JOIN SurvivorHasSkill shs ON s.survivor_id = shs.survivor_id
            JOIN Skills sk ON shs.skill_id = sk.skill_id
            WHERE sk.skill_embedding IS NOT NULL
            ORDER BY distance ASC
            LIMIT @limit
        """

3. рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/tools/hybrid_search_tools.py

hybrid_search_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SEMANTIC_SEARCH_TOOL рдвреВрдВрдвреЗрдВ

ЁЯСЙрдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

async def semantic_search(query: str, limit: int = 10) -> str:
    """
    Force semantic (RAG) search using embeddings.
    
    Use this when you specifically want to find things by MEANING,
    not just matching keywords. Great for:
    - Finding conceptually similar items
    - Handling vague or abstract queries
    - When exact terms are unknown
    
    Example: "healing abilities" will find "first aid", "surgery", 
    "herbalism" even though no keywords match exactly.
    
    Args:
        query: What you're looking for (describe the concept)
        limit: Maximum results
        
    Returns:
        Semantically similar results ranked by relevance
    """
    try:
        service = _get_service()
        result = service.smart_search(
            query, 
            force_method=SearchMethod.RAG,
            limit=limit
        )
        
        return _format_results(
            result["results"],
            result["analysis"],
            show_analysis=True
        )
        
    except Exception as e:
        return f"Error in semantic search: {str(e)}"

рдПрдЬреЗрдВрдЯ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрдм рдХрд░рддрд╛ рд╣реИ:

  • рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЪреАрдЬрд╝реЗрдВ рдвреВрдВрдврдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЧрдИ рдХреНрд╡реЗрд░реА ("X рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЪреАрдЬрд╝реЗрдВ рдвреВрдВрдвреЛ")
  • рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рдХреНрд╡реЗрд░реА ("рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛")
  • рдЬрдм рдорддрд▓рдм рд╕рдордЭрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реЛ

4. рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдлрд╝реИрд╕рд▓реЗ рд▓реЗрдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдЧрд╛рдЗрдб (рдирд┐рд░реНрджреЗрд╢)

рдПрдЬреЗрдВрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЪрд┐рдкрдХрд╛рдПрдВ.

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py

рдПрдЬреЗрдВрдЯ, рд╕рд╣реА рдЯреВрд▓ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ:

ЁЯСЙagent.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_SEARCH_LOGIC рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

- `semantic_search`: Force RAG/embedding search
  Use for: "Find similar to X", conceptual queries, unknown terminology
  Example: "Find skills related to healing"

ЁЯСЙ# TODO: ADD_SEARCH_TOOLReplace this whole line рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЙрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    semantic_search,         # Force RAG

5. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рдордЭрдирд╛ (рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИ)

рджреВрд╕рд░реЗ рд╕реЗ рдЪреМрдереЗ рдЪрд░рдг рдореЗрдВ, рдЖрдкрдиреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХреА. рдпрд╣ рдЦреЛрдЬ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдорддрд▓рдм рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдирддреАрдЬреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдпрд╣ рджреЗрдЦрд╛ рд╣реЛ рдХрд┐ рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ "рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рд╣рд╛рдЗрдмреНрд░рд┐рдб рдорд░реНрдЬ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ:

рдлрд╝рд╛рдЗрд▓ way-back-home/level_2/backend/services/hybrid_search_service.py рдореЗрдВ, hybrid_search() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░, рд╕реЗрд╡рд╛ рджреЛрдиреЛрдВ рдЦреЛрдЬреЗрдВ рдЪрд▓рд╛рддреА рд╣реИ рдФрд░ рдирддреАрдЬреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рддреА рд╣реИ:

# Location: backend/services/hybrid_search_service.py

    rank_kw = keyword_ranks.get(surv_id, float('inf'))
    rank_rag = rag_ranks.get(surv_id, float('inf'))

    rrf_score = 0.0
    if rank_kw != float('inf'):
        rrf_score += 1.0 / (K + rank_kw)
    if rank_rag != float('inf'):
        rrf_score += 1.0 / (K + rank_rag)

    combined_score = rrf_score

рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╣реИ. рдХреАрд╡рд░реНрдб рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб рддрд░реАрдХреЗ, рд╕реЗрд╡рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ. рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рдЗрди рддреАрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!

рдмрдзрд╛рдИ рд╣реЛ! рдЖрдкрдиреЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде Graph RAG рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реЗрдЯ рдЕрдк рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ!

7. ADK Web рдХреА рдорджрдж рд╕реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛

рдЕрдкрдиреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, adk web рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ. рдЗрд╕рд╕реЗ, рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рд▓реЙрдиреНрдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ.

1. рдПрдЬреЗрдВрдЯ рдХреЛ рдЪрд▓рд╛рдирд╛

ЁЯСЙЁЯТ╗ рдмреИрдХрдПрдВрдб рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА (рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ::

cd ~/way-back-home/level_2/backend
uv run adk web

рдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ,

agent/agent.py

рдФрд░ рдЗрд╕рд╕реЗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреБрд▓рддрд╛ рд╣реИ.

ЁЯСЙ рдпрд╣ рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ:

рдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ, рдПрдХ рд▓реЛрдХрд▓ рдпреВрдЖрд░рдПрд▓ (рдЖрдо рддреМрд░ рдкрд░ http://127.0.0.1:8000 рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХреЛрдИ рдпреВрдЖрд░рдПрд▓) рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛. рдЗрд╕реЗ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓реЗрдВ.

adk web

рдпреВрдЖрд░рдПрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ ADK рдХрд╛ рд╡реЗрдм рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рджрд┐рдЦреЗрдЧрд╛. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд╕рдмрд╕реЗ рдКрдкрд░ рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ "рдПрдЬреЗрдВрдЯ" рдЪреБрдирд╛ рд╣реЛ.

adk_ui

2. рдЦреЛрдЬ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛

рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЦреЛрдЬ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреИрдЯ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдЖрдЬрд╝рдорд╛рдПрдВ.

рдХреАрд╡рд░реНрдб рдХреЗ рдореЗрд▓ рди рдЦрд╛рдиреЗ рдкрд░ рднреА, рдорддрд▓рдм рдФрд░ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЗрдЯрдо рдвреВрдВрдврддрд╛ рд╣реИ.

рдЯреЗрд╕реНрдЯ рдХреНрд╡реЗрд░реА: (рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪреБрдиреЗрдВ)

Who can help with injuries?
What abilities are related to survival?

рдЗрди рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ:

  • рдЬрд╡рд╛рдм рдореЗрдВ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рдпрд╛ рдЖрд░рдПрдЬреА рдЦреЛрдЬ рдХрд╛ рдЬрд╝рд┐рдХреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
  • рдЖрдкрдХреЛ рдРрд╕реЗ рдирддреАрдЬреЗ рджрд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реЛрдВ. рдЬреИрд╕реЗ, "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрддреЗ рд╕рдордп "рд╕рд░реНрдЬрд░реА" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рди рджреЗрдВ).
  • рдирддреАрдЬреЛрдВ рдореЗрдВ ЁЯзм рдЖрдЗрдХреЙрди рджрд┐рдЦреЗрдЧрд╛.

рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП, рдХреАрд╡рд░реНрдб рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ.

рдЯреЗрд╕реНрдЯ рдХреНрд╡реЗрд░реА:(рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪреБрдиреЗрдВ)

Find someone who can ply a plane in the volcanic area
Who has healing abilities in the FOSSILIZED?
Who has healing abilities in the mountains?

рдЗрди рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ:

  • рд╡рдЬрд╣ рдореЗрдВ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдЦреЛрдЬ рдХрд╛ рдЬрд╝рд┐рдХреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
  • рдирддреАрдЬреЗ, рджреЛрдиреЛрдВ рд╢рд░реНрддреЛрдВ (рдХреЙрдиреНрд╕реЗрдкреНрдЯ + рдЬрдЧрд╣/рдХреИрдЯреЗрдЧрд░реА) рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП.
  • рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рдирддреАрдЬреЛрдВ рдореЗрдВ ЁЯФА рдЖрдЗрдХреЙрди рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд░реИрдВрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.

ЁЯСЙЁЯТ╗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ Ctrl+C рджрдмрд╛рдХрд░ рдкреНрд░реЛрд╕реЗрд╕ рдЦрддреНрдо рдХрд░реЗрдВ.

8. рдкреВрд░рд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдирд╛

рдлрд╝реБрд▓ рд╕реНрдЯреИрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

architecture_fullstack

SessionService рдФрд░ Runner рдЬреЛрдбрд╝реЗрдВ

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ chat.py рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ. рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "ctrl+C" рджрдмрд╛рдпрд╛ рд╣реЛ:

cloudshell edit ~/way-back-home/level_2/backend/api/routes/chat.py

ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_INMEMORY_SERVICES рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

    session_service = InMemorySessionService()
    memory_service = InMemoryMemoryService()

ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_RUNNER рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

runner = Runner(
    agent=root_agent, 
    session_service=session_service,
    memory_service=memory_service,
    app_name="survivor-network"
)

1. рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░реЗрдВ

рдЕрдЧрд░ рдкрд┐рдЫрд▓рд╛ рдЯрд░реНрдорд┐рдирд▓ рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ Ctrl+C рджрдмрд╛рдХрд░ рдЙрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.

ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:

cd ~/way-back-home/level_2/
./start_app.sh

рдмреИрдХрдПрдВрдб рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ Local: http://localhost:5173/" рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: рдлрд╝реНрд░рдВрдЯреЗрдб

ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

рдмрд╛рддрдЪреАрдд

рдХреНрд╡реЗрд░реА:

Find skills similar to healing

рдЪреИрдЯ

рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

  • рдПрдЬреЗрдВрдЯ, рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ
  • "healing" рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╕рд╛рдЗрди рджреВрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ
  • рдЬрд╡рд╛рдм: рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛ (рднрд▓реЗ рд╣реА, рдирд╛рдо "рдареАрдХ рд╣реЛрдирд╛" рд╕реЗ рдореЗрд▓ рди рдЦрд╛рддреЗ рд╣реЛрдВ)

рдХреНрд╡реЗрд░реА:

Find medical skills in the mountains

рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

  1. рдХреАрд╡рд░реНрдб рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ: category='medical' рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░
  2. рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ: "рдореЗрдбрд┐рдХрд▓" рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реИрдВрдХ рдХрд░реЗрдВ
  3. рдорд░реНрдЬ рдХрд░реЗрдВ: рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рдирддреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВ. рд╕рд╛рде рд╣реА, рдЙрди рдирддреАрдЬреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдЬреЛ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рд╣реИрдВ ЁЯФА

рдХреНрд╡реЗрд░реА(рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ):

Who is good at survival and in the forest?

рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

  • рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡: biome='forest'
  • рд╕реЗрдореИрдЯрд┐рдХ рдиреЗ рдпреЗ рд╕реНрдХрд┐рд▓ рдвреВрдВрдврдХрд░ рдирд┐рдХрд╛рд▓реА рд╣реИрдВ: "рдЬреАрд╡рди рдмрдЪрд╛рдирд╛" рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓
  • рд╣рд╛рдЗрдмреНрд░рд┐рдб, рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдмреЗрд╣рддрд░ рдирддреАрдЬреЗ рджреЗрддрд╛ рд╣реИ

ЁЯСЙЁЯТ╗ рдЬрд╛рдВрдЪ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ Ctrl+C рджрдмрд╛рдХрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.

9. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдЯреВрд▓рд┐рдВрдЧ рд▓реЗрдпрд░

рд╣рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рдЬрд╝рд░реВрд░рдд рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИ?

рд╕рд░реНрд╡рд╛рдЗрд╡рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛. рдкреАрдбрд╝рд┐рдд, рдЪреИрдЯ рдХреЗ рдЬрд╝рд░рд┐рдП рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдЕрдирд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ:

  • ЁЯУ╕ рдЗрдореЗрдЬ: рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЦрддрд░реЛрдВ рдпрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдлрд╝реЛрдЯреЛ
  • ЁЯОе рд╡реАрдбрд┐рдпреЛ: рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓реА рд░рд┐рдкреЛрд░реНрдЯ рдпрд╛ рдПрд╕рдУрдПрд╕ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ
  • ЁЯУД рдЯреЗрдХреНрд╕реНрдЯ: рдлрд╝реАрд▓реНрдб рдиреЛрдЯ рдпрд╛ рд▓реЙрдЧ

рд╣рдо рдХреМрдирд╕реА рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ?

рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдЦреЛрдЬрд╛ рдерд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ. chat.py рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдлрд╝рд╛рдЗрд▓ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдХреЛ рдбрд╛рдЗрдиреИрдорд┐рдХ рддреМрд░ рдкрд░ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ:

рд╕реНрд░реЛрдд

рд╕рд╛рдордЧреНрд░реА

рд▓рдХреНрд╖реНрдп

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдЯреИрдЪрдореЗрдВрдЯ

рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ/рдЯреЗрдХреНрд╕реНрдЯ

рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА

рдЪреИрдЯ рдХрд╛ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ

"рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рди рдХреА рдлрд╝реЛрдЯреЛ рджреА рдЧрдИ рд╣реИ"

рдЗрд░рд╛рджрд╛ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА

рдкреНрд▓рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рддрд░реАрдХрд╛: рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рд╣рдо рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ (multimedia_agent.py) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ. рдпрд╣ рдЦрд╛рд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

architecture_uploading

рдЗрд╕реЗ backend/agent/multimedia_agent.py рдореЗрдВ SequentialAgent рдХреЗ рддреМрд░ рдкрд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

рдЯреВрд▓рд┐рдВрдЧ рд▓реЗрдпрд░, рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЯреВрд▓, "рдХреИрд╕реЗ" рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛.

1. Tools рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ

ЁЯСЙЁЯТ╗ рдирдпрд╛ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ. рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/tools/extraction_tools.py

2. upload_media рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдпрд╣ рдЯреВрд▓, рд▓реЛрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ Google Cloud Storage рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙ extraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_UPLOAD_MEDIA_FUNCTION рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    """
    Upload media file to GCS and detect its type.
    
    Args:
        file_path: Path to the local file
        survivor_id: Optional survivor ID to associate with upload
        
    Returns:
        Dict with gcs_uri, media_type, and status
    """
    try:
        if not file_path:
            return {"status": "error", "error": "No file path provided"}
        
        # Strip quotes if present
        file_path = file_path.strip().strip("'").strip('"')
        
        if not os.path.exists(file_path):
            return {"status": "error", "error": f"File not found: {file_path}"}
        
        gcs_uri, media_type, signed_url = gcs_service.upload_file(file_path, survivor_id)
        
        return {
            "status": "success",
            "gcs_uri": gcs_uri,
            "signed_url": signed_url,
            "media_type": media_type.value,
            "file_name": os.path.basename(file_path),
            "survivor_id": survivor_id
        }
    except Exception as e:
        logger.error(f"Upload failed: {e}")
        return {"status": "error", "error": str(e)}

3. extract_from_media рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдпрд╣ рдЯреВрд▓ рдПрдХ рд░рд╛рдЙрдЯрд░ рд╣реИ. рдпрд╣ media_type рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ (рдЯреЗрдХреНрд╕реНрдЯ, рдЗрдореЗрдЬ рдпрд╛ рд╡реАрдбрд┐рдпреЛ) рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ.

ЁЯСЙextraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_EXTRACT_FROM_MEDIA рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    """
    Extract entities and relationships from uploaded media.
    
    Args:
        gcs_uri: GCS URI of the uploaded file
        media_type: Type of media (text/image/video)
        signed_url: Optional signed URL for public/temporary access
        
    Returns:
        Dict with extraction results
    """
    try:
        if not gcs_uri:
             return {"status": "error", "error": "No GCS URI provided"}

        # Select appropriate extractor
        if media_type == MediaType.TEXT.value or media_type == "text":
            result = await text_extractor.extract(gcs_uri)
        elif media_type == MediaType.IMAGE.value or media_type == "image":
            result = await image_extractor.extract(gcs_uri)
        elif media_type == MediaType.VIDEO.value or media_type == "video":
            result = await video_extractor.extract(gcs_uri)
        else:
            return {"status": "error", "error": f"Unsupported media type: {media_type}"}
            
        # Inject signed URL into broadcast info if present
        if signed_url:
            if not result.broadcast_info:
                result.broadcast_info = {}
            result.broadcast_info['thumbnail_url'] = signed_url
        
        return {
            "status": "success",
            "extraction_result": result.to_dict(), # Return valid JSON dict instead of object
            "summary": result.summary,
            "entities_count": len(result.entities),
            "relationships_count": len(result.relationships),
            "entities": [e.to_dict() for e in result.entities],
            "relationships": [r.to_dict() for r in result.relationships]
        }
    except Exception as e:
        logger.error(f"Extraction failed: {e}")
        return {"status": "error", "error": str(e)}

рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдореБрдЦреНрдп рдЬрд╛рдирдХрд╛рд░реА:

  • рдЯреЗрдХреНрд╕реНрдЯ, рдЗрдореЗрдЬ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╡рдЧреИрд░рд╣ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рджреЗрдирд╛: рд╣рдо generate_content рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ (_get_extraction_prompt()) рдФрд░ рдЗрдореЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ, рджреЛрдиреЛрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ.
  • рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдЖрдЙрдЯрдкреБрдЯ: response_mime_type="application/json" рдпрд╣ рдкрдХреНрдХрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрд▓рдПрд▓рдПрдо, рдорд╛рдиреНрдп JSON рдлрд╝реЙрд░реНрдореИрдЯ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗ. рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЬрд╝рд░реВрд░реА рд╣реИ.
  • рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдВрдЯрд┐рдЯреА рд▓рд┐рдВрдХрд┐рдВрдЧ: рдкреНрд░реЙрдореНрдкреНрдЯ рдореЗрдВ рдЬрд╛рдиреА-рдкрд╣рдЪрд╛рдиреА рдПрдВрдЯрд┐рдЯреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВ, рддрд╛рдХрд┐ Gemini рдЦрд╛рд╕ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХреЗ.

4. save_to_spanner рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдпрд╣ рдЯреВрд▓, рдирд┐рдХрд╛рд▓реА рдЧрдИ рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ Spanner Graph DB рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙextraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_SPANNER_AGENT рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    """
    Save extracted entities and relationships to Spanner Graph DB.
    
    Args:
        extraction_result: ExtractionResult object (or dict from previous step if passed as dict)
        survivor_id: Optional survivor ID to associate with the broadcast
        
    Returns:
        Dict with save statistics
    """
    try:
        # Handle if extraction_result is passed as the wrapper dict from extract_from_media
        result_obj = extraction_result
        if isinstance(extraction_result, dict) and 'extraction_result' in extraction_result:
             result_obj = extraction_result['extraction_result']
        
        # If result_obj is a dict (from to_dict()), reconstruct it
        if isinstance(result_obj, dict):
            from extractors.base_extractor import ExtractionResult
            result_obj = ExtractionResult.from_dict(result_obj)
        
        if not result_obj:
            return {"status": "error", "error": "No extraction result provided"}
            
        stats = spanner_service.save_extraction_result(result_obj, survivor_id)
        
        return {
            "status": "success",
            "entities_created": stats['entities_created'],
            "entities_existing": stats['entities_found_existing'],
            "relationships_created": stats['relationships_created'],
            "broadcast_id": stats['broadcast_id'],
            "errors": stats['errors'] if stats['errors'] else None
        }
    except Exception as e:
        logger.error(f"Spanner save failed: {e}")
        return {"status": "error", "error": str(e)}

рдПрдЬреЗрдВрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдЯреВрд▓ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдХрд░, рд╣рдо рдбреЗрдЯрд╛ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкрдХреНрдХрд╛ рдХрд░рддреЗ рд╣реИрдВ. рд╕рд╛рде рд╣реА, рдПрдЬреЗрдВрдЯ рдХреА рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ.

5. GCS рд╕реЗрд╡рд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

GCSService, Google Cloud Storage рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:

cloudshell edit ~/way-back-home/level_2/backend/services/gcs_service.py

ЁЯСЙ рдлрд╝рд╛рдЗрд▓ gcs_service.py рдореЗрдВ, upload_file рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SAVE_TO_GCS рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

        blob = self.bucket.blob(blob_name)
        blob.upload_from_filename(file_path)

рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ, рдПрдЬреЗрдВрдЯ рдХреЛ GCS рдмрдХреЗрдЯ, blob рдХреЗ рдирд╛рдо рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА. рдЗрд╕рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ "рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ" рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ.

6. (рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдПрдЬреЗрдВрдЯрд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ > рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рдХреНрдпреЛрдВ?

рдПрдЬреЗрдВрдЯрд┐рдХ рдПрдЖрдИ рдХреЗ рдлрд╝рд╛рдпрджреЗ:

рд╕реБрд╡рд┐рдзрд╛

рдмреИрдЪ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рдЗрд╡реЗрдВрдЯ-рдбреНрд░рд┐рд╡рди

рдПрдЬреЗрдВрдЯрд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ

рдЬрдЯрд┐рд▓рддрд╛

рдХрдо (рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ)

рдЬрд╝реНрдпрд╛рджрд╛ (рдкрд╛рдВрдЪ рдпрд╛ рдЙрд╕рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рд╕реЗрд╡рд╛рдПрдВ)

рдХрдо (1 Python рдлрд╝рд╛рдЗрд▓: multimedia_agent.py)

рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ

рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓

рд╣рд╛рд░реНрдб (рдбреАрдХрдкрд▓реНрдб)

рдпреВрдирд┐рдлрд╝рд╛рдЗрдб (рдПрдЬреЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐)

рдЧрдбрд╝рдмрдбрд╝реА рдареАрдХ рдХрд░рдирд╛

рдХреНрд░реИрд╢

рд╕рд╛рдЗрд▓реЗрдВрдЯ рд▓реЙрдЧ

рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ ("рдореБрдЭреЗ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА")

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реБрдЭрд╛рд╡/рд░рд╛рдп рдпрд╛ рд╢рд┐рдХрд╛рдпрдд

рдХрдВрд╕реЛрд▓ рдкреНрд░рд┐рдВрдЯ

рдкреЛрд▓рд┐рдВрдЧ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ

рддреБрд░рдВрдд (рдЪреИрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛)

рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдврд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛

рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЙрдЬрд┐рдХ

рд░рд┐рдЬрд┐рдб рдлрд╝рдВрдХреНрд╢рди

рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ (рдПрд▓рдПрд▓рдПрдо рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рдЪрд░рдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛)

рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдЕрд╡реЗрдпрд░рдиреЗрд╕

рдХреЛрдИ рдирд╣реАрдВ

рдХреЛрдИ рдирд╣реАрдВ

рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдордХрд╕рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ)

рдпрд╣ рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░реА рд╣реИ: multimedia_agent.py (рдЪрд╛рд░ рд╕рдм-рдПрдЬреЗрдВрдЯ рд╡рд╛рд▓рд╛ SequentialAgent: рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ тЖТ рдирд┐рдХрд╛рд▓реЗрдВ тЖТ рд╕реЗрд╡ рдХрд░реЗрдВ тЖТ рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╣рдо рдЬрдЯрд┐рд▓ рдЗрдВрдлрд╝реНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдХрдордЬрд╝реЛрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ, рдмрд╛рддрдЪреАрдд рд╡рд╛рд▓реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ.

10. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░

рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░, рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рддрдп рдХрд░рддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдРрд╕реЗ рдПрдЬреЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ. рд╣рд░ рдПрдЬреЗрдВрдЯ рдХреА рдПрдХ рдЦрд╛рд╕ рднреВрдорд┐рдХрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╡рд╣ рдЕрдЧрд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ. рдпрд╣рд╛рдВ рдорд▓реНрдЯреАрдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдбрд╛рдпрдЧреНрд░рд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

agent_diagram

1. рдПрдЬреЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/multimedia_agent.py

2. рдЕрдкрд▓реЛрдб рдПрдЬреЗрдВрдЯ рддрдп рдХрд░рдирд╛

рдпрд╣ рдПрдЬреЗрдВрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдореИрд╕реЗрдЬ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдкрд╛рде рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ GCS рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_UPLOAD_AGENT рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

upload_agent = LlmAgent(
    name="UploadAgent",
    model="gemini-2.5-flash",
    instruction="""Extract the file path from the user's message and upload it.

Use `upload_media(file_path, survivor_id)` to upload the file.
The survivor_id is optional - include it if the user mentions a specific survivor (e.g., "survivor Sarah" -> "Sarah").
If the user provides a path like "/path/to/file", use that.

Return the upload result with gcs_uri and media_type.""",
    tools=[upload_media],
    output_key="upload_result"
)

3. рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛

рдпрд╣ рдПрдЬреЗрдВрдЯ, рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЧрдП рдореАрдбрд┐рдпрд╛ рдХреЛ "рджреЗрдЦрддрд╛" рд╣реИ рдФрд░ Gemini Vision рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_EXTRACT_AGENT рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

extraction_agent = LlmAgent(
    name="ExtractionAgent", 
    model="gemini-2.5-flash",
    instruction="""Extract information from the uploaded media.

Previous step result: {upload_result}

Use `extract_from_media(gcs_uri, media_type, signed_url)` with the values from the upload result.
The gcs_uri is in upload_result['gcs_uri'], media_type in upload_result['media_type'], and signed_url in upload_result['signed_url'].

Return the extraction results including entities and relationships found.""",
    tools=[extract_from_media],
    output_key="extraction_result"
)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ instruction рд░реЗрдлрд╝рд░рдВрд╕ {upload_result} рдХреИрд╕реЗ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ тАФ ADK рдореЗрдВ рдПрдЬреЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.

4. Spanner рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛

рдпрд╣ рдПрдЬреЗрдВрдЯ, рдирд┐рдХрд╛рд▓реА рдЧрдИ рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SPANNER_AGENT рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

spanner_agent = LlmAgent(
    name="SpannerAgent",
    model="gemini-2.5-flash", 
    instruction="""Save the extracted information to the database.

Upload result: {upload_result}
Extraction result: {extraction_result}

Use `save_to_spanner(extraction_result, survivor_id)` to save to Spanner.
Pass the WHOLE `extraction_result` object/dict from the previous step.
Include survivor_id if it was provided in the upload step.

Return the save statistics.""",
    tools=[save_to_spanner],
    output_key="spanner_result"
)

рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рдЪрд░рдгреЛрдВ (upload_result рдФрд░ extraction_result) рд╕реЗ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ.

5. рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛

рдпрд╣ рдПрдЬреЗрдВрдЯ, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЗ рдирддреАрдЬреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдЬрд╡рд╛рдм рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА summary_instruction="" # TODO: REPLACE_SUMMARY_AGENT_PROMPT рдвреВрдВрдвреЗрдВ.

рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

USE_MEMORY_BANK = os.getenv("USE_MEMORY_BANK", "false").lower() == "true"
save_msg = "6. Mention that the data is also being synced to the memory bank." if USE_MEMORY_BANK else ""

summary_instruction = f"""Provide a user-friendly summary of the media processing.

Upload: {{upload_result}}
Extraction: {{extraction_result}}
Database: {{spanner_result}}

Summarize:
1. What file was processed (name and type)
2. Key information extracted (survivors, skills, needs, resources found) - list names and counts
3. Relationships identified
4. What was saved to the database (broadcast ID, number of entities)
5. Any issues encountered
{save_msg}

Be concise but informative."""

рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреВрд▓ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА. рдпрд╣ рд╕рд┐рд░реНрдлрд╝ рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ.

ЁЯза рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

рдкрд░рдд

рдлрд╝рд╛рдЗрд▓

рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА

рдЯреВрд▓рд┐рдВрдЧ

extraction_tools.py + gcs_service.py

рдХреИрд╕реЗ тАФ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ, рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХрд░реЗрдВ, рд╕реЗрд╡ рдХрд░реЗрдВ

Agent

multimedia_agent.py

рдХреНрдпрд╛ тАФ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛

11. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдбреЗрдЯрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди

рд╣рдорд╛рд░реЗ рдирдП рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕рд╛, MultimediaExtractionPipeline рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ backend/agent/multimedia_agent.py рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдпрд╣ ADK (рдПрдЬреЗрдВрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ) рд╕реЗ рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ рдкреИрдЯрд░реНрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.

1. рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдЯрд╛рд░рдЧреЗрдЯрд┐рдВрдЧ рдХреНрдпреЛрдВ?

рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдХреНрд░рдо рд╕реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ:

  1. рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ (рдЕрдкрд▓реЛрдб) рдирд╣реАрдВ рд╣реЛрддреА, рддрдм рддрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛.
  2. рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЙрд╕реЗ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
  3. рдирддреАрдЬреЗ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА, рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рдЬрдирд░реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ.

рдЗрд╕рдХреЗ рд▓рд┐рдП, SequentialAgent рд╕рдмрд╕реЗ рд╕рд╣реА рд╣реИ. рдпрд╣ рдПрдХ рдПрдЬреЗрдВрдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреВрд╕рд░реЗ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ/рдЗрдирдкреБрдЯ рдХреЗ рддреМрд░ рдкрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ.

2. рдПрдЬреЗрдВрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА

рдЖрдЗрдП, рджреЗрдЦреЗрдВ рдХрд┐ multimedia_agent.py рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреИрд╕реЗ рдЕрд╕реЗрдВрдмрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/multimedia_agent.py

рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рдЪрд░рдгреЛрдВ рд╕реЗ рдЗрдирдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ. рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ORCHESTRATION рдвреВрдВрдвреЗрдВ. рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    sub_agents=[upload_agent, extraction_agent, spanner_agent, summary_agent]

3. рд░реВрдЯ рдПрдЬреЗрдВрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py

рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_SUBAGENT рдвреВрдВрдвреЗрдВ. рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    sub_agents=[multimedia_agent],

рдЗрд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЪрд╛рд░ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ" рдХреЛ рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдЗрдХрд╛рдИ рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

4. рдПрдЬреЗрдВрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдлрд╝реНрд▓реЛ

рд╣рд░ рдПрдЬреЗрдВрдЯ, рдЕрдкрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдиреНрдп рдПрдЬреЗрдВрдЯ рдЗрд╕ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

architecture_uploading

5. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ (рдЕрдЧрд░ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ)

ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:

cd ~/way-back-home/level_2/
./start_app.sh

ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

6. рдЯреЗрд╕реНрдЯ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

ЁЯСЙ рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХреЛрдИ рднреА рдлрд╝реЛрдЯреЛ рдЪреБрдиреЗрдВ рдФрд░ рдЙрд╕реЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ:

рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рдЦрд╛рд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:

Here is the survivor note

рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣рд╛рдВ рдЗрдореЗрдЬ рдЕрдЯреИрдЪ рдХрд░реЗрдВ.

upload_input

upload_result

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "Ctrl+C" рджрдмрд╛рдПрдВ.

6. GCS рдмрдХреЗрдЯ рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

  • Google Cloud Console Storage рдЦреЛрд▓реЗрдВ.
  • Cloud Storage рдореЗрдВ "рдмрдХреЗрдЯ" рдЪреБрдиреЗрдВ

gcs

  • рдЕрдкрдирд╛ рдмрдХреЗрдЯ рдЪреБрдиреЗрдВ рдФрд░ media рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

media

  • рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЗрдореЗрдЬ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ. uploaded_img

7. Spanner рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ (рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ)

рдпрд╣рд╛рдВ test_photo1 рдХреЗ рд▓рд┐рдП, рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

  • Google Cloud Console Spanner рдЦреЛрд▓реЗрдВ.
  • рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЪреБрдиреЗрдВ: Survivor Network
  • рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЪреБрдиреЗрдВ: graph-db
  • рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ, Spanner Studio рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

ЁЯСЙ Spanner Studio рдореЗрдВ, рдирдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░реЗрдВ:

SELECT 
  s.name AS Survivor,
  s.role AS Role,
  b.name AS Biome,
  r.name AS FoundResource,
  s.created_at
FROM Survivors s
LEFT JOIN SurvivorInBiome sib ON s.survivor_id = sib.survivor_id
LEFT JOIN Biomes b ON sib.biome_id = b.biome_id
LEFT JOIN SurvivorFoundResource sfr ON s.survivor_id = sfr.survivor_id
LEFT JOIN Resources r ON sfr.resource_id = r.resource_id
ORDER BY s.created_at DESC;

рд╣рдо рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдирддреАрдЬреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

spanner_verify

12. рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдмреИрдВрдХ

1. рдореЗрдореЛрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ

рдпрд╣ рд╕рд┐рд╕реНрдЯрдо, рджреЛ рддрд░рд╣ рдХреА рдореЗрдореЛрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ, рдпрд╣ рддреБрд░рдВрдд рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕рдордЭ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реАрдЦреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдпрд╛рдж рд░рдЦ рдкрд╛рддрд╛ рд╣реИ.

memory_bank

2. рдпрд╛рджреЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреНрдпрд╛ рд╣реЛрддреЗ рд╣реИрдВ?

рдпрд╛рдж рд░рдЦрдиреЗ рд▓рд╛рдпрдХ рд╡рд┐рд╖рдп, рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЙрди рдХреИрдЯрдЧрд░реА рдХреЛ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдХреЛ рд╕рднреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓рд┐рдВрдЧ рдХреИрдмрд┐рдиреЗрдЯ рдХреЗ рддреМрд░ рдкрд░ рд╕рдордЭреЗрдВ.

рд╣рдорд╛рд░реЗ рджреЛ рд╡рд┐рд╖рдп:

  1. search_preferences: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЦреЛрдЬрдирд╛ рдкрд╕рдВрдж рд╣реИ
    • рдХреНрдпрд╛ рд╡реЗ рдХреАрд╡рд░реНрдб рдпрд╛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ?
    • рд╡реЗ рдЕрдХреНрд╕рд░ рдХреМрдирд╕реА рд╕реНрдХрд┐рд▓/рдмрд╛рдпреЛрдо рдЦреЛрдЬрддреЗ рд╣реИрдВ?
    • рдпрд╛рджрджрд╛рд╢реНрдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг: "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рд╕реЗ рдЬреБрдбрд╝реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ"
  2. urgent_needs_context: рд╡реЗ рдХрд┐рди рд╕рдВрдХрдЯреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
    • рд╡реЗ рдХрд┐рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
    • рдЙрдиреНрд╣реЗрдВ рдХрд┐рди рдкреАрдбрд╝рд┐рддреЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИ?
    • рдореЗрдореЛрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг: "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЙрддреНрддрд░реА рдХреИрдВрдк рдореЗрдВ рджрд╡рд╛ рдХреА рдХрдореА рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ"

3. рдкреБрд░рд╛рдиреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╡рд┐рд╖рдп рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛

рдХрд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рд╕реЗ рдпрд╣ рддрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреНрдпрд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЛ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рддреЗ рд╕рдордп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/deploy_agent.py

рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдПрдбрд┐рдЯрд░ рдореЗрдВ ~/way-back-home/level_2/backend/deploy_agent.py рдЦреБрд▓ рдЬрд╛рддрд╛ рд╣реИ.

рд╣рдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ MemoryTopic рдСрдмреНрдЬреЗрдХреНрдЯ рддрдп рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдПрд▓рдПрд▓рдПрдо рдХреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдХреМрдирд╕реА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреА рд╣реИ рдФрд░ рд╕реЗрд╡ рдХрд░рдиреА рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ deploy_agent.py рдореЗрдВ, # TODO: SET_UP_TOPIC рдХреА рдЬрдЧрд╣ рдпрд╣ рдбрд╛рд▓реЗрдВ:

# backend/deploy_agent.py

    custom_topics = [
        # Topic 1: Survivor Search Preferences
        MemoryTopic(
            custom_memory_topic=CustomMemoryTopic(
                label="search_preferences",
                description="""Extract the user's preferences for how they search for survivors. Include:
                - Preferred search methods (keyword, semantic, direct lookup)
                - Common filters used (biome, role, status)
                - Specific skills they value or frequently look for
                - Geographic areas of interest (e.g., "forest biome", "mountain outpost")
                
                Example: "User prefers semantic search for finding similar skills."
                Example: "User frequently checks for survivors in the Swamp Biome."
                """,
            )
        ),
        # Topic 2: Urgent Needs Context
        MemoryTopic(
            custom_memory_topic=CustomMemoryTopic(
                label="urgent_needs_context",
                description="""Track the user's focus on urgent needs and resource shortages. Include:
                - Specific resources they are monitoring (food, medicine, ammo)
                - Critical situations they are tracking
                - Survivors they are particularly concerned about
                
                Example: "User is monitoring the medicine shortage in the Northern Camp."
                Example: "User is looking for a doctor for the injured survivors."
                """,
            )
        )
    ]

4. рдПрдЬреЗрдВрдЯ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди

рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЬреЗрдВрдЯ рдХреЛрдб рдХреЛ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py

рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдПрдбрд┐рдЯрд░ рдореЗрдВ ~/way-back-home/level_2/backend/agent/agent.py рдЦреБрд▓ рдЬрд╛рддрд╛ рд╣реИ.

рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛

рдПрдЬреЗрдВрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо after_agent_callback рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ. рдЗрд╕рд╕реЗ рдпрд╣ рдкрдХреНрдХрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рдж рд╕реЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗрд╡ рд╣реЛ рдЬрд╛рдПрдВ. add_session_to_memory рдлрд╝рдВрдХреНрд╢рди, рдЪреИрдЯ рдХреЗ рдЬрд╡рд╛рдм рдХреЛ рдзреАрдорд╛ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ.

ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_SESSION_MEMORY рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

async def add_session_to_memory(
        callback_context: CallbackContext
) -> Optional[types.Content]:
    """Automatically save completed sessions to memory bank in the background"""
    if hasattr(callback_context, "_invocation_context"):
        invocation_context = callback_context._invocation_context
        if invocation_context.memory_service:
            # Use create_task to run this in the background without blocking the response
            asyncio.create_task(
                invocation_context.memory_service.add_session_to_memory(
                    invocation_context.session
                )
            )
            logger.info("Scheduled session save to memory bank in background")

рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_MEMORY_BANK_TOOL рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

if USE_MEMORY_BANK:
    agent_tools.append(PreloadMemoryTool())

ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_CALLBACK рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:

    after_agent_callback=add_session_to_memory if USE_MEMORY_BANK else None

Vertex AI Session Service рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ chat.py рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

cloudshell edit ~/way-back-home/level_2/backend/api/routes/chat.py

ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_VERTEXAI_SERVICES рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

    session_service = VertexAiSessionService(
        project=project_id,
        location=location,
        agent_engine_id=agent_engine_id
    )
    memory_service = VertexAiMemoryBankService(
        project=project_id,
        location=location,
        agent_engine_id=agent_engine_id
    )

4. рд╕реЗрдЯрдЕрдк рдФрд░ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ

рдореЗрдореЛрд░реА рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдЬреЗрдВрдЯ рдХреЛ рдореЗрдореЛрд░реА рдХреЗ рдирдП рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛. рд╕рд╛рде рд╣реА, рдпрд╣ рдкрдХреНрдХрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ.

рд╣рдордиреЗ рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдИ рд╣реИ.

рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВ:

cd ~/way-back-home/level_2
./deploy_and_update_env.sh

рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпреЗ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рдХрд░рддреА рд╣реИ:

  • рдпрд╣ backend/deploy_agent.py рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдПрдЬреЗрдВрдЯ рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЛ Vertex AI рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ.
  • рдпрд╣ рдХреБрдХреА, рдирдП Agent Engine рдЖрдИрдбреА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреА рд╣реИ.
  • .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ AGENT_ENGINE_ID рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдиреЗ-рдЖрдк рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ.
  • рдпрд╣ рдХреБрдХреА рдкрдХреНрдХрд╛ рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрдкрдХреА .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ USE_MEMORY_BANK=TRUE рд╕реЗрдЯ рд╣реЛ.

[!IMPORTANT] рдЕрдЧрд░ рдЖрдкрдиреЗ deploy_agent.py рдореЗрдВ custom_topics рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛.

13. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреА рдорджрдж рд╕реЗ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЛрдИ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рд┐рдЦрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣ рд╕рднреА рд╕реЗрд╢рди рдореЗрдВ рдмрдиреА рд░рд╣рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ.

1. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ (рдЕрдЧрд░ рдЖрдкрдХрд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЪрд░рдг рдЫреЛрдбрд╝ рджреЗрдВ)

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ: рдЕрдЧрд░ рдкрд┐рдЫрд▓рд╛ рдЯрд░реНрдорд┐рдирд▓ рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ Ctrls+C рджрдмрд╛рдХрд░ рдЙрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.

ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:

cd ~/way-back-home/level_2/
./start_app.sh

ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

2. рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреА рдЯреЗрд╕реНрдЯрд┐рдВрдЧ

рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рдЦрд╛рд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:

"I'm planning a medical rescue mission in the mountains. I need survivors with first aid and climbing skills."

ЁЯСЙ рд▓рдЧрднрдЧ 30 рд╕реЗрдХрдВрдб рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдореЗрдореЛрд░реА рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рд╣реЛ рд╕рдХреЗ.

2. рдирдпрд╛ рд╕реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛

рдореМрдЬреВрджрд╛ рдмрд╛рддрдЪреАрдд рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ (рд╢реЙрд░реНрдЯ-рдЯрд░реНрдо рдореЗрдореЛрд░реА) рдХреЛ рдорд┐рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдЬ рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ.

рдРрд╕рд╛ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ:

"What kind of missions am I interested in?"

рдЕрдиреБрдорд╛рдирд┐рдд рдЬрд╡рд╛рдм:

"рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдмрд╛рддрдЪреАрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рдЗрди рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╣реИ:

  • рдореЗрдбрд┐рдХрд▓ рд░реЗрд╕реНрдХреНрдпреВ рдорд┐рд╢рди
  • рдкрд╣рд╛рдбрд╝реА/рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рдЗрд▓рд╛рдХреЛрдВ рдореЗрдВ рдСрдкрд░реЗрд╢рди
  • рдЬрд╝рд░реВрд░реА рд╕реНрдХрд┐рд▓: рдкреНрд░рд╛рдердорд┐рдХ рдЗрд▓рд╛рдЬ, рдЪрдврд╝рд╛рдИ

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрди рд╢рд░реНрддреЛрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдвреВрдБрдврдиреЗ рд╣реИрдВ?"

3. рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛

рдХреЛрдИ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкреВрдЫреЗрдВ:

remember this

рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХрд┐рд╕реА рдлрд╝реЛрдЯреЛ рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдиреА рдХреЛрдИ рдлрд╝реЛрдЯреЛ рдЪреБрдиреА рдЬрд╛ рд╕рдХрддреА рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

4. Vertex AI Agent Engine рдореЗрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

Google Cloud Console Agent Engine рдкрд░ рдЬрд╛рдПрдВ

  1. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд╕рдмрд╕реЗ рдКрдкрд░ рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рд▓реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдирд╛ рд╣реЛ:рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рд▓реЗрдХреНрдЯрд░
  2. рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдХрдорд╛рдВрдб рд╕реЗ рдЬреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдЕрднреА рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ use_memory_bank.sh:рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрдирдЖрдкрдиреЗ рдЕрднреА рдЬреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдмрдирд╛рдпрд╛ рд╣реИ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
  3. рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдП рдЧрдП рдЗрд╕ рдПрдЬреЗрдВрдЯ рдореЗрдВ, Memories рдЯреИрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рднреА рдпрд╛рджреЗрдВ рджрд┐рдЦреЗрдВрдЧреА.рдпрд╛рджреЗрдВ рджреЗрдЦрдирд╛

ЁЯСЙЁЯТ╗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ "Ctrl + C" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

ЁЯОЙ рдмрдзрд╛рдИ рд╣реЛ! рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреЛ рдЕрдкрдиреЗ рдПрдЬреЗрдВрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ!

14. Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ

1. рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛

ЁЯСЙЁЯТ╗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВ:

cd ~/way-back-home/level_2
./deploy_cloud_run.sh

рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпреВрдЖрд░рдПрд▓ рдорд┐рд▓реЗрдЧрд╛. рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреВрдЖрд░рдПрд▓ рд╣реИ! рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЧрдпрд╛

ЁЯСЙЁЯТ╗ рдпреВрдЖрд░рдПрд▓ рдкрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЕрдиреБрдорддрд┐ рджреЗрдВ:

source .env && gcloud run services add-iam-policy-binding survivor-frontend --region $REGION --member=allUsers --role=roles/run.invoker && gcloud run services add-iam-policy-binding survivor-backend --region $REGION --member=allUsers --role=roles/run.invoker

рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдкрд░ рдЬрд╛рдПрдВ. рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдЗрд╡ рджрд┐рдЦреЗрдЧрд╛!

2. рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА

cloudbuild.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдХреНрд░рдо рд╕реЗ рдЗрди рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. Backend Build: backend/Dockerfile рд╕реЗ Docker рдЗрдореЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ.
  2. рдмреИрдХрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдмреИрдХрдПрдВрдб рдХрдВрдЯреЗрдирд░ рдХреЛ Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
  3. рдпреВрдЖрд░рдПрд▓ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдирдпрд╛ рдмреИрдХрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдорд┐рд▓рддрд╛ рд╣реИ.
  4. рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдмрд┐рд▓реНрдб:
    • рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ.
    • рдпрд╣ React рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ VITE_API_URL= рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ.
  5. рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдЗрдореЗрдЬ: рдпрд╣ frontend/Dockerfile рд╕реЗ Docker рдЗрдореЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ (рд╕реНрдЯреИрдЯрд┐рдХ рдРрд╕реЗрдЯ рдХреЛ рдкреИрдХреЗрдЬ рдХрд░рддрд╛ рд╣реИ).
  6. рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдХрдВрдЯреЗрдирд░ рдбрд┐рдкреНрд▓реЙрдп рд╣реЛрддрд╛ рд╣реИ.

3. рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

рдмрд┐рд▓реНрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдорд┐рд▓реЗ рд▓реЙрдЧ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ), рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

  1. Cloud Run Console рдкрд░ рдЬрд╛рдПрдВ.
  2. survivor-frontend рд╕реЗрд╡рд╛ рдвреВрдВрдвреЗрдВ.
  3. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреВрдЖрд░рдПрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
  4. рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдПрдВ, рддрд╛рдХрд┐ рдпрд╣ рдкрдХреНрдХрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рдмреИрдХрдПрдВрдб рд╕реЗ рдХрдореНрдпреВрдирд┐рдХреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.

4. (!рд╕рд┐рд░реНрдлрд╝ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП) рдЕрдкрдиреА рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВ:

cd ~/way-back-home/level_2
./set_level_2.sh

рдЕрдм waybackhome.dev рдЦреЛрд▓реЗрдВ. рдЖрдкрдХреЛ рджрд┐рдЦреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреА рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рд╣реЛ рдЧрдИ рд╣реИ. рд▓реЗрд╡рд▓ 2 рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдзрд╛рдИ!

рдЖрдЦрд┐рд░реА рдирддреАрдЬрд╛

(рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ) 5. рдореИрдиреНрдпреБрдЕрд▓ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ

рдЕрдЧрд░ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рд╣реИрдВ рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдирд╛ рд╣реИ, рддреЛ cloudbuild.yaml рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

cloudbuild.yaml рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

cloudbuild.yaml рдлрд╝рд╛рдЗрд▓ рд╕реЗ, Google Cloud Build рдХреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреМрдирд╕реЗ рдЪрд░рдг рдкреВрд░реЗ рдХрд░рдиреЗ рд╣реИрдВ.

  • steps: рдХреНрд░рдо рд╕реЗ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреА рд╕реВрдЪреА. рд╣рд░ рдЪрд░рдг, рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ. рдЬреИрд╕реЗ, docker, gcloud, node, bash).
  • substitutions: рдРрд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдб рдЯрд╛рдЗрдо рдкрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, $_REGION).
  • workspace: рдпрд╣ рдПрдХ рд╢реЗрдпрд░ рдХреА рдЧрдИ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рд╣реЛрддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдЪрд░рдг, рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢реЗрдпрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рд╣рдо backend_url.txt рд╢реЗрдпрд░ рдХрд░рддреЗ рд╣реИрдВ.

рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдЪрд▓рд╛рдирд╛

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд┐рдирд╛ рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, gcloud builds submit рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЬрд╝рд░реВрд░реА рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡реИрд▓реНрдпреВ рдкрд╛рд╕ рдХрд░рдиреА рд╣реЛрдЧреА.

# Load your env vars first or replace these values manually
export PROJECT_ID=your-project-id
export REGION=us-central1

gcloud builds submit --config cloudbuild.yaml \
    --project "$PROJECT_ID" \
    --substitutions _REGION="us-central1",_GOOGLE_API_KEY="",_AGENT_ENGINE_ID="your-agent-id",_USE_MEMORY_BANK="TRUE",_GOOGLE_GENAI_USE_VERTEXAI="TRUE"

15. рдирддреАрдЬрд╛

1. рдЖрдкрдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИ

тЬЕ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕: рдиреЛрдб (рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рдХреМрд╢рд▓) рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ (рд╕рдВрдмрдВрдз) рдХреЗ рд╕рд╛рде Spanner
тЬЕ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛: рдХреАрд╡рд░реНрдб, рд╕рд┐рдореИрдВрдЯрд┐рдХ, рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбрд┐рдВрдЧ
тЬЕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди: Gemini рдХреА рдорджрдж рд╕реЗ рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛
тЬЕ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо: ADK рдХреЗ рд╕рд╛рде рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ
тЬЕ рдореЗрдореЛрд░реА рдмреИрдВрдХ: Vertex AI рдХреА рдорджрдж рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд┐рдЬреАрдХрд░рдг рдХрд░рдирд╛
тЬЕ рдкреНрд░реЛрдбрдХреНрд╢рди рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ: Cloud Run + Agent Engine

2. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

architecture_fullstack

3. рдореБрдЦреНрдп рдмрд╛рддреЗрдВ

  1. рдЧреНрд░рд╛рдлрд╝ рдЖрд░рдПрдЬреА: рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЦреЛрдЬ рдХреА рдЬрд╛ рд╕рдХреЗ
  2. рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдкреИрдЯрд░реНрди: рдЬрдЯрд┐рд▓ рдФрд░ рдХрдИ рдЪрд░рдгреЛрдВ рд╡рд╛рд▓реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди
  3. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдПрдЖрдИ: рдЕрдирд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдореАрдбрд┐рдпрд╛ (рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ) рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛
  4. рд╕реНрдЯреЗрдЯрдлрд╝реБрд▓ рдПрдЬреЗрдВрдЯ: Memory Bank рдХреА рдорджрдж рд╕реЗ, рд╕рднреА рд╕реЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

4. рд╡рд░реНрдХрд╢реЙрдк рдХрд╛ рдХреЙрдиреНрдЯреЗрдВрдЯ

5. рд╕рдВрд╕рд╛рдзрди