G-gen ã®äœã
æšã§ããåœèšäºã§ã¯ Google ãæäŸããçæ AI ã¢ãã« Gemini Pro ãšãWeb UI çšã® Python ãã¬ãŒã ã¯ãŒã¯ã§ãã Gradio ã䜿çšãããã·ã³ãã«ãªãã£ãããããã®äœãæ¹ã玹ä»ããŸãã åæç¥è Gemini Pro Gradio Gradio ã䜿çšã㊠Gemini Pro ã®ãã£ããããããéçºãã Python ã®ããŒãžã§ã³ requirements.txt main.py ã³ãŒãã®è§£èª¬ Gradio ã® ChatInterface ã«æž¡ã颿°ã®åœ¢åŒã«ã€ã㊠generation_config ã«ã€ã㊠Gemini ã«ãããäŒè©±å±¥æŽã®åœ¢åŒã«ã€ã㊠åäœç¢ºèª ããŒã«ã«ã§ãã£ããããããå®è¡ãã ãã£ãããããã䜿çšãã ãã£ããããããå€éšã«å
±æãã Safety Attributes ã®èª¿æŽ ResponseValidationError Safety Attributes ãšã¯ ã³ãŒãã®ä¿®æ£ ä¿®æ£åŸã® main.py å
šæ åäœç¢ºèª BLOCK_NONE ã«èšå®ããå Žåã®åäœã«ã€ã㊠Google Cloud äžã«ãã£ãããããããããã€ãã Cloud Run ã䜿çšãã ã³ãŒãã®ä¿®æ£ Dockerfile ã®äœæ Cloud Run ã«ããã〠åäœç¢ºèª Cloud Run ã®ã¢ã¯ã»ã¹å
å¶åŸ¡ã«ã€ã㊠åæç¥è Gemini Pro Gemini Pro ã¯ãGoogle ãæäŸããçæ AI ã¢ãã« Gemini ã®ããªãšãŒã·ã§ã³ã®1ã€ã§ãããããã¹ããç»åãåç»ãªã©ã®è€æ°ã®çš®é¡ã®ããŒã¿ãæ±ãããšãã§ãããã«ãã¢ãŒãã«ãªçæ AI ã¢ãã«ã§ãã 詳现ã«ã€ããŠã¯ä»¥äžã®èšäºããäžèªãã ããã blog.g-gen.co.jp Gradio Gradio ã¯ãPython ã§æ©æ¢°åŠç¿ Web ã¢ããªã容æã«æ§ç¯ã§ãããã¬ãŒã ã¯ãŒã¯ã§ãã åœèšäºã§ã¯ã Gradio ã® ChatInterface() ã䜿çšããŠãã£ããããããäœæããŠããŸããã³ãŒãã«ä»¥äžã®äžè¡ãèšè¿°ããã ãã§ããã£ãããããã«å¿
èŠãªæ©èœãåãã UI ãçšæããããšãã§ããŸãã gradio.ChatInterface(fn={颿°å}).launch() ChatInterface ã§ããã«äœ¿çšã§ãã UI ãã® UI äžã§ã¡ãã»ãŒãžãéä¿¡ïŒSubmitïŒãããšã ChatInterface() ã«åŒæ°ãšããŠæž¡ãã颿°ã«ã¡ãã»ãŒãžãæž¡ãããšãã§ããŸãããã®é¢æ°å
ã«ã¡ãã»ãŒãžãåŠçããããžãã¯ãèšè¿°ããã ãã§ãUI ãåãããã£ããããããç°¡åã«éçºããããšãã§ããŸãã åèïŒ How to Create a Chatbot with Gradio Gradio ã䜿çšã㊠Gemini Pro ã®ãã£ããããããéçºãã Python ã®ããŒãžã§ã³ åœèšäºã®å
容ã¯ã Python 3.12.0 ã§è©ŠããŠããŸãã $ python --version Python 3 . 12 . 0 requirements.txt 䜿çšããå€éšã©ã€ãã©ãªã¯ä»¥äžã®éãã§ãã google-cloud-aiplatform==1.42.1 gradio==4.19.2 main.py 䜿çšããã³ãŒãã®å
šæã以äžã«èšèŒããŸãã PROJECT_ID ã®å€ã¯ã䜿çšãã Google Cloud ãããžã§ã¯ãã® IDã«çœ®ãæããŠãã ããã import gradio as gr import vertexai from vertexai.generative_models import GenerativeModel, Content, Part # ç°å¢å€æ°ã®èšå® PROJECT_ID = "myproject" # Google Cloud ãããžã§ã¯ãã® ID LOCATION = "asia-northeast1" # Gemini ã¢ãã«ã䜿çšãããªãŒãžã§ã³ # Vertex AI API ã®åæå vertexai.init(project=PROJECT_ID, location=LOCATION) # Gemini ã¢ãã«ãšã®ãã£ãããè¡ã颿° def gemini_chat (message, history, temperature, top_p, top_k, max_output_token): # Gemini ã¢ãã«ã®åæå generation_config = { "temperature" : temperature, # çæããããã¹ãã®ã©ã³ãã æ§ãå¶åŸ¡ "top_p" : top_p, # çæã«äœ¿çšããããŒã¯ã³ã®çޝç©ç¢ºçãå¶åŸ¡ "top_k" : top_k, # çæã«äœ¿çšãããããkããŒã¯ã³ãå¶åŸ¡ "max_output_tokens" : max_output_token, # æå€§åºåããŒã¯ã³æ°ãæå® } gemini_model = GenerativeModel( model_name= "gemini-1.0-pro" , generation_config=generation_config ) # äŒè©±å±¥æŽã®ãªã¹ããåæå gemini_history = [] # äŒè©±å±¥æŽã®ãã©ãŒããããæŽåœ¢ for row in history: input_from_user = row[ 0 ] output_from_gemini = row[ 1 ] gemini_history.append(Content(role= "user" , parts=[Part.from_text(input_from_user)])) gemini_history.append(Content(role= "model" , parts=[Part.from_text(output_from_gemini)])) # Gemini ã¢ãã«ã«äŒè©±å±¥æŽãã€ã³ããã chat = gemini_model.start_chat(history=gemini_history) # Gemini ã¢ãã«ã«ããã³ãããªã¯ãšã¹ããéä¿¡ try : response = chat.send_message(message).text except IndexError as e: print (f "IndexError: {e}" ) return "Gemini ããã¬ã¹ãã³ã¹ãè¿ãããŸããã§ãããããäžåºŠè³ªåãéä¿¡ããããæç« ãå€ããŠã¿ãŠãã ããã" return response # UI ã« Generation Config ã調æŽããã¹ã©ã€ããŒã远å ããããã®ãªã¹ã additional_inputs = [ gr.Slider(label= "Temperature" , minimum= 0 , maximum= 1 , step= 0.1 , value= 0.4 , interactive= True ), gr.Slider(label= "Top-P" , minimum= 0.1 , maximum= 1 , step= 0.1 , value= 1 , interactive= True ), gr.Slider(label= "Top-K" , minimum= 1 , maximum= 40 , step= 1 , value= 32 , interactive= True ), gr.Slider(label= "Max Output Token" , minimum= 1 , maximum= 8192 , step= 1 , value= 1024 , interactive= True ), ] if __name__ == "__main__" : # gemini_chat 颿°ã䜿çšãããã£ãããããã€ã³ã¿ãŒãã§ã€ã¹ãèµ·å gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs ).launch() ã³ãŒãã®è§£èª¬ Gradio ã® ChatInterface ã«æž¡ã颿°ã®åœ¢åŒã«ã€ã㊠ã³ãŒãæ«å°Ÿã® ChatInterface(fn={颿°å}).launch() ã§ Gradio ã®ãã£ããããããèµ·åããŠããŸãã if __name__ == "__main__" : gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs # ããã¯åŸã»ã©è§£èª¬ ).launch() ChatInterface() ã®åŒæ° fn ã«æž¡ã颿°ã¯ããŠãŒã¶ãŒãéä¿¡ããã¡ãã»ãŒãžãšéå»ã®äŒè©±å±¥æŽãåŒæ°ãšããŠåãåãããã«å®è£
ããŸãïŒä»¥äžã®ç¬¬1ã第2åŒæ°ã該åœïŒã def gemini_chat (message, history, temperature, top_p, top_k, max_output_token): ãŠãŒã¶ãŒãéä¿¡ããã¡ãã»ãŒãžã¯ message ã«æ ŒçŽãããŸãã history ã«ã¯éå»ã®äŒè©±å±¥æŽããªã¹ããšããŠæž¡ãããŸããäŸãã°ãŠãŒã¶ãŒãéä¿¡ããã¡ãã»ãŒãžã user_input_N ãã¢ãã«ããã®ã¬ã¹ãã³ã¹ã model_response_N ãšãããšã以äžã®ãããªåœ¢åŒã§å±¥æŽãæ ŒçŽãããŸãã history = [ [user_input_1, model_response_1], [user_input_2, model_response_2], [user_input_3, model_response_3] ] åèïŒ How to Create a Chatbot with Gradio - Defining a chat function generation_config ã«ã€ã㊠Gemini äœ¿çšæã«ããã€ãã®ãã©ã¡ãŒã¿ãæž¡ãããšã§ãçæãããåçã®ç²ŸåºŠã調æŽããããšãã§ããŸãããã©ã¡ãŒã¿ã®è©³çްã«ã€ããŠã¯ ããã¥ã¡ã³ã ããäžèªãã ããã generation_config = { "temperature" : temperature, # çæããããã¹ãã®ã©ã³ãã æ§ãå¶åŸ¡ "top_p" : top_p, # çæã«äœ¿çšããããŒã¯ã³ã®çޝç©ç¢ºçãå¶åŸ¡ "top_k" : top_k, # çæã«äœ¿çšãããããkããŒã¯ã³ãå¶åŸ¡ "max_output_tokens" : max_output_token, # æå€§åºåããŒã¯ã³æ°ãæå® } åœèšäºã§ã¯ã以äžã®ããã«ããŠãã£ãããããã® UI äžã«ã¹ã©ã€ããŒãé
眮ããã¡ãã»ãŒãžéä¿¡åã«åçš®ãã©ã¡ãŒã¿ãæåã§èª¿æŽã§ããããã«ããŠããŸãã # UI ã« Generation Config ã調æŽããã¹ã©ã€ããŒã远å ããããã®ãªã¹ã additional_inputs = [ gr.Slider(label= "Temperature" , minimum= 0 , maximum= 1 , step= 0.1 , value= 0.4 , interactive= True ), gr.Slider(label= "Top-P" , minimum= 0.1 , maximum= 1 , step= 0.1 , value= 1 , interactive= True ), gr.Slider(label= "Top-K" , minimum= 1 , maximum= 40 , step= 1 , value= 32 , interactive= True ), gr.Slider(label= "Max Output Token" , minimum= 1 , maximum= 8192 , step= 1 , value= 1024 , interactive= True ), ] if __name__ == "__main__" : # gemini_chat 颿°ã䜿çšãããã£ãããããã€ã³ã¿ãŒãã§ã€ã¹ãèµ·å gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs ).launch() UI ã«ãã©ã¡ãŒã¿ãæåã§èª¿æŽããã¹ã©ã€ããŒãé
眮ãã ãã®ããã«æåã§ãã©ã¡ãŒã¿ã®èª¿æŽãã§ããæ©èœãã€ããå Žåãã¡ãã»ãŒãžéä¿¡ã®ãã³ã«ã¢ãã«ã®åæåãè¡ãå¿
èŠããããŸããã¬ã¹ãã³ã¹ã®é床ãªã©ãæ°ã«ããå Žåã¯ããã©ã¡ãŒã¿ãåºå®åã㊠Gemini ã¢ãã«ã®åæååŠçã¯ã°ããŒãã«ã¹ã³ãŒãã«èšè¿°ããŸãã Gemini ã«ãããäŒè©±å±¥æŽã®åœ¢åŒã«ã€ã㊠Gemini ãå©çšããå Žåãéå»ã®äŒè©±å±¥æŽã¯ Content ãªããžã§ã¯ããšããŠã¢ãã«ã«æž¡ããŸãã ãã£ãããããã®ãŠãŒã¶ãŒãéä¿¡ããã¡ãã»ãŒãžã¯ role="user" ãGemini ããã®ã¬ã¹ãã³ã¹ã¯ role="model" ãšã㊠Content ãªããžã§ã¯ããäœæããŸãã gemini_history.append(Content(role= 'user' , parts=[Part.from_text(input_from_user)])) gemini_history.append(Content(role= 'model' , parts=[Part.from_text(output_from_gemini)])) Gemini ã¢ãã«ãšã®ãã£ãããéå§ããéã« Content ãªããžã§ã¯ãã®ãªã¹ããæž¡ãããšã§ãéå»ã®äŒè©±å±¥æŽãçšããããåããè¡ãããšãã§ããŸãã chat = gemini_model.start_chat(history=gemini_history) åäœç¢ºèª ããŒã«ã«ã§ãã£ããããããå®è¡ãã main.py ãå®è¡ããŠããŒã«ã«ã§ãã£ããããããèµ·åããŸãã ããã©ã«ãã§ã¯ããŒã«ã«ãã¹ãïŒ127.0.0.1ïŒã®ããŒã 7860 ã§ãã£ããããããèµ·åãããããããã©ãŠã¶ããã¢ã¯ã»ã¹ããŸãã $ python main.py Running on local URL: http:// 127.0 . 0.1 : 7860 To create a public link, set `share= True ` in `launch()`. Gradio ã§ã¯ gradio ã³ãã³ãã䜿çšããããšã§ãããããªããŒãã䜿çšããŠãã£ããããããå®è¡ããããšãã§ããŸãã $ gradio main.py åèïŒ Developing Faster with Auto-Reloading ãã£ãããããã䜿çšãã ãã£ãããããã® UI ããé©åœãªã¡ãã»ãŒãžãéä¿¡ããŠã¿ãŸãã éä¿¡ããã¡ãã»ãŒãžã®åŸã«ãGemini Pro ã¢ãã«ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸãã ããŒã«ã«ã§èµ·åãããã£ãããããã«ã¡ãã»ãŒãžãéä¿¡ãã ãã£ããããããå€éšã«å
±æãã Gradio ã§ã¯æéä»ãã®å€éšå
¬é URL ãçºè¡ããããšãã§ããŸãã ãã®æ©èœã¯ã launch() ã®åŒæ°ã« share=True ãæž¡ãããšã§å©çšã§ããŸãã gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs ).launch(share= True ) çºè¡ããã public URL ã«ã¢ã¯ã»ã¹ãããšãã€ã³ã¿ãŒãããããããŒã«ã«ã§å®è¡ããŠãããã£ãããããã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã $ python main.py Running on local URL: http:// 127 . 0 . 0 .1:7860 Running on public URL: https://52b37dd2b7cf213999.gradio.live This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces ( https://huggingface.co/spaces ) ã€ã³ã¿ãŒãããããããŒã«ã«ã®ãã£ãããããã«ã¢ã¯ã»ã¹ãã åèïŒ Quickstart - Sharing Your Demo Safety Attributes ã®èª¿æŽ ResponseValidationError äœæãããã£ããããããšããåãããŠãããšã以äžã®ããã«ãšã©ãŒãçºçããŠã¬ã¹ãã³ã¹ã衚瀺ãããªãå¯èœæ§ããããŸãã ãã£ãããããããã®ã¬ã¹ãã³ã¹ã§ãšã©ãŒãçºçãã ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãšã©ãŒãåçŸããããã®æ¥µç«¯ãªã¡ãã»ãŒãžäŸã§ããããã£ããããããšæ®éã«ãããšããããŠããã ãã§ãã£ãŠãåããšã©ãŒã«ééããå¯èœæ§ããããŸãã ãã£ãããããã®ãã°ã«ã¯ä»¥äžã®ããã« ResponseValidationError ãåºåãããŠããŸãã ããã¯ãGemini ããã®ã¬ã¹ãã³ã¹ã«å¯ŸããŠããã€ãã®åºæºïŒåŸè¿°ïŒã§æ€èšŒãè¡ãããçµæãäžé©åãªå
容ãå«ãŸããŠããå¯èœæ§ããããšå€æãããã¬ã¹ãã³ã¹ããããã¯ãããããšã瀺ããŠããŸãã vertexai.generative_models._generative_models.ResponseValidationError: The model response did not completed successfully. Finish reason: 3 . Finish message: . Safety ratings: [ category: HARM_CATEGORY_HATE_SPEECH probability: NEGLIGIBLE , category: HARM_CATEGORY_DANGEROUS_CONTENT probability: NEGLIGIBLE , category: HARM_CATEGORY_HARASSMENT probability: MEDIUM blocked: true , category: HARM_CATEGORY_SEXUALLY_EXPLICIT probability: NEGLIGIBLE ] . To protect the integrity of the chat session, the request and response were not added to chat history . To skip the response validation, specify `model.start_chat ( response_validation =False ) ` . Note that letting blocked or otherwise incomplete responses into chat history might lead to future interactions being blocked by the service. ãã®ãšã©ãŒã¡ãã»ãŒãžã§ã¯ã HARM_CATEGORY_HARASSMENT ãšããã«ããŽãªã§ MEDIUM ãã€ãŸãäžçšåºŠã«äžé©åãªå¯èœæ§ãããã¬ã¹ãã³ã¹ããã£ãããšãããããŸãã Safety Attributes ãšã¯ Safety Attributes ãšã¯ãGemini ã¢ãã«ãäžé©åãªã³ã³ãã³ããçæããããšãé²ãããã®è©äŸ¡ã«ããŽãªã§ããããã®ã«ããŽãªã«ç
§ããåãããŠäžé©åãªå¯èœæ§ããããšå€æãããã³ã³ãã³ãã¯ããŠãŒã¶ãŒã«è¿ãããåã«ãããã¯ãããŸãã Safety Attributes ã«ã¯ä»¥äžã®ãããªã«ããŽãªããããŸãã Safety Attributes ã®ã«ããŽãª 説æ Hate Speech (HARM_CATEGORY_HATE_SPEECH) ç¹å®ã®å±æ§ã«å¯Ÿãããã€ãã¹ããŒãã«é¢ãããã®ã Harassment (HARM_CATEGORY_HARASSMENT) å¥ã®å人ã«å¯Ÿããå«ãããã«é¢ãããã®ã Sexually Explicit (HARM_CATEGORY_SEXUALLY_EXPLICIT) é²éªšãªæ§ç衚çŸã«é¢ãããã®ã Dangerous Content (HARM_CATEGORY_DANGEROUS_CONTENT) æå®³ãªååããµãŒãã¹ã掻åã«é¢ãããã®ã Gemini API ã䜿çšããå ŽåãAPI ãªã¯ãšã¹ãã« Safety Settings ãšããŠãããã¯ã®éŸå€ãèšå®ããããšã§ãSafety Attributes ã®ã«ããŽãªããšã«ãã£ã«ã¿ãŒã®åŒ·ãã調æŽããããšãã§ããŸãã äœãèšå®ããŠããªãå Žåã¯ãããã©ã«ãã§ BLOCK_MEDIUM_AND_ABOVE ãèšå®ãããŸãã éŸå€ 説æ BLOCK_NONE ã¬ã¹ãã³ã¹ã«å¯Ÿã㊠Safety Attributes ã®ãã£ã«ã¿ãé©çšããªãïŒåžžã«ã¬ã¹ãã³ã¹ã衚瀺ããïŒã BLOCK_ONLY_HIGH äžé©åã§ããå¯èœæ§ãé«ãã¬ã¹ãã³ã¹ã®ã¿ãããã¯ããã BLOCK_MEDIUM_AND_ABOVE ããã©ã«ãã®éŸå€ãäžé©åã§ããå¯èœæ§ãäžçšåºŠä»¥äžã®ã¬ã¹ãã³ã¹ããããã¯ããã BLOCK_LOW_AND_ABOVE äžé©åã§ããå¯èœæ§ãå°çšåºŠã§ãã£ãŠãã¬ã¹ãã³ã¹ããããã¯ããã HARM_BLOCK_THRESHOLD_UNSPECIFIED ããã©ã«ãã®éŸå€ã䜿çšããã åèïŒ Configure safety attributes ã³ãŒãã®ä¿®æ£ Gemini ã¢ãã«ã«å¯Ÿã㊠Safety Settings ãå«ããªã¯ãšã¹ããéä¿¡ããããã«ã³ãŒããä¿®æ£ããŸãã ãŸãã vertexai.generative_models ããã® import æã« HarmCategory ã HarmBlockThreshold ã ResponseValidationError ã远èšããŸãã from vertexai.generative_models import GenerativeModel, Content, Part, HarmCategory, HarmBlockThreshold, ResponseValidationError Safety Attributes ã®ã«ããŽãªããšã«ãã£ã«ã¿ãŒã®åŒ·ããèšå®ããŸããåœèšäºã§ã¯äžåŸ BLOCK_ONLY_HIGH ã«èšå®ããŸãã ããã§èšå®ã§ããã«ããŽãªã®çš®é¡ã¯å
ã»ã©èª¬æãã4ã€ã«å ããäžç¹å®ã«ããŽãªïŒ HARM_CATEGORY_UNSPECIFIED ïŒãååšããŸãã # ç·©ãã® Safety Settings SAFETY_SETTINGS = { HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_ONLY_HIGH, } send_message ã§ Gemini ã«ã¡ãã»ãŒãžãéãéã«ã safety_settings åŒæ°ãæž¡ãããã«ä¿®æ£ããŸãã ãŸãã BLOCK_ONLY_HIGH ã«ãã£ã«ã¿ãŒãç·©ããåŸã§ããäžé©åãªå¯èœæ§ãé«ããšå€å®ãããã¬ã¹ãã³ã¹ã¯åŒãç¶ããšã©ãŒãçºçããŠããŸãããã ResponseValidationError ã«ã€ããŠäŸå€åŠçãå®è£
ãããã£ã«ã¿ã«åŒã£ããã£ãŠããŸã£ãå Žåã®ãŠãŒã¶ãŒãžã®ã¡ãã»ãŒãžãè¿ãããã«ããŸãã # Gemini ã¢ãã«ãšã®ãã£ãããè¡ã颿° def gemini_chat (message, history): ãããçç¥ããã # Gemini ã¢ãã«ã«ããã³ãããªã¯ãšã¹ããéä¿¡ try : response = chat.send_message( message, safety_settings=SAFETY_SETTINGS # åŒæ°ã« Safety Attributes ã®èšå®ã远å ).text except ResponseValidationError as e: # ãã£ã«ã¿ã«åŒã£ããã£ãå Žåã®ãšã©ãŒåŠç print (f "ResponseValidationError: {e}" ) return "Gemini ããäžé©åãªã¬ã¹ãã³ã¹ãè¿ããããããã¡ãã»ãŒãžã衚瀺ã§ããŸãããããäžåºŠè³ªåãéä¿¡ããããæç« ãå€ããŠã¿ãŠãã ããã" except IndexError as e: print (f "IndexError: {e}" ) return "Gemini ããã¬ã¹ãã³ã¹ãè¿ãããŸããã§ãããããäžåºŠè³ªåãéä¿¡ããããæç« ãå€ããŠã¿ãŠãã ããã" return response ä¿®æ£åŸã® main.py å
šæ Safety Attributes ã®èšå®ãå ããã³ãŒãã®å
šæã以äžã«èšèŒããŸãã import gradio as gr import vertexai from vertexai.generative_models import GenerativeModel, Content, Part, HarmCategory, HarmBlockThreshold, ResponseValidationError # ç°å¢å€æ°ã®èšå® PROJECT_ID = "myproject" # Google Cloud ãããžã§ã¯ãã® ID LOCATION = "asia-northeast1" # Gemini ã¢ãã«ã䜿çšãããªãŒãžã§ã³ # ç·©ãã® Safety Settings SAFETY_SETTINGS = { HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_ONLY_HIGH, } # Vertex AI API ã®åæå vertexai.init(project=PROJECT_ID, location=LOCATION) # Gemini ã¢ãã«ãšã®ãã£ãããè¡ã颿° def gemini_chat (message, history, temperature, top_p, top_k, max_output_token): # Gemini ã¢ãã«ã®åæå generation_config = { "temperature" : temperature, # çæããããã¹ãã®ã©ã³ãã æ§ãå¶åŸ¡ "top_p" : top_p, # çæã«äœ¿çšããããŒã¯ã³ã®çޝç©ç¢ºçãå¶åŸ¡ "top_k" : top_k, # çæã«äœ¿çšãããããkããŒã¯ã³ãå¶åŸ¡ "max_output_tokens" : max_output_token, # æå€§åºåããŒã¯ã³æ°ãæå® } gemini_model = GenerativeModel( model_name= "gemini-1.0-pro" , generation_config=generation_config ) # äŒè©±å±¥æŽã®ãªã¹ããåæå gemini_history = [] # äŒè©±å±¥æŽã®ãã©ãŒããããæŽåœ¢ for row in history: input_from_user = row[ 0 ] output_from_gemini = row[ 1 ] gemini_history.append(Content(role= "user" , parts=[Part.from_text(input_from_user)])) gemini_history.append(Content(role= "model" , parts=[Part.from_text(output_from_gemini)])) # Gemini ã¢ãã«ã«äŒè©±å±¥æŽãã€ã³ããã chat = gemini_model.start_chat(history=gemini_history) # Gemini ã¢ãã«ã«ããã³ãããªã¯ãšã¹ããéä¿¡ try : response = chat.send_message( message, safety_settings=SAFETY_SETTINGS # åŒæ°ã« safety attributes ã®èšå®ã远å ).text except ResponseValidationError as e: # ãã£ã«ã¿ã«åŒã£ããã£ãå Žåã®ãšã©ãŒåŠç print (f "ResponseValidationError: {e}" ) return "Gemini ããäžé©åãªã¬ã¹ãã³ã¹ãè¿ããããããã¡ãã»ãŒãžã衚瀺ã§ããŸãããããäžåºŠè³ªåãéä¿¡ããããæç« ãå€ããŠã¿ãŠãã ããã" except IndexError as e: print (f "IndexError: {e}" ) return "Gemini ããã¬ã¹ãã³ã¹ãè¿ãããŸããã§ãããããäžåºŠè³ªåãéä¿¡ããããæç« ãå€ããŠã¿ãŠãã ããã" return response # UI ã« Generation Config ã調æŽããã¹ã©ã€ããŒã远å ããããã®ãªã¹ã additional_inputs = [ gr.Slider(label= "Temperature" , minimum= 0 , maximum= 1 , step= 0.1 , value= 0.4 , interactive= True ), gr.Slider(label= "Top-P" , minimum= 0.1 , maximum= 1 , step= 0.1 , value= 1 , interactive= True ), gr.Slider(label= "Top-K" , minimum= 1 , maximum= 40 , step= 1 , value= 32 , interactive= True ), gr.Slider(label= "Max Output Token" , minimum= 1 , maximum= 8192 , step= 1 , value= 1024 , interactive= True ), ] if __name__ == "__main__" : # gemini_chat 颿°ã䜿çšãããã£ãããããã€ã³ã¿ãŒãã§ã€ã¹ãèµ·å gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs ).launch() åäœç¢ºèª ãšã©ãŒãçºçããã¡ãã»ãŒãžãå床éä¿¡ããŠã¿ããšãæ£åžžãªã¬ã¹ãã³ã¹ãè¿ã£ãŠããŸããã ãã£ã«ã¿ãŒãç·©ããçµæãåã質åã«å¯ŸããŠæ£åžžã«ã¬ã¹ãã³ã¹ãè¿ã£ãŠãã ãŸããããäžé©åãªå¯èœæ§ãé«ãã¬ã¹ãã³ã¹ã«ã¯ãã£ã«ã¿ãŒãæ©èœããããšã詊ããŠã¿ãŸããäŸå€åŠçã«èšå®ãããšã©ãŒã¡ãã»ãŒãžãè¿ã£ãŠããããšã確èªã§ããŸãã ç·©ããã£ã«ã¿ãŒã§ããããã¯ãããå Žåã¯èšå®ããŠãããã¡ãã»ãŒãžãè¿ã ãšã©ãŒãã°ã確èªãããšã HARM_CATEGORY_HARASSMENT ã«ããŽãªã§ HIGH ãã€ãŸãé«ç¢ºçã§äžé©åãªå
容ã®ã¬ã¹ãã³ã¹ããããã¯ãããããšãããããŸãã ResponseValidationError: The model response did not completed successfully. Finish reason: 3 . Finish message: . Safety ratings: [ category: HARM_CATEGORY_HATE_SPEECH probability: NEGLIGIBLE , category: HARM_CATEGORY_DANGEROUS_CONTENT probability: NEGLIGIBLE , category: HARM_CATEGORY_HARASSMENT probability: HIGH blocked: true , category: HARM_CATEGORY_SEXUALLY_EXPLICIT probability: NEGLIGIBLE ] . To protect the integrity of the chat session, the request and response were not added to chat history . To skip the response validation, specify `model.start_chat ( response_validation =False ) ` . Note that letting blocked or otherwise incomplete responses into chat history might lead to future interactions being blocked by the service. BLOCK_NONE ã«èšå®ããå Žåã®åäœã«ã€ã㊠ãããã¯ã®éŸå€ã BLOCK_NONE ã«èšå®ããå Žåãã€ãŸããã£ã«ã¿ãŒãç¡å¹åããå Žåã§ãã£ãŠããæå®³ã«ãªãåŸã質åãžã®ã¬ã¹ãã³ã¹ãããããçæãããªãã±ãŒã¹ããããŸãã æå®³ãªã¬ã¹ãã³ã¹ãçæãããªãã±ãŒã¹â æå®³ãªã¬ã¹ãã³ã¹ãçæãããªãã±ãŒã¹â¡ Google Cloud äžã«ãã£ãããããããããã€ãã Cloud Run ã䜿çšãã ãããŸã§ã§äœæãããã£ãããããã Google Cloud äžã«ãããã€ããŠã¿ãŸãã åœèšäºã§ã¯ãããã€å
ã®ãµãŒãã¹ãšããŠããµãŒããŒã¬ã¹ ã³ã³ãã ã³ã³ãã¥ãŒãã£ã³ã°ãµãŒãã¹ã§ãã Cloud Run ã䜿çšããŸãã Cloud Run ã®è©³çްã«ã€ããŠã¯ä»¥äžã®èšäºããäžèªãã ããã blog.g-gen.co.jp ã³ãŒãã®ä¿®æ£ main.py æ«å°Ÿã® launch() ã®åŒæ°ãã以äžã®ããã«ä¿®æ£ããŸãã if __name__ == "__main__" : # gemini_chat 颿°ã䜿çšãããã£ãããããã€ã³ã¿ãŒãã§ã€ã¹ãèµ·å gr.ChatInterface( fn=gemini_chat, additional_inputs=additional_inputs ).launch(server_name= "0.0.0.0" , server_port= 8080 ) Dockerfile ã®äœæ Cloud Run ãžã®ãããã€ã«ã¯ Docker ã€ã¡ãŒãžãçšæããå¿
èŠãããããã Docker Hub ã®ãµã³ãã« ãå
ã«ãç°¡å㪠Dockerfile ãäœæããŸãã FROM python:3.12-slim WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python" , "./main.py" ] Cloud Run ã«ããã〠Dockerfile ãäœæãããã£ã¬ã¯ããªã§ä»¥äžã®ã³ãã³ããå®è¡ããã³ã³ããã€ã¡ãŒãžã®ãã«ããš Cloud Run ãžã®ãããã€ãåæã«è¡ããŸãã # Cloud Run ãµãŒãã¹ãããã〠$ gcloud run deploy gradio-gemini --source . \ --region = asia-northeast1 \ --allow-unauthenticated ãã«ããããã³ã³ããã€ã¡ãŒãžã¯ãæå®ãããªãŒãžã§ã³ã«èªåã§äœæããããcloud-run-source-deployããšããååã® Artifact Registory ãªããžããªã«æ ŒçŽãããŸãã åèïŒ ãœãŒã¹ã³ãŒããããããã€ãã åäœç¢ºèª Cloud Run ã®ãããã€ãå®äºãããšã Service URL ãšã㊠Cloud Run ã®ãšã³ããã€ã³ããåºåãããŠããã®ã§ããã©ãŠã¶ããã¢ã¯ã»ã¹ããŸãã # ãããã€å®äºåŸã®ã³ãã³ãåºåäŸ $ gcloud run deploy gradio-gemini --source . \ --region = asia-northeast1 \ --allow-unauthenticated This command is equivalent to running `gcloud builds submit --pack image = [ IMAGE ] .` and `gcloud run deploy gradio-gemini --image [ IMAGE ] ` Building using Buildpacks and deploying container to Cloud Run service [ gradio-gemini ] in project [ myproject ] region [ asia-northeast1 ] â Building and deploying new service... Done. â Uploading sources... â Building Container... Logs are available at [ https://console.cloud.google.com/cloud-build/builds/d72a1c89-4e73-41ea-86b9-467976adfcb0?project = xxxxxxxxxxxx ] . â Creating Revision... â Routing traffic... â Setting IAM Policy... Done. Service [ gradio-gemini ] revision [ gradio-gemini-00001-rkr ] has been deployed and is serving 100 percent of traffic. Service URL: https://gradio-gemini-ai4xxxxxxx-an.a.run.app Cloud Run äžã®ãã£ãããããã«ã¢ã¯ã»ã¹ããããšãã§ããŸããã Cloud Run ã«ãããã€ãããã£ãããããã«ã¢ã¯ã»ã¹ãã Cloud Run ã®ã¢ã¯ã»ã¹å
å¶åŸ¡ã«ã€ã㊠Cloud Run ã«ãããã€ãããã£ãããããã®ã¢ã¯ã»ã¹å
å¶åŸ¡ãè¡ãããå ŽåãCloud Run ã®å段ã«ããŒããã©ã³ãµãŒãé
眮ããIdentity Aware ProxyïŒIAPïŒã«ãã IAM èªèšŒã Cloud Armor ã«ãã IP ã¢ãã¬ã¹ã®å¶éãå®è£
ããŸãã è©³çŽ°ãªæé ã«ã€ããŠã¯ä»¥äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp äœã
æš é§¿å€ª (èšäºäžèЧ) G-genæå端ãåæµ·éåšäœã®ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éšãšã³ãžã㢠2022幎6æã«G-genã«ãžã§ã€ã³ãGoogle Cloud Partner Top Engineer 2024ã«éžåºã奜ããªGoogle Cloudãããã¯ãã¯Cloud Runã è¶£å³ã¯ã³ãŒããŒãå°èª¬ïŒSFããã¹ããªïŒãã«ã©ãªã±ãªã©ã Follow @sasashun0805