{"id":17767,"date":"2025-08-19T15:19:06","date_gmt":"2025-08-19T12:19:06","guid":{"rendered":"https:\/\/spatialworld.fi\/?page_id=17767"},"modified":"2025-11-06T10:05:07","modified_gmt":"2025-11-06T08:05:07","slug":"fme-blog-duckdb-llm-reporting","status":"publish","type":"page","link":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/","title":{"rendered":"kysymys-sql-raportti-fme-duckdb"},"content":{"rendered":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>Vastaa mihin tahansa kysymykseen mist\u00e4 tahansa aineistosta FME:n, DuckDB:n ja OpenAI:n avulla.<\/h1>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17854&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>Johdanto<\/h1>\n<p><strong>Tavoite: <\/strong>N\u00e4ytt\u00e4\u00e4 vaiheittain, miten hy\u00f6dynnet\u00e4\u00e4n FME:n joustavuutta ja orkestrointia, DuckDB:t\u00e4 ja LLM:i\u00e4 vastaamaan kysymyksiin aineistosta.<\/p>\n<p><strong>L\u00e4hestymistapa:<\/strong> Yhdist\u00e4mme FME:n vankan ingestoinnin, DuckDB:n nopean SQL+metadata-k\u00e4sittelyn ja kolme LLM-roolia (Planner, SQL Generator ja Analyst) tuottamaan kyselyt ja render\u00f6im\u00e4\u00e4n HTML-raportin.<\/p>\n<p><strong>Mit\u00e4 saat:<\/strong> Uudelleenk\u00e4ytett\u00e4v\u00e4 FME-ty\u00f6tila, joka muuntaa mink\u00e4 tahansa taulukkomuotoisen sy\u00f6tteen Parquet-muotoon, poimii skeeman\/tiivistelm\u00e4n\/otoksen, suunnittelee kysymykset, ajaa SQL:t ja tuottaa markdownista HTML-analyysin.<\/p>\n<p><strong>Aineisto:<\/strong><\/p>\n<p><a href=\"https:\/\/hri.fi\/data\/fi\/dataset\/helsingin-pyorailijamaarat\">Excel-tiedosto (suomenkieliset otsikot), jossa on p\u00e4ivitt\u00e4iset py\u00f6r\u00e4ilij\u00e4m\u00e4\u00e4r\u00e4t sensoripaikoittain Helsingiss\u00e4.<\/a><\/p>\n<p><strong>Mallipohja:<\/strong><\/p>\n<p>https:\/\/hub.safe.com\/publishers\/antoine\/templates\/llm_sql_report_demo<\/p>\n<p><strong>Esimerkkikysymys:<\/strong><\/p>\n<p>Miss\u00e4 on eniten py\u00f6r\u00e4ilij\u00f6it\u00e4? Milloin se tapahtuu?<\/p>\n<p><strong>P\u00e4\u00e4vaiheet ovat:<\/strong><\/p>\n<ol>\n<li>Muunna mik\u00e4 tahansa tiedosto v\u00e4liaikaiseksi Parquetiksi FME:ll\u00e4<\/li>\n<li>Suorita yksinkertainen analyysi Parquet-tiedostolle DuckDB:ll\u00e4 saadaksesi metatiedot<\/li>\n<li>Pyyd\u00e4 LLM:\u00e4\u00e4, jolle on sy\u00f6tetty metatiedot, tuottamaan formalisoituja kysymyksi\u00e4 ja SQL-kyselyj\u00e4, joilla kysymykseen voidaan vastata<\/li>\n<li>Pyyd\u00e4 toista, kevyemp\u00e4\u00e4 LLM:\u00e4\u00e4 generoimaan SQL-kyselyt ensimm\u00e4isen mallin yksinkertaisempien\/muodollisempien kysymysten pohjalta<\/li>\n<li>Aja kaikki SQL-kyselyt DuckDB:ll\u00e4 koko v\u00e4liaikaisessa taulussa<\/li>\n<li>LLM analysoi SQL-vastaukset suhteessa alkuper\u00e4iseen teht\u00e4v\u00e4\u00e4n<\/li>\n<li>FME ja LLM tuottavat yhdess\u00e4 HTML-raportin, joka vastaa kokonaiskysymyksiin<\/li>\n<\/ol>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1><span lang=\"en-FI\">1. Muunna mik\u00e4 tahansa tiedosto Parquetiksi<\/span><\/h1>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17855&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;center&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]FME on eritt\u00e4in tehokas ty\u00f6kalu, joka pystyy k\u00e4sittelem\u00e4\u00e4n satoja formaatteja sis\u00e4iseen muotoonsa. T\u00e4ss\u00e4 sy\u00f6tteen\u00e4 on (hieman erikoinen) suomenkielinen Excel. Muunnamme sen dynaamisesti Parquet-muotoon:<\/p>\n<ul>\n<li>BulkAttributeRenamer auttaa korvaamaan kaikki erikoismerkit, joita on voinut lipsahtaa attribuuttinimiin, alaviivalla \u201d_\u201d: [^\\p{L}\\p{N}_]<\/li>\n<li>SchemaScanner konsolidoi p\u00e4ivitetyn skeeman<\/li>\n<li>FeatureWriter kirjoittaa datan Parquet-muotoon, jolle sy\u00f6tet\u00e4\u00e4n sek\u00e4 data ett\u00e4 skeema<\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][image_with_animation image_url=&#8221;17856&#8243; image_size=&#8221;full&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>2. Suorita yksinkertainen analyysi<\/h1>\n<p>Koska emme voi sy\u00f6tt\u00e4\u00e4 koko taulukkoa LLM:lle, sy\u00f6t\u00e4mme sille metatiedot<\/p>\n<ul>\n<li>Taulun skeema<\/li>\n<li>Tilastollinen yhteenveto<\/li>\n<li>Otos<\/li>\n<\/ul>\n<h2>2.1 Tuota skeema<\/h2>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-17857 aligncenter\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png\" alt=\"\" width=\"217\" height=\"300\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png 217w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004.png 234w\" sizes=\"auto, (max-width: 217px) 100vw, 217px\" \/><\/a><\/p>\n<ul>\n<li>DatabaseQuerier<\/li>\n<\/ul>\n<p>Haluamme l\u00e4hett\u00e4\u00e4 taulun skeeman LLM:lle \u201dSQL\u201d-muodossa. DuckDB, jota kutsutaan FME:st\u00e4, mahdollistaa t\u00e4m\u00e4n seuraavalla kyselysarjalla:<\/p>\n<table width=\"100%\">\n<tbody>\n<tr>\n<td>FME_SQL_DELIMITER |<br \/>\nCREATE TABLE test_table AS<br \/>\nSELECT * FROMread_parquet(&#8216;@Value(_dataset)\/test_table.parquet&#8217;) LIMIT 10;|<br \/>\nEXPORT DATABASE &#8216;$(tempFolder)&#8217;;|<br \/>\nDROP TABLE test_table;|<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>T\u00e4m\u00e4 tuottaa joukon pieni\u00e4 tiedostoja taulusta; yksi niist\u00e4, \u201dschema.sql\u201d, sis\u00e4lt\u00e4\u00e4 CREATE TABLE -lauseen.<\/p>\n<ul>\n<li>AttributeFileReader lukee tiedoston attribuuttiin \u2014 t\u00e4ss\u00e4 \u201dschema.sql\u201d-tiedoston.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image006.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17859\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image006-300x150.png\" alt=\"\" width=\"300\" height=\"150\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image006-300x150.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image006.png 302w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h2>2.2 Tuota yhteenveto<\/h2>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image007.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-17860 aligncenter\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image007-300x75.png\" alt=\"\" width=\"300\" height=\"75\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image007-300x75.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image007-600x151.png 600w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image007.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>DuckDB tarjoaa Summarize-lauseen (https:\/\/DuckDB.org\/docs\/stable\/sql\/statements\/summarize). T\u00e4m\u00e4 antaa hyv\u00e4n kuvan siit\u00e4, miten kukin kentt\u00e4 on t\u00e4ytetty ja on t\u00e4rke\u00e4 taulun kyselyjen suunnittelussa. T\u00e4ss\u00e4kin luemme tuloksen takaisin attribuuttiin.<\/p>\n<p>&nbsp;<\/p>\n<h2>2.3 Tuota otos<\/h2>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image008.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-17861 aligncenter\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image008-300x43.png\" alt=\"\" width=\"300\" height=\"43\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image008-300x43.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image008.png 601w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<ul>\n<li>Select * LIMIT 3 taulusta<\/li>\n<li>ListBuilder, jotta saadaan vain yksi feature<\/li>\n<li>AttributeJSONPacker, jotta se on yhdess\u00e4 attribuutissa<\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>3. Kutsu LLM tuottamaan kysymykset ja SQL<\/h1>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image009.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17862\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image009-300x149.png\" alt=\"\" width=\"300\" height=\"149\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image009-300x149.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image009-600x299.png 600w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image009.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>T\u00e4ss\u00e4 tulee hieman enemm\u00e4n JSONia ja kokeilua. Meid\u00e4n pit\u00e4\u00e4 rakentaa ohjeistus, joka yhdist\u00e4\u00e4 uudet tiedot ja kysymyksemme niin, ett\u00e4 malli vastaa odotetulla tavalla.<\/p>\n<p>K\u00e4ytt\u00f6tapauksesta ja mallista riippuen rakenne voi vaihdella.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image010.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17863\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image010-300x68.png\" alt=\"\" width=\"300\" height=\"68\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image010-300x68.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image010.png 445w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<ul>\n<li>Task on k\u00e4ytt\u00e4j\u00e4n varsinainen kysymys.<\/li>\n<li>Format m\u00e4\u00e4rittelee halutun j\u00e4sennellyn ulostulon. Koska prosessin on toimittava mille tahansa kysymykselle, vastauksen on aina noudatettava m\u00e4\u00e4ritelty\u00e4 rakennetta, jotta voimme jatkaa prosessia.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image011.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17864\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image011-300x117.png\" alt=\"\" width=\"300\" height=\"117\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image011-300x117.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image011.png 615w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<ul>\n<li>User prompt yhdist\u00e4\u00e4 teht\u00e4v\u00e4n, vastausesimerkin jne.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image012.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17865\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image012-300x54.png\" alt=\"\" width=\"300\" height=\"54\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image012-300x54.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image012-600x108.png 600w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image012.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>System prompt asettaa s\u00e4\u00e4nn\u00f6t<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image013.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17866\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image013-300x105.png\" alt=\"\" width=\"300\" height=\"105\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image013-300x105.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image013.png 560w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>N\u00e4ill\u00e4 promptilla saamme JSON-ulostulon, josta voidaan vied\u00e4 formalisoidut kysymykset ja niiden SQL. Nopeus ja laatu riippuvat vahvasti mallivalinnasta.<\/p>\n<p>&nbsp;<\/p>\n<p>Meill\u00e4:<\/p>\n<ul>\n<li>Teht\u00e4v\u00e4 on v\u00e4lj\u00e4: miss\u00e4 on eniten py\u00f6r\u00e4ilij\u00f6it\u00e4? milloin se tapahtuu?<\/li>\n<li>Taulu on \u201dei niin hyvin suunniteltu\u201d Excel suomeksi.<\/li>\n<li>Vastaus on:<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image014.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17867\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image014-300x34.png\" alt=\"\" width=\"300\" height=\"34\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image014-300x34.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image014.png 601w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Ensimm\u00e4inen kysely yritt\u00e4\u00e4 antaa monimutkaisen kysymyksen\/kyselyn vastatakseen suoraan kysymykseen. Toissijaiset kysymykset\/SQL-kyselyt ovat yksinkertaisempia ja todenn\u00e4k\u00f6isemmin onnistuvat. Kaikki l\u00e4hetet\u00e4\u00e4n my\u00f6hemmin toiselle, nopeammalle ja edullisemmalle LLM:lle tuottamaan uusia kyselyit\u00e4. Mallista, teht\u00e4v\u00e4st\u00e4 ja aineistosta riippuen saatat tarvita useampia yrityksi\u00e4 saadaksesi kelvollisia ja hy\u00f6dyllisi\u00e4 tuloksia.<\/p>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>4. Tuota uusi joukko SQL-kyselyj\u00e4 kysymysten pohjalta<\/h1>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image015.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17868\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image015.png\" alt=\"\" width=\"280\" height=\"238\" \/><\/a><\/p>\n<p>Koska ensimm\u00e4isen LLM:n vastaus voi sis\u00e4lt\u00e4\u00e4 virheit\u00e4, pyyd\u00e4mme toista mallia toteuttamaan kaikki aiemmat kysymykset SQL:n\u00e4. T\u00e4m\u00e4 antaa pelivaraa virheille ja lis\u00e4\u00e4 vaihtelua edullisesti, koska valitsemme halvemman\/nopeamman mallin. Sen ei tarvitse ymm\u00e4rt\u00e4\u00e4 koko teht\u00e4v\u00e4\u00e4, koska se vastaa ensimm\u00e4isen mallin uudelleenmuotoilemiin kysymyksiin.<\/p>\n<p>Vaiheet ovat samat:<\/p>\n<ul>\n<li>Promptin valmistelu<br \/>\n<a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image016.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17869\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image016-300x65.png\" alt=\"\" width=\"300\" height=\"65\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image016-300x65.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image016.png 518w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/li>\n<\/ul>\n<ul>\n<li>API-kutsu<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image017.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17870\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image017-300x215.png\" alt=\"\" width=\"300\" height=\"215\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image017-300x215.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image017.png 460w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<ul>\n<li>JSONFlattener palatakseen klassisiin FME-attribuutteihin<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image018.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17871\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image018-300x46.png\" alt=\"\" width=\"300\" height=\"46\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image018-300x46.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image018.png 601w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Kuten n\u00e4et, prompti ja ulostulon muoto ovat yksinkertaisemmat. Vaadimme vain \u201dsql\u201d-elementin.<\/p>\n<p>Nyt meill\u00e4 on 8 kysely\u00e4: 4 plannerilta ja 4 toissijaisesta kutsusta.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image019.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17872\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image019-300x77.png\" alt=\"\" width=\"300\" height=\"77\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image019-300x77.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image019.png 601w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>5. Aja SQL-kyselyt<\/h1>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image020.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17873\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image020-300x280.png\" alt=\"\" width=\"300\" height=\"280\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image020-300x280.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image020.png 586w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Koska SQL-kysely FME:ss\u00e4 palauttaa n objektia tuntemattomalla skeemalla, p\u00e4\u00e4timme k\u00e4ytt\u00e4\u00e4 COPY-lausetta. Voisimme my\u00f6s k\u00e4ytt\u00e4\u00e4 ListBuilder + AttributeJSONPacker -yhdistelm\u00e4\u00e4, mutta tuloksena oleva JSON olisi voinut olla kauempana alkuper\u00e4isest\u00e4 vastauksesta.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 poistamme loppu-\u201d;\u201d-merkin StringReplacerilla.<\/p>\n<p>Koska \u201dCOPY\u201d tukee vain SELECT-lauseita, laitamme muut kyselyt SELECTin sis\u00e4\u00e4n.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image021.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17874\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image021-300x100.png\" alt=\"\" width=\"300\" height=\"100\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image021-300x100.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image021.png 392w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>SELECT-lauseille se on yksinkertaisempaa: lis\u00e4simme vain \u201dLIMIT 30\u201d kyselyiden loppuun, jotta v\u00e4ltymme suurilta tulostiedostoilta.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image022.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17875\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image022-300x98.png\" alt=\"\" width=\"300\" height=\"98\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image022-300x98.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image022.png 383w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Luemme j\u00e4lleen ulostulotiedoston attribuuttiin.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image023.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17876\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image023-300x72.png\" alt=\"\" width=\"300\" height=\"72\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image023-300x72.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image023-600x144.png 600w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image023.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>6. LLM-analyysi ja markdown-raportin generointi<\/h1>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image024.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17877\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image024-300x153.png\" alt=\"\" width=\"300\" height=\"153\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image024-300x153.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image024-600x308.png 600w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image024.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Kun olemme koonneet kaiken tarvittavan, FME loistaa sen uudelleenj\u00e4sentelyss\u00e4 LLM-analyysi\u00e4 varten. Teksti- ja JSON-transformereiden yhdistelm\u00e4ll\u00e4 voi rakentaa mink\u00e4 tahansa mallisen promptin.<\/p>\n<ul>\n<li>System prompt:<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image025.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17878\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image025-300x154.png\" alt=\"\" width=\"300\" height=\"154\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image025-300x154.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image025.png 437w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Kuten n\u00e4et, mik\u00e4\u00e4n ei ole aineistokohtaista \u2014 ainoastaan s\u00e4\u00e4nn\u00f6t. Valitsimme Markdownin, koska se on kevyt tokeneiden kannalta mutta riitt\u00e4v\u00e4n ilmaisukykyinen rakenteeseen. Mik\u00e4\u00e4n ei est\u00e4 tiivist\u00e4m\u00e4st\u00e4, k\u00e4\u00e4nt\u00e4m\u00e4st\u00e4 tai kaunistamasta raporttia my\u00f6hemmin edullisemmilla malleilla.<\/p>\n<ul>\n<li>User prompt:<\/li>\n<\/ul>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image026.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17879\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image026-300x188.png\" alt=\"\" width=\"300\" height=\"188\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image026-300x188.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image026.png 433w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>T\u00e4m\u00e4 prompti kokoaa yhteen kaiken ker\u00e4tyn olennaisen informaation ja antaa analyysille \u201drungon\u201d.<\/p>\n<p>Body:<a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image027.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17880\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image027-300x285.png\" alt=\"\" width=\"300\" height=\"285\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image027-300x285.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image027.png 329w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Muoto m\u00e4\u00e4ritet\u00e4\u00e4n, kuten aina, helppoa integrointia varten. Valitsemme t\u00e4ss\u00e4 \u00e4lykk\u00e4\u00e4mm\u00e4n mallin, koska tietoa on paljon ja se pit\u00e4\u00e4 sovittaa alkuper\u00e4iseen teht\u00e4v\u00e4\u00e4n. Itse asiassa gpt5 on viel\u00e4 parempi, mutta selv\u00e4sti kalliimpi.<\/p>\n[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<h1>7. Raportti HTML:ksi<\/h1>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image028.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17881\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image028-300x116.png\" alt=\"\" width=\"300\" height=\"116\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image028-300x116.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image028.png 533w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Kun Markdown-raportti on valmis, sen voi k\u00e4\u00e4nt\u00e4\u00e4 helposti mihin tahansa ulostulomuotoon. Me valitsimme HTML-tiedoston.<\/p>\n<p>T\u00e4t\u00e4 varten meill\u00e4 on HTML-attribuutti, jossa on placeholder markdown-elementille \u2014 sijoitamme raportin siihen.<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image029.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-17882\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image029.png\" alt=\"\" width=\"271\" height=\"241\" \/><\/a><\/p>\n<p>Kun teksti on valmis, HTML-writer sijoittaa sen haluttuun paikkaan.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image030.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-17883\" src=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image030-300x227.png\" alt=\"\" width=\"300\" height=\"227\" srcset=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image030-300x227.png 300w, https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image030.png 602w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text css=&#8221;&#8221; text_direction=&#8221;default&#8221;]\n<p id=\"ember800\" class=\"ember-view reader-text-block__paragraph\">Onneksi olkoon! Raportti on siisti \u2014 kohdat rajoitteista ja seuraavista askelista ovat t\u00e4rkeit\u00e4, koska ne vihjaavat kahdesta asiasta:<\/p>\n<ul>\n<li>Menik\u00f6 malli liikaa oman mielikuvituksen varaan?<\/li>\n<li>Voisiko pyyt\u00e4\u00e4 toista kierrosta paremmilla kysymyksill\u00e4 t\u00e4m\u00e4n ulostulon pohjalta (agenttimainen toiminta)?<\/li>\n<\/ul>\n<h1 id=\"ember802\" class=\"ember-view reader-text-block__heading-2\">Yhteenveto<\/h1>\n<p id=\"ember803\" class=\"ember-view reader-text-block__paragraph\">Erottamalla <strong>ingestoinnin<\/strong>, <strong>profiloinnin<\/strong>, <strong>suunnittelun<\/strong>, <strong>kyselyn<\/strong>, <strong>analyysin<\/strong> ja <strong>raportoinnin<\/strong> pystyimme muuttamaan sekavan, suomenkielisen Excel-taulukon selkeiksi vastauksiksi Helsingin py\u00f6r\u00e4ilykuvioista ilman k\u00e4sin kirjoitettuja SQL-lauseita. FME hoiti orkestroinnin ja formaattien k\u00e4sittelyn, DuckDB tarjosi nopean, paikallisen SQL:n Parquetin p\u00e4\u00e4lle, ja kolme fokusoitua LLM-roolia (Planner \u2192 SQL Generator \u2192 Analyst) pitiv\u00e4t ty\u00f6nkulun luotettavana ja kustannustietoisena.<\/p>\n<p id=\"ember804\" class=\"ember-view reader-text-block__paragraph\">Tuloksena on uudelleenk\u00e4ytett\u00e4v\u00e4 putki, jonka voi suunnata l\u00e4hes mihin tahansa aineistoon, ja edet\u00e4 <em>kysymyksest\u00e4 \u2192 kyselyihin \u2192 oivaltavaan HTML-raporttiin<\/em>.<\/p>\n<p id=\"ember805\" class=\"ember-view reader-text-block__paragraph\">Yht\u00e4 t\u00e4rke\u00e4\u00e4 kuin tulos on kurinalaisuus sen takana: vain pieni\u00e4, merkityksellisi\u00e4 tietoviipaleita (skeema, yhteenvetotilastot, esimerkkirivit) l\u00e4hetettiin malleille; laitoimme kaiteet SQL-suorituksen ymp\u00e4rille (COPY (SELECT \u2026), puolipisteen poisto, tulosrajoitukset); ja ohjasimme analyytikkovaiheen p\u00e4\u00e4ttelem\u00e4\u00e4n nimetyist\u00e4 tulosjoukoista eik\u00e4 raakadata-tauluista. N\u00e4in LLM:t pysyv\u00e4t omalla tontillaan ja varsinainen dataty\u00f6 siell\u00e4 miss\u00e4 sen kuuluukin olla.<\/p>\n<h3 id=\"ember806\" class=\"ember-view reader-text-block__heading-3\">Mit\u00e4 nyt on k\u00e4siss\u00e4<\/h3>\n<ul>\n<li><strong>Template-ty\u00f6tila<\/strong>, joka standardoi mink\u00e4 tahansa taulun Parquetiksi ja prof iloi sen jatko\u00e4ly\u00e4 varten.<\/li>\n<li><strong>Toistettava promptimalli<\/strong>: Planner rakenteelle, kevyempi malli SQL:lle, raskaampi malli synteesille.<\/li>\n<li><strong>Raportointipolku<\/strong>, joka muuntaa Markdownin jaettavaksi HTML:ksi v\u00e4h\u00e4ll\u00e4 liimalla.<\/li>\n<\/ul>\n<h3 id=\"ember808\" class=\"ember-view reader-text-block__heading-3\">Minne seuraavaksi<\/h3>\n<ul>\n<li>M\u00e4\u00e4rit\u00e4 kukin p\u00e4\u00e4vaihe omaksi prosessikseen, jotta voit rakentaa joustavia automaatioita FME Flow\u2019hun.<\/li>\n<li>T\u00e4ydenn\u00e4 raporttia luotettavilla \u201draakametatiedoilla\u201d ja yhteenvedoilla profilointity\u00f6kaluista, kuten Pandas profiling.<\/li>\n<\/ul>\n<h3 id=\"ember810\" class=\"ember-view reader-text-block__heading-3\">Lopuksi<\/h3>\n<p id=\"ember811\" class=\"ember-view reader-text-block__paragraph\">Voima ei ole vain siin\u00e4, ett\u00e4 LLM:t osaavat kirjoittaa SQL:\u00e4\u00e4 \u2014 vaan siin\u00e4, ett\u00e4 oikeilla rajoilla ja rooleilla ne auttavat kysym\u00e4\u00e4n parempia kysymyksi\u00e4 ja automatisoimaan tyls\u00e4t osuudet. Pid\u00e4 vaiheiden v\u00e4liset sopimukset tiukkoina, mittaa olennaista (laatu, kustannus, viive), niin t\u00e4m\u00e4 malli skaalautuu yksitt\u00e4isest\u00e4 Helsingin py\u00f6r\u00e4laskurista koko datakantaan.<\/p>\n[\/vc_column_text][\/vc_column][\/vc_row]","protected":false},"excerpt":{"rendered":"<p>[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;&#8230;<\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17767","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>kysymys-sql-raportti-fme-duckdb - Spatialworld Oy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/\" \/>\n<meta property=\"og:locale\" content=\"fi_FI\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"kysymys-sql-raportti-fme-duckdb - Spatialworld Oy\" \/>\n<meta property=\"og:description\" content=\"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/\" \/>\n<meta property=\"og:site_name\" content=\"Spatialworld Oy\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-06T08:05:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png\" \/>\n<meta name=\"twitter:label1\" content=\"Arvioitu lukuaika\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minuuttia\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/\",\"url\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/\",\"name\":\"kysymys-sql-raportti-fme-duckdb - Spatialworld Oy\",\"isPartOf\":{\"@id\":\"https:\/\/spatialworld.fi\/fi\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/spatialworld.fi\/fme-blog-duckdb-llm-reporting\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png\",\"datePublished\":\"2025-08-19T12:19:06+00:00\",\"dateModified\":\"2025-11-06T08:05:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#breadcrumb\"},\"inLanguage\":\"fi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/\"]]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fi\",\"@id\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#primaryimage\",\"url\":\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png\",\"contentUrl\":\"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/spatialworld.fi\/fi\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"fme-duckdb-llm-reporting\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/spatialworld.fi\/fi\/#website\",\"url\":\"https:\/\/spatialworld.fi\/fi\/\",\"name\":\"Spatialworld Oy\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/spatialworld.fi\/fi\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fi\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"kysymys-sql-raportti-fme-duckdb - Spatialworld Oy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/","og_locale":"fi_FI","og_type":"article","og_title":"kysymys-sql-raportti-fme-duckdb - Spatialworld Oy","og_description":"[vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221;...","og_url":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/","og_site_name":"Spatialworld Oy","article_modified_time":"2025-11-06T08:05:07+00:00","og_image":[{"url":"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png","type":"","width":"","height":""}],"twitter_misc":{"Arvioitu lukuaika":"12 minuuttia"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/","url":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/","name":"kysymys-sql-raportti-fme-duckdb - Spatialworld Oy","isPartOf":{"@id":"https:\/\/spatialworld.fi\/fi\/#website"},"primaryImageOfPage":{"@id":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#primaryimage"},"image":{"@id":"https:\/\/spatialworld.fi\/fme-blog-duckdb-llm-reporting\/#primaryimage"},"thumbnailUrl":"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png","datePublished":"2025-08-19T12:19:06+00:00","dateModified":"2025-11-06T08:05:07+00:00","breadcrumb":{"@id":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#breadcrumb"},"inLanguage":"fi","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/"]]}]},{"@type":"ImageObject","inLanguage":"fi","@id":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#primaryimage","url":"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png","contentUrl":"https:\/\/spatialworld.fi\/wp-content\/uploads\/2025\/11\/image004-217x300.png"},{"@type":"BreadcrumbList","@id":"https:\/\/spatialworld.fi\/fi\/fme-blog-duckdb-llm-reporting\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/spatialworld.fi\/fi\/"},{"@type":"ListItem","position":2,"name":"fme-duckdb-llm-reporting"}]},{"@type":"WebSite","@id":"https:\/\/spatialworld.fi\/fi\/#website","url":"https:\/\/spatialworld.fi\/fi\/","name":"Spatialworld Oy","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spatialworld.fi\/fi\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fi"}]}},"_links":{"self":[{"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/pages\/17767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/comments?post=17767"}],"version-history":[{"count":21,"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/pages\/17767\/revisions"}],"predecessor-version":[{"id":17949,"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/pages\/17767\/revisions\/17949"}],"wp:attachment":[{"href":"https:\/\/spatialworld.fi\/fi\/wp-json\/wp\/v2\/media?parent=17767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}