æ¬èšäºã§ã¯ãGoogle Maps API ããååŸããã©ãŒã¡ã³åºã®ã¯ãã³ãããŒã¿ã«å¯Ÿããå®éåæææ³ãã玹ä»ããŸãã åŸæ¥ã® BigQuery ã«ããææ
åæã®æçšæ§ãèžãŸãã€ã€ãGemini 1.5 Pro ã®å°å
¥ã«ãã£ãŠå¯èœãšãªã£ããããæè»ãªããŒã¿ã®æ§é åãç¹å®ã¿ã¹ã¯ã®å®è¡æ¹æ³ã解説ããŸãã åæã®èæ¯ãšç®ç å¯èŠåã€ã¡ãŒãž åæã®æµããšã¢ãŒããã¯ã㣠ã¯ãã³ãããŒã¿ååŸãš BigQuery ãžã®ä¿å API ããŒã®ååŸ ããŒã¿ååŸã®ãµã³ãã«ã³ãŒã ã¯ãã³ãæ°ã®å¶éãšç·©åç æé ææ
åæãšããŒã¿ãã€ãã©ã€ã³ Dataform ã®å©ç¹ Dataform ã䜿ã£ãææ
åæã®ãã€ãã©ã€ã³å®çŸ©äŸ ææ
åæã®çµæè§£é ML.GENERATE_TEXTïŒGemini 1.5 ProïŒ é¢æ°ã䜿çšããé«åºŠãªåæ ãŠãŒã¹ã±ãŒã¹ã«å¿ããç¬èªã®è©äŸ¡èгç¹ã«ããã¯ãã³ãã®å®éå ã¯ãã³ãã«å¯Ÿããèªåè¿ä¿¡æäœæ åæã®èæ¯ãšç®ç è¿å¹Žã1 to 1 ããŒã±ãã£ã³ã°ã顧客åæã®éèŠæ§ãé«ãŸã£ãŠããŸãããããããã¹ãŠã®é¡§å®¢ããçŽæ¥ææ³ãèãã®ã¯çŸå®çã§ã¯ãããŸãããããã§æ³šç®ããã®ããGoogle Maps ã«èªçºçã«æçš¿ãããã¯ãã³ãããŒã¿ã§ãã ã¯ãã³ãåæã®äž»ãªç®çã¯ä»¥äžã®éãã§ãã ç®ç äŸ é¡§å®¢æºè¶³åºŠã®åäžãšè£œåæ¹å ã©ãŒã¡ã³åºã®ã¯ãã³ãã§ã麺ãæãããããããšãã声ãå€ãå Žåãè¹ã§æéã®èª¿æŽãæ€èšã ç«¶ååæãšåžå Žããžã·ã§ãã³ã°ã®æé©å ç«¶ååºãšã®æ¯èŒã§ãäŸ¡æ Œãé«ãããšããææãå€ãå ŽåãäŸ¡æ ŒæŠç¥ã®èŠçŽããä»å 䟡å€ã®èšŽæ±ãæ€èšã 广çãªããŒã±ãã£ã³ã°æœçã®ç«æ¡ãšè©äŸ¡ ãåé£ãã§ãå©çšããããããšããã¯ãã³ããå¢å åŸåã«ããå Žåããã¡ããªãŒåããã£ã³ããŒã³ã®åŒ·åãæ€èšã ãã¬ã³ãã®æ©æçºèŠãšè¿
éãªå¯Ÿå¿ ããŽã£ãŒã¬ã³ã¡ãã¥ãŒã欲ããããšããå£°ãæ¥å¢ããå Žåãæ°ã¡ãã¥ãŒã®éçºãè¿
éã«è¡ãã ããžãã¹ææšãšã®çžé¢åæã«ããæŠç¥ç«æ¡ ã¯ãã³ãã®è©äŸ¡ãé«ãåºèã»ã©å£²äžãé«ããšããçžé¢ãèŠãããå Žåãåªè¯åºèã®æœçãä»åºèã«å±éã å¯èŠåã€ã¡ãŒãž ã¯ãã³ãããŒã¿ã®ææ
åæãã«ããŽãªã»ããŒã¯ãŒãåæã¯ä»¥åããæããŸããããçæ AI æè¡ã®çºå±ã«ãã£ãŠãããèªç±ã«éæ§é åããŒã¿ãæ§é åããŒã¿ã«å€ããããæ¢åã®ååãå¶æ¥ã販売çã®ããŒã¿ãšæãåãããŠåæã§ããç¹ããã€ã³ãã§ãã ã¯ãã³ãã®ãã¬ããžãé »åºŠãå°å³äžã«ãããã ã«ããŽãªããšã®ãã¬ããžãã¯ãã³ãã¹ã³ã¢ãšã¬ã€ãã£ã³ã°ã®æç³»åæ¯èŒ ã«ããŽãªããšã®ãã¬ããžãšææ
匷床 åæã®æµããšã¢ãŒããã¯ã㣠ä»åã®æ€èšŒã®åæã®æµããšã¢ãŒããã¯ãã£ã¯ä»¥äžã®ãšããã§ãã Google Maps API ããã¯ãã³ãããŒã¿ãååŸ BigQuery ã«ä¿å BigQuery ã®ãªã¢ãŒã颿°ã§ææ
åæ & çæ AI ã«ãã倿§ãªèªç¶èšèªè§£æïŒâ» Dataform ã§ããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ïŒ BI ããŒã«ïŒLooker Studio çïŒã§å¯èŠå åæã®æµããšã·ã¹ãã ã¢ãŒããã¯ã㣠ã¯ãã³ãããŒã¿ååŸãš BigQuery ãžã®ä¿å Google Maps API ã䜿çšããŠã¯ãã³ãããŒã¿ãååŸããBigQuery ã«ä¿åããæ¹æ³ã説æããŸãã API ããŒã®ååŸ Google Map API ã®äžãããPlaces APIãã䜿çšããŠããŸããGoogle Cloud ãããžã§ã¯ãã§ API ã®æå¹åãš API ããŒã®ååŸãå¿
èŠãªãããæé ã¯ä»¥äžãåç
§ããŠãã ããã åè : Places API ã§ API ããŒã䜿çšãã ããŒã¿ååŸã®ãµã³ãã«ã³ãŒã 以äžã¯ãPython ã䜿çšãããµã³ãã«ã³ãŒãã§ããïŒ Colab ã§å®è¡å¯èœã§ãïŒ 1. ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« !pip install googlemaps>= 4.10 . 0 google-cloud-bigquery>= 3.2 . 5 2. èªèšŒåŠç from google.colab import auth import google.auth auth.authenticate_user() credentials, _ = google.auth.default() 3. Google Map API ã䜿ã£ãŠãã¯ãã³ãããŒã¿ãååŸããBigQuery ã«ã¢ããããŒã 以äžã§ã¯ããæ±äº¬éœå代ç°åºïŒ(35.68093847942352, 139.76703854373777)ïŒããããååŸ 1,000 ã¡ãŒãã«ã以å
ã§ãã©ãŒã¡ã³ããšããæ€çŽ¢ããŒã¯ãŒãã«ãããããå Žæã®æ
å ±ããããã«çŽã¥ãã¯ãã³ãæ
å ±ãååŸããŠããŸãã import googlemaps from google.cloud import bigquery from datetime import datetime import pandas as pd class GoogleMapsReviewFetcher : def __init__ (self, api_key, project_id, dataset_id, table_id): # Google Maps API ã¯ã©ã€ã¢ã³ãã®åæå self.gmaps_client = googlemaps.Client(key=api_key) # BigQuery ã¯ã©ã€ã¢ã³ãã®åæå self.bq_client = bigquery.Client(project=project_id) # BigQuery ã®ããŒã¿ã»ãã ID ãšããŒãã« ID ãä¿å self.dataset_id = dataset_id self.table_id = table_id def fetch_reviews (self, keyword, location, radius): reviews = [] # Google Maps Places API ã䜿çšããŠãæå®ãããæ¡ä»¶ã§å Žæãæ€çŽ¢ places_result = self.gmaps_client.places_nearby( location=location, # æ€çŽ¢ã®äžå¿äœçœ®ïŒç·¯åºŠãçµåºŠïŒ radius=radius, # æ€çŽ¢ç¯å²ïŒã¡ãŒãã«ïŒ keyword=keyword, # æ€çŽ¢ããŒã¯ãŒã language= 'ja' # çµæã®èšèªãæ¥æ¬èªã«èšå® ) # æ€çŽ¢çµæã®åå Žæã«ã€ããŠè©³çްæ
å ±ãååŸ for place in places_result[ 'results' ]: # å Žæã®è©³çްæ
å ±ãååŸ place_details = self.gmaps_client.place(place_id=place[ 'place_id' ], language= 'ja' ) spot_name = place_details[ 'result' ].get( 'name' ) location_lat = place_details[ 'result' ][ 'geometry' ][ 'location' ][ 'lat' ] location_lng = place_details[ 'result' ][ 'geometry' ][ 'location' ][ 'lng' ] # åå Žæã®ã¬ãã¥ãŒãåŠç for review in place_details[ 'result' ].get( 'reviews' , []): reviews.append({ 'spot_name' : spot_name, 'author' : review.get( 'author_name' ), 'rating' : review.get( 'rating' ), 'text' : review.get( 'text' ), 'time' : datetime.fromtimestamp(review.get( 'time' )), 'relative_time_description' : review.get( 'relative_time_description' ), 'location' : f "POINT({location_lng} {location_lat})" # 緯床çµåºŠã GEOGRAPHY åã® POINT 圢åŒã§ä¿å }) return reviews def save_to_bigquery (self, reviews): # ã¬ãã¥ãŒããŒã¿ã Pandas DataFrame ã«å€æ df = pd.DataFrame(reviews) # BigQuery ã®ããŒãã«åç
§ãäœæ table_ref = self.bq_client.dataset(self.dataset_id).table(self.table_id) # BigQuery ãžã®ããŒã¿æžã蟌ã¿èšå® job_config = bigquery.LoadJobConfig( schema=[ bigquery.SchemaField( "spot_name" , "STRING" ), bigquery.SchemaField( "author" , "STRING" ), bigquery.SchemaField( "rating" , "FLOAT" ), bigquery.SchemaField( "text" , "STRING" ), bigquery.SchemaField( "time" , "TIMESTAMP" ), bigquery.SchemaField( "relative_time_description" , "STRING" ), bigquery.SchemaField( "location" , "GEOGRAPHY" ) ], write_disposition= "WRITE_TRUNCATE" # ããŒãã«ãäžæžã ) # DataFrame ã BigQuery ã«ã¢ããããŒã job = self.bq_client.load_table_from_dataframe(df, table_ref, job_config=job_config) job.result() # ãžã§ãã®å®äºãåŸ
〠print (f "Loaded {len(reviews)} reviews into {self.dataset_id}.{self.table_id}" ) if __name__ == "__main__" : # èšå®æ
å ± API_KEY = 'äžèšã§ååŸãã API ããŒ' # Google Maps API ã㌠PROJECT_ID = 'project_id' # Google Cloud ãããžã§ã¯ã ID DATASET_ID = 'google_maps_review_analysis' # BigQuery ã®ããŒã¿ã»ãã ID TABLE_ID = 'reviews' # BigQuery ã®ããŒãã« ID # æ€çŽ¢ãã©ã¡ãŒã¿ KEYWORD = "ã©ãŒã¡ã³" # æ€çŽ¢ããŒã¯ãŒã LOCATION = ( 35.68093847942352 , 139.76703854373777 ) # æ€çŽ¢ã®äžå¿äœçœ®ïŒç·¯åºŠãçµåºŠïŒ RADIUS = 1000 # æ€çŽ¢ç¯å²ïŒã¡ãŒãã«ïŒ # GoogleMapsReviewFetcher ã®ã€ã³ã¹ã¿ã³ã¹ãäœæ fetcher = GoogleMapsReviewFetcher(API_KEY, PROJECT_ID, DATASET_ID, TABLE_ID) # ã¬ãã¥ãŒãååŸ reviews = fetcher.fetch_reviews(KEYWORD, LOCATION, RADIUS) # ååŸããã¬ãã¥ãŒã BigQuery ã«ä¿å fetcher.save_to_bigquery(reviews) BigQuery ãžã®æ ŒçŽçµæã¯ä»¥äžã®ãšããã§ãã ã¯ãã³ãããŒã¿ã®æ ŒçŽçµæïŒBigQueryïŒ ã¯ãã³ãæ°ã®å¶éãšç·©åç ãPlaces APIãã¯äžã€ã®å Žæã§æå€§5ä»¶ããã¯ãã³ããååŸã§ããªãå¶çŽããããŸãããã®å Žæã®ãªãŒããŒã§ããã°ããBusiness Profile APIãã«ç»é²ããããšã§ããã¹ãŠã®ã¯ãã³ããååŸã§ãããšãããŠããŸãããåœç€Ÿã§ã¯æªæ€èšŒã§ãã 詳现ã¯ä»¥äžãåç
§ããŠãã ããã åè : ãã¹ãŠã®ã¯ãã³ãã®äžèЧãååŸãã æé API ãªã¯ãšã¹ãã«ã¯æéãçºçããããæ³šæãå¿
èŠã§ããçè
ã®ãµã³ãã«ã³ãŒãã§ã¯ã1ä»¶ã®ã¯ãã³ãã§ã0.87åããšãªããŸãããè©³çŽ°ãªæéäœç³»ã«ã€ããŠã¯ä»¥äžãåç
§ããŠãã ããã åè : Places API ã®äœ¿çšéãšè«æ±é¡ ææ
åæãšããŒã¿ãã€ãã©ã€ã³ Dataform ã䜿çšã㊠BigQuery äžã«ããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ããææ
åæãè¡ããŸãã Dataform ã®å©ç¹ Dataform ã¯ãBigQuery ã䜿çšããããŒã¿åæãæ©æ¢°åŠç¿ã®ã¯ãŒã¯ãããŒãå¹çåããããŒã«ã§ãã以äžã®ç¹ã§ç¹ã«æçšã§ãã BigQuery ã®å€æ§ãªåææ©èœããã«æŽ»çš BigQuery MLïŒåŸæ¥ã®æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã䜿çšå¯èœ ãªã¢ãŒã颿°ïŒå€éšãµãŒãã¹ãšã®é£æºã容æ ãªããžã§ã¯ãããŒãã«ïŒæ§é åãããŠããªãããŒã¿ã®åŠçãå¯èœ çæ AIïŒææ°ã® AI æè¡ã BigQuery å
ã§çŽæ¥å©çšå¯èœ è€éãªåŠçã®ç°¡çŽ å é·ãããŒã¿ãã€ãã©ã€ã³ãè€éãªåŠçãããŒãå¹ççã«ç®¡ç SQL ããŒã¹ã®æäœã§ãè€éãªåŠçãçŽæçã«èšè¿°å¯èœ ã³ã¹ãåæž å®è£
ã³ã¹ãã®äœæžïŒè€éãªåŠçãç°¡åã«æ§ç¯å¯èœ éçšä¿å®ã³ã¹ãã®åæžïŒäžå
管çã«ããä¿å®æ§ã®åäž éçºããæ¬çªç°å¢ãžã®åæ»ãªç§»è¡ PoCïŒæŠå¿µå®èšŒïŒæ®µéã§äœæããã¯ãšãªããæ¬çªç°å¢ã®ãã€ãã©ã€ã³ã«å®¹æã«çµ±åå¯èœ ãããã®å©ç¹ã«ãããDataform ã¯ç¹ã«è€éãªããŒã¿åæãããžã§ã¯ããäžãå€§èŠæš¡ãªããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯ã«é©ããŠããŸããããŒã¿åæã®å¹çãšå質ãåäžããããå Žåã«ã匷åãªããŒã«ãšãªããŸãã 詳现ã¯åŒç€Ÿããã°èšäºããåç
§ãã ããã blog.g-gen.co.jp Dataform ã䜿ã£ãææ
åæã®ãã€ãã©ã€ã³å®çŸ©äŸ 以äžã¯ãDataform ã䜿ã£ãææ
åæã®ãã€ãã©ã€ã³å®çŸ©äŸã§ãã -- Dataform èšå®ïŒçµæãä¿åããããŒãã«ã®å®çŸ© config { type : " table " , schema: " google_maps_review_analysis " , name: " reviews_sentiment " , description: " ã¯ãã³ãã®ææ
åæçµæ " } -- ææ
åæãå®è¡ããçµæãæŽåœ¢ WITH analyzed_data AS ( SELECT r.*, -- å
ã®ã¯ãã³ãããŒã¿ã®ãã¹ãŠã®åãéžæ t.ml_understand_text_result, -- ææ
åæã®çã®çµæãå«ã JSON_EXTRACT_ARRAY(t.ml_understand_text_result, ' $.sentences ' ) AS sentences, -- ææ
åæçµæã® sentences é
åãæœåº -- JSON 圢åŒã®çµæããææ
ã¹ã³ã¢ãæœåºïŒ-1ãã1ã®ç¯å²ãè² ã®å€ã¯ãã¬ãã£ããæ£ã®å€ã¯ããžãã£ãïŒ CAST (JSON_EXTRACT_SCALAR(t.ml_understand_text_result, ' $.document_sentiment.score ' ) AS FLOAT64) AS document_sentiment_score, -- JSON 圢åŒã®çµæããææ
ã®åŒ·ããæœåºïŒ0以äžã®å€ã倧ããã»ã©ææ
ã匷ãïŒ CAST (JSON_EXTRACT_SCALAR(t.ml_understand_text_result, ' $.document_sentiment.magnitude ' ) AS FLOAT64) AS document_sentiment_magnitude FROM ${ref( " reviews " )} AS r -- reviews ããŒãã«ãåç
§ JOIN ( -- BigQuery ã®èªç¶èšèªåŠçã¢ãã«ã䜿çšããŠææ
åæãå®è¡ SELECT text_content, -- ããã¹ãããŒã¿ ml_understand_text_result -- ææ
åæã®çã®çµæ FROM ML.UNDERSTAND_TEXT( MODEL `project_id.google_maps_review_analysis.nlp`, -- 䜿çšããèªç¶èšèªåŠçã¢ãã« ( SELECT text AS text_content FROM ${ref( " reviews " )}), -- åæå¯Ÿè±¡ã®ããã¹ã STRUCT( ' ANALYZE_SENTIMENT ' AS nlu_option) -- ææ
åæãªãã·ã§ã³ãæå® ) ) AS t ON r.text = t.text_content -- ããã¹ããåºæºã« JOIN ), -- æçµçãªçµæã»ãããéžæããäžéããŒãã«ã«ä¿å intermediate_results AS ( SELECT r.spot_name, -- ã¹ãããå r.author, -- èè
r.rating, -- è©äŸ¡ r.text, -- ã¯ãã³ãããã¹ã r.time, -- ã¯ãã³ãæçš¿æé r.relative_time_description, -- ã¯ãã³ãæçš¿ã®çžå¯Ÿæé r.location, -- ã¯ãã³ãã®äœçœ®æ
å ± r.text AS `original_input`, -- å
ã®å
¥åããã¹ã r.document_sentiment_score, -- ããã¥ã¡ã³ãå
šäœã®ææ
ã¹ã³ã¢ r.document_sentiment_magnitude, -- ããã¥ã¡ã³ãå
šäœã®ææ
ã®åŒ·ã -- åæã®ããã¹ãå
容 JSON_EXTRACT_SCALAR(sentence, ' $.text.content ' ) AS sentence_text, -- åæã®ææ
ã¹ã³ã¢ CAST (JSON_EXTRACT_SCALAR(sentence, ' $.sentiment.score ' ) AS FLOAT64) AS sentence_sentiment_score, -- åæã®ææ
ã®åŒ·ã CAST (JSON_EXTRACT_SCALAR(sentence, ' $.sentiment.magnitude ' ) AS FLOAT64) AS sentence_sentiment_magnitude FROM analyzed_data AS r, UNNEST(r.sentences) AS sentence -- sentences é
åãå±é ) -- äžéããŒãã«ããæçµçãªçµæã»ãããéžæ SELECT * FROM intermediate_results Dataform ãžã§ãã®åºåçµæã¯ä»¥äžã®ãšããã§ãã Dataform ãžã§ãã®åºåçµæ ææ
åæã®çµæè§£é ãã®ã¯ãšãªã§ã¯ãBigQuery ã®æ©æ¢°åŠç¿ã¢ãã« ML.UNDERSTAND_TEXT ã䜿çšããŠææ
åæãè¡ã£ãŠããŸããçµæã¯ä»¥äžã®2ã€ã®å€ãšããŠè¿ãããŸãã sentiment_score ïŒ-1 ãã 1 ã®ã¹ã³ã¢ã§ãææ
ã®è¯å®ç/åŠå®çãªåºŠåãã衚ããŸãã sentiment_magnitude ïŒææ
ã®åŒ·ãã衚ããŸãã ãããã®å€ãçµã¿åãããããšã§ãã¯ãã³ãã®ææ
çãªç¹åŸŽãåæããããšãã§ããŸãã ML.GENERATE_TEXTïŒGemini 1.5 ProïŒ é¢æ°ã䜿çšããé«åºŠãªåæ BigQuery ã® ML.GENERATE_TEXT 颿°ã¯ãããã¹ãçæãé«åºŠãªãã«ãã¢ãŒãã«ã¿ã¹ã¯ãå®è¡ããããã®åŒ·åãªããŒã«ã§ãã詳现ãªã»ããã¢ããæ¹æ³ã«ã€ããŠã¯ä»¥äžããåç
§ãã ããã åè : ML.GENERATE_TEXT 颿°ã䜿çšããŠããã¹ããçæãã 以äžã®èšäºã§ã¯ BigQuery ML ã®åºæ¬ã解説ããŠããŸãã®ã§ããåç
§ãã ããã blog.g-gen.co.jp ãŠãŒã¹ã±ãŒã¹ã«å¿ããç¬èªã®è©äŸ¡èгç¹ã«ããã¯ãã³ãã®å®éå 以äžã¯ãã¯ãã³ããããå³ããæäŸã¹ããŒãããäŸ¡æ Œããåºã®é°å²æ°ãããã®ä»ããäžæ®µéè©äŸ¡ã§æœåºããã¯ãšãªã§ãã config { type : " table " , schema: " google_maps_review_analysis " , name: " reviews_generate_text_analysis " } -- ã¯ãã³ãããŒã¿ãæºåããAI ã¢ãã«ã«æž¡ãããã®ããã³ãããäœæãã WITH review_data AS ( SELECT spot_name, -- åºå author, -- ã¯ãã³ãã®æçš¿è
text, -- ã¯ãã³ãã®å
容 rating, -- åºã®è©äŸ¡ CONCAT ( ' 以äžã®ã©ãŒã¡ã³åºã ' , spot_name, ' ãã®ã¯ãã³ãã«åºã¥ããŠãæ¬¡ã®æ
å ±ã JSON 圢åŒã§æœåºããŠãã ããïŒ ' , ' å³ïŒè¯ããæ®éãæªããäžæïŒãæäŸã¹ããŒãïŒéããæ®éãé
ããäžæïŒãäŸ¡æ ŒïŒé«ããæ®éãå®ããäžæïŒãåºã®é°å²æ°ïŒè¯ããæ®éãæªããäžæïŒããã®ä»ïŒè¯ããæ®éãæªããäžæïŒã ' , ' ããããã®èгç¹ãç·åè©äŸ¡ïŒ ' , rating, ' ïŒã«ã©ã®ããã«é¢é£ããŠããããèæ
®ããŠãã ããã ' , ' ã¯ãã³ã: " ' , text, ' " ' , ' ãã©ãŒãããã¯{"å³": "è¯ã", "æäŸã¹ããŒã": "éã", "äŸ¡æ Œ": "é«ã", "åºã®é°å²æ°": "äžæ", "ãã®ä»": "è¯ã"}ã ' ) AS prompt -- AIã¢ãã«ã«æž¡ãããã®ããã³ãã FROM ${ref( " reviews " )} ) -- AI ã¢ãã«ã䜿çšããŠãããã³ããã«åºã¥ããŠæ
å ±ãæœåºãã SELECT r.spot_name, -- åºå r.author, -- ã¯ãã³ãã®æçš¿è
r.text, -- ã¯ãã³ãã®å
容 r.rating, -- åºã®è©äŸ¡ JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.å³ ' ) AS flavor_text, -- å³ã«é¢ããæ
å ± JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.æäŸã¹ããŒã ' ) AS service_speed_text, -- æäŸã¹ããŒãã«é¢ããæ
å ± JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.äŸ¡æ Œ ' ) AS price_text, -- äŸ¡æ Œã«é¢ããæ
å ± JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.åºã®é°å²æ° ' ) AS atmosphere_text, -- åºã®é°å²æ°ã«é¢ããæ
å ± JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.ãã®ä» ' ) AS other_text, -- ãã®ä»ã«é¢ããæ
å ± -- å芳ç¹ã«å¯Ÿããã¹ã³ã¢ãèšç®ãã CASE JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.å³ ' ) WHEN ' è¯ã ' THEN 3 WHEN ' æ®é ' THEN 2 WHEN ' æªã ' THEN 1 ELSE NULL END AS flavor_score, -- å³ã®ã¹ã³ã¢ CASE JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.æäŸã¹ããŒã ' ) WHEN ' éã ' THEN 3 WHEN ' æ®é ' THEN 2 WHEN ' é
ã ' THEN 1 ELSE NULL END AS service_speed_score, -- æäŸã¹ããŒãã®ã¹ã³ã¢ CASE JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.äŸ¡æ Œ ' ) WHEN ' é«ã ' THEN 1 WHEN ' æ®é ' THEN 2 WHEN ' å®ã ' THEN 3 ELSE NULL END AS price_score, -- äŸ¡æ Œã®ã¹ã³ã¢ CASE JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.åºã®é°å²æ° ' ) WHEN ' è¯ã ' THEN 3 WHEN ' æ®é ' THEN 2 WHEN ' æªã ' THEN 1 ELSE NULL END AS atmosphere_score, -- åºã®é°å²æ°ã®ã¹ã³ã¢ CASE JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.ãã®ä» ' ) WHEN ' è¯ã ' THEN 3 WHEN ' æ®é ' THEN 2 WHEN ' æªã ' THEN 1 ELSE NULL END AS other_score -- ãã®ä»ã®ã¹ã³ã¢ FROM review_data r LEFT JOIN ML.GENERATE_TEXT( MODEL `project_id.google_maps_review_analysis.gemini_1_5_pro`, -- 䜿çšããAIã¢ãã« ( SELECT prompt FROM review_data), -- ããã³ãããAIã¢ãã«ã«æž¡ã STRUCT( 0.1 AS temperature, -- åºåã®ã©ã³ãã æ§ãå¶åŸ¡ãã 1000 AS max_output_tokens, -- åºåã®æå€§ããŒã¯ã³æ° 0.1 AS top_p, -- ãã¥ãŒã¯ãªã¢ã¹ãµã³ããªã³ã°ã®ãã©ã¡ãŒã¿ 10 AS top_k, -- ãããKãã£ã«ã¿ãªã³ã°ã§ä¿æããæãé«ã確çã®èªåœããŒã¯ã³æ° TRUE AS flatten_json_output -- JSONåºåããã©ããã«ãã ) ) AS t ON r.prompt = t.prompt -- ããã³ãããåºã«AIã¢ãã«ããã®çæçµæãçµå çæçµæã¯ä»¥äžã®ãšããã§ãã ç¬èªã®èгç¹ã§ã¯ãã³ããè©äŸ¡ ã¯ãã³ãã«å¯Ÿããèªåè¿ä¿¡æäœæ ã¯ãã³ãã«å¯Ÿããåºé·ããã®è¿ä¿¡æãèªåçæããããã«ããŸãã config { type : " table " , schema: " google_maps_review_analysis " , name: " reviews_manager_responses " } -- Step 1: ã¯ãã³ãããŒã¿ãæºåããAI ã¢ãã«ã«æž¡ãããã®ããã³ãããäœæãã WITH review_data AS ( SELECT spot_name, -- åºå author, -- ã¯ãã³ãã®æçš¿è
text, -- ã¯ãã³ãã®å
容 rating, -- åºã®è©äŸ¡ time, -- ã¯ãã³ãã®æçš¿æé relative_time_description, -- ã¯ãã³ãã®çžå¯Ÿçãªæé CONCAT ( ' 以äžã®ã©ãŒã¡ã³åºã ' , spot_name, ' ãã®ã¯ãã³ãã«å¯ŸããŠãåºé·ããã®è¿ä¿¡ãäœæããŠãã ãããã¯ãã³ãã®å
容ã«å¿ããŠæè¬ãæ¹åç¹ãžã®å¯Ÿçãªã©ãå«ããŠãã ããã ' , ' ãŸããGoogle Map ã«ãããåºã®è©äŸ¡ïŒ ' , rating, ' ïŒãèžãŸããŠãã客æ§ã®æåŸ
å€ã«å¿ããŠãããã©ãããèæ
®ããŠãã ããã ' , ' ã¯ãã³ã: " ' , text, ' " ' , ' è¿ä¿¡ã¯ã以äžã®ãã©ãŒãããã§ãé¡ãããŸãã ' , ' {"response": " ' , author, ' æ§ ' , ' \\n ' , ' åºé·ããã®è¿ä¿¡ã¡ãã»ãŒãž"} ' ) AS prompt -- AIã¢ãã«ã«æž¡ãããã®ããã³ãã FROM ${ref( " reviews " )} ) -- Step 2: AI ã¢ãã«ã䜿çšããŠãããã³ããã«åºã¥ããŠåºé·ããã®è¿ä¿¡ãçæãã SELECT r.spot_name, -- åºå r.author, -- ã¯ãã³ãã®æçš¿è
r.text, -- ã¯ãã³ãã®å
容 r.rating, -- åºã®è©äŸ¡ r.time, -- ã¯ãã³ãã®æçš¿æé r.relative_time_description, -- ã¯ãã³ãã®çžå¯Ÿçãªæé JSON_VALUE( REPLACE (t.ml_generate_text_llm_result, ' ```json ' , '' ), ' $.response ' ) AS response -- çæãããè¿ä¿¡ FROM review_data r LEFT JOIN ML.GENERATE_TEXT( MODEL `project_id.google_maps_review_analysis.gemini_1_5_pro`, -- 䜿çšããAIã¢ãã« ( SELECT prompt FROM review_data), -- ããã³ãããAIã¢ãã«ã«æž¡ã STRUCT( 0.3 AS temperature, -- åºåã®ã©ã³ãã æ§ãå¶åŸ¡ãã 500 AS max_output_tokens, -- åºåã®æå€§ããŒã¯ã³æ° 0.9 AS top_p, -- ãã¥ãŒã¯ãªã¢ã¹ãµã³ããªã³ã°ã®ãã©ã¡ãŒã¿ 10 AS top_k, -- ãããKãã£ã«ã¿ãªã³ã°ã§ä¿æããæãé«ã確çã®èªåœããŒã¯ã³æ° TRUE AS flatten_json_output -- JSONåºåããã©ããã«ãã ) ) AS t ON r.prompt = t.prompt -- ããã³ãããåºã«AIã¢ãã«ããã®è¿ä¿¡ãçµå çæçµæã¯ä»¥äžã®ãšããã§ããã¯ãã³ãã®å
容ã«å¯ŸããŠãäžã€ãã€äžå¯§ã«è¿ä¿¡ããŠããŸãã ã¯ãã³ãã«å¯Ÿããèªåè¿ä¿¡æ G-gen ç·šééš (èšäºäžèЧ) æ ªåŒäŒç€ŸG-genã¯ããµãŒããŒã¯ãŒã¯ã¹ã°ã«ãŒããšããŠãã¯ã©ãŠãã§ãäžçãããã£ãšãã¯ããããããããããžã§ã³ã«æ²ããã¯ã©ãŠãã®å°å
¥ããæé©åãŸã§ãæ¯æŽããŠãã Google Cloud å°æ¥ã®ã¯ã©ãŠãã€ã³ãã°ã¬ãŒã¿ãŒã§ãã