today_ai_weather/app/services/ai_service.rb
songtianlun d045f532ec feat: enhance AI prompt generation logic
- Refactor prompt generation to separate location
  description functionality
- Update user prompt generation for DALL-E 3
- Improve AI service's response handling

This change enhances the AiService by creating a more
modular approach to generating prompts. The introduction
of a `generate_location_desc` method improves the
detail and context provided in the generated prompts.
Furthermore, the `ask_ai` method centralizes AI request
logic, allowing for cleaner and more organized code.
These adjustments should improve the overall robustness
and readability of the prompt generation process.
2025-02-12 11:33:11 +08:00

92 lines
2.9 KiB
Ruby

class AiService
def initialize
@client = OpenAI::Client.new(
access_token: Rails.application.credentials.openai.token,
uri_base: Rails.application.credentials.openai.uri,
request_timeout: 240
)
end
def generate_prompt(city, weather_data)
city_desc = generate_location_desc(city)
system_message =
"You are a professional artist creating prompts for DALL-E 3. Create realistic, artistic weather scenes featuring iconic landmarks."
user_message = generate_dall_e_3_prompt_request(city, weather_data, city_desc)
ask_ai(system_message, user_message)
end
def generate_location_desc(city)
region = city.country.region&.name || ""
country = city.country.name || ""
state = city.state&.name || ""
system_message =
"You are a global geography master, you understand the culture, geography, architecture, customs and other information of all cities around the world. Describe this city based on the city I gave you. Include details about its culture, climate, landmarks, and any unique features that make this place special. Condense the keyword into a description of about 50 words"
user_message =
"Describe the characteristics of the city of #{city.name}, located in the #{state}, #{country}, #{region}"
ask_ai(system_message, user_message)
end
def generate_image(prompt)
response = @client.images.generate(
parameters: {
model: "dall-e-3",
prompt: prompt,
size: "1792x1024",
quality: "standard",
n: 1
}
)
response.dig("data", 0, "url")
end
private
def ask_ai(system_message, user_message)
response = @client.chat(
parameters: {
model: "gpt-4",
message:
[ {
role: "System",
content: system_message
}, {
role: "User",
content: user_message
} ],
temperature: 0.7,
max_tokens: 300
}
)
response.dig("choices", 0, "message", "content")
end
def generate_dall_e_3_prompt_request(city, weather_data, city_desc)
region = city.country.region&.name || ""
country = city.country.name || ""
state = city.state&.name || ""
<<~PROMPT
Create a DALL-E 3 prompt for a weather scene in #{city.name}, #{state}, #{country}, #{region}.
Location Desc: #{city_desc}
Weather conditions:
- Temperature: #{weather_data[:temperature]}°C
- Weather: #{weather_data[:description]}
- Cloud cover: #{weather_data[:cloud]}%
- Time: #{weather_data[:time]}
Requirements:
- Feature iconic landmarks or architecture from #{city.name}
- Realistic style
- Weather conditions should be clearly visible
- Atmospheric and artistic composition
Generate a detailed, creative prompt that will produce a beautiful and realistic image.
PROMPT
end
end