Skip to content

[feat] Extract and enrich multiple places from one captionย #8

@KyungminPark-steck

Description

@KyungminPark-steck

๐Ÿ“– ๋ฐฐ๊ฒฝ

ํ˜„์žฌ processing-server๋Š” Instagram caption์—์„œ ์žฅ์†Œ ์ •๋ณด๋ฅผ ๋‹จ์ผ store_name/address๋กœ ์ถ”์ถœํ•˜๊ณ , Kakao Local ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋„ ๋‹จ์ผ selected_place ์ค‘์‹ฌ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ caption ์•ˆ์— ์—ฌ๋Ÿฌ ์žฅ์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํฌํ•จ๋˜๋Š” ๊ฒŒ์‹œ๋ฌผ์ด ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋””์ €ํŠธ ์นดํŽ˜ ์ถ”์ฒœ caption์—์„œ ํ”Œ๋ฃจ๋ฐ, ๋ˆ„ํฌ๋…น, ์˜ˆ์ฑ , ๋ผ๋šœ์…ฉํŠธ, ์ฝ”์ดํฌ, ์นดํŽ˜ํ† ์š”์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ place_name๊ณผ ์ฃผ์†Œ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค.

๋˜ํ•œ ์‹ค์ œ caption์—์„œ๋Š” ์ƒํ˜ธ๋ช…์ด #ํ”Œ๋ฃจ๋ฐ์ฒ˜๋Ÿผ hashtag ํ˜•ํƒœ๋กœ ๋“ฑ์žฅํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์–ด, ๊ธฐ์กด ๋‹จ์ผ ์ถ”์ถœ prompt๋งŒ์œผ๋กœ๋Š” ๋‹ค์ค‘ ์žฅ์†Œ์™€ hashtag ๊ธฐ๋ฐ˜ ์ƒํ˜ธ๋ช…์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๐ŸŽฏ ๋ชฉํ‘œ

ํ•˜๋‚˜์˜ caption์—์„œ ์—ฌ๋Ÿฌ ์žฅ์†Œ ํ›„๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ , ๊ฐ ์žฅ์†Œ๋ฅผ Kakao Local API๋กœ enrichmentํ•œ ๋’ค, ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  Kakao ์žฅ์†Œ ๊ฒฐ๊ณผ๋ฅผ DB/API ์‘๋‹ต์— ์ €์žฅํ•œ๋‹ค.

๊ธฐ์กด ๋‹จ์ผ ์žฅ์†Œ caption๊ณผ ๊ธฐ์กด ์‘๋‹ต ํ•„๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ์œ ์ง€ํ•˜๋ฉด์„œ, ์‹ ๊ทœ ๋‹ค์ค‘ ์žฅ์†Œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๐Ÿ› ๏ธ ๊ตฌํ˜„ ๋‚ด์šฉ

  • LLM extraction schema๋ฅผ ๋‹ค์ค‘ ์žฅ์†Œ ๋ฐฐ์—ด ์ค‘์‹ฌ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค.
    • extraction_result.places์— ์ „์ฒด extracted place ๋ชฉ๋ก์„ ์ €์žฅํ•œ๋‹ค.
    • ๊ธฐ์กด store_name, address, store_name_evidence, address_evidence, certainty๋Š” ์ฒซ ๋ฒˆ์งธ extracted place ๊ธฐ์ค€ legacy ๋Œ€ํ‘œ๊ฐ’์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • extraction prompt๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค.
    • ๋ฒˆํ˜ธ ๋ชฉ๋ก(โถ, โท, 1., 2. ๋“ฑ), ๋ธŒ๋žœ๋“œ ์ •๋ณด, ๋งค์žฅ ์ •๋ณด, ์žฅ์†Œ ์ •๋ณด ์„น์…˜์„ ์ธ์‹ํ•œ๋‹ค.
    • place name line๊ณผ ์ด์–ด์ง€๋Š” ์ฃผ์†Œ line์„ pair๋กœ ๋ฌถ๋Š”๋‹ค.
    • ๐Ÿ“, ์ฃผ์†Œ, ์œ„์น˜, ์„œ์šธ, ๊ตฌ, ๋™, ๋กœ, ๊ธธ ๋“ฑ ์ฃผ์†Œ ๋‹จ์„œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
    • #ํ”Œ๋ฃจ๋ฐ์ฒ˜๋Ÿผ hashtag๊ฐ€ ์‹ค์ œ ์ƒํ˜ธ๋ช…์ธ ๊ฒฝ์šฐ ํ›„๋ณด๋กœ ๊ณ ๋ คํ•œ๋‹ค.
    • #์„œ์šธ์นดํŽ˜, #์—ฐ๋‚จ์นดํŽ˜, #๋ง›์ง‘์ถ”์ฒœ ๊ฐ™์€ ์ง€์—ญ/์นดํ…Œ๊ณ ๋ฆฌ/ํ™๋ณด์„ฑ hashtag๋Š” ์ƒํ˜ธ๋ช…์œผ๋กœ ์ถ”์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ extracted place์— ๋Œ€ํ•ด ๊ธฐ์กด Kakao Local ๊ฒ€์ƒ‰ ์ •์ฑ…์„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•œ๋‹ค.
    • LLM address๋Š” ๊ฒ€์ƒ‰ ํžŒํŠธ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ €์žฅ ์žฅ์†Œ ์ •๋ณด๋Š” Kakao Local API ์‘๋‹ต ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
    • ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ํ›„๋ณด๋ฅผ ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
    • kakao_min_place_confidence=0.7 ๊ธฐ์ค€์„ ์œ ์ง€ํ•œ๋‹ค.
    • ์„ ํƒ ๊ฐ€๋Šฅํ•œ ํ›„๋ณด๋งŒ place_candidates์— ์ €์žฅํ•œ๋‹ค.
  • ๋‹ค์ค‘ ์„ ํƒ ๊ฒฐ๊ณผ ์ €์žฅ์„ ์œ„ํ•ด DB schema migration์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • selected_places JSONB NOT NULL DEFAULT '[]'::jsonb
  • API ์‘๋‹ต schema์— selected_places๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๊ธฐ์กด selected_place๋Š” legacy ๋Œ€ํ‘œ๊ฐ’์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.
    • ๋‹จ์ผ caption์—์„œ๋Š” ๊ธฐ์กด ๋™์ž‘๊ณผ ๋™์ผํ•˜๊ฒŒ selected ๊ฒฐ๊ณผ 1๊ฐœ๋ฅผ ๋‹ด๋Š”๋‹ค.
    • ๋‹ค์ค‘ caption์—์„œ๋Š” caption ๋“ฑ์žฅ ์ˆœ์„œ ๊ธฐ์ค€ ์ฒซ ๋ฒˆ์งธ selected place๋ฅผ ๋‹ด๋Š”๋‹ค.
  • Kakao ๋งค์นญ ์‹คํŒจํ•œ extracted place๋Š” extraction_result.places์—๋Š” ๋‚จ๊ธฐ๊ณ , selected_places/place_candidates์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹จ์ผ ์žฅ์†Œ caption ๊ธฐ์กด ํ…Œ์ŠคํŠธ์™€ ๋‹ค์ค‘ ์žฅ์†Œ caption ์‹ ๊ทœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•œ๋‹ค.

โš ๏ธ ๊ณ ๋ ค์‚ฌํ•ญ

  • DB schema ๋ณ€๊ฒฝ์€ ๋ฐ˜๋“œ์‹œ migration SQL๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๊ธฐ์กด API ์†Œ๋น„์ž๊ฐ€ selected_place ๋˜๋Š” extraction_result.store_name์„ ์‚ฌ์šฉ ์ค‘์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ํ•„๋“œ๋Š” legacy ๋Œ€ํ‘œ๊ฐ’์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • ์‹ ๊ทœ ๋‹ค์ค‘ ์žฅ์†Œ ์†Œ๋น„์ž๋Š” extraction_result.places์™€ selected_places๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‹ค์ค‘ caption์—์„œ๋Š” Kakao Local API ํ˜ธ์ถœ ์ˆ˜๊ฐ€ extracted place ์ˆ˜๋งŒํผ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ extraction_max_candidates ์ œํ•œ์„ ์ ์šฉํ•œ๋‹ค.
  • selected_place๋Š” ๋‹ค์ค‘ ๊ฒฐ๊ณผ์˜ ์ „์ฒด ์˜๋ฏธ๋ฅผ ๋‹ด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ๋‹ค์ค‘ ์žฅ์†Œ ์ฒ˜๋ฆฌ๋Š” selected_places๋ฅผ authoritative field๋กœ ๋ณธ๋‹ค.

โœ… ์™„๋ฃŒ ์กฐ๊ฑด

  • ์˜ˆ์‹œ caption์—์„œ ํ”Œ๋ฃจ๋ฐ, ๋ˆ„ํฌ๋…น, ์˜ˆ์ฑ , ๋ผ๋šœ์…ฉํŠธ, ์ฝ”์ดํฌ, ์นดํŽ˜ํ† ์š”๊ฐ€ ๋ชจ๋‘ extraction_result.places์— ์ถ”์ถœ๋œ๋‹ค.
  • #์ƒํ˜ธ๋ช… ํ˜•ํƒœ์˜ hashtag๊ฐ€ ์‹ค์ œ place name์ธ ๊ฒฝ์šฐ ์ถ”์ถœ ํ›„๋ณด๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ์ง€์—ญ/์นดํ…Œ๊ณ ๋ฆฌ/ํ™๋ณด์„ฑ hashtag๋Š” place name์œผ๋กœ ์˜ค์ถ”์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ extracted place์— ๋Œ€ํ•ด Kakao Local enrichment๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.
  • confidence ๊ธฐ์ค€์„ ํ†ต๊ณผํ•œ Kakao ํ›„๋ณด๋งŒ place_candidates์— ์ €์žฅ๋œ๋‹ค.
  • ๋งค์นญ ์„ฑ๊ณตํ•œ ์žฅ์†Œ๋“ค์ด selected_places๋กœ DB์— ์ €์žฅ๋˜๊ณ  API ์‘๋‹ต์—์„œ ํ™•์ธ๋œ๋‹ค.
  • ๊ธฐ์กด selected_place๋Š” legacy ๋Œ€ํ‘œ๊ฐ’์œผ๋กœ ์œ ์ง€๋œ๋‹ค.
  • DB schema ๋ณ€๊ฒฝ์ด migration SQL์— ํฌํ•จ๋œ๋‹ค.
  • ๋‹จ์ผ ์žฅ์†Œ caption ๊ธฐ์กด ํ…Œ์ŠคํŠธ์™€ ๋‹ค์ค‘ ์žฅ์†Œ caption ์‹ ๊ทœ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ํ†ต๊ณผํ•œ๋‹ค.

Metadata

Metadata

Assignees

No one assigned

    Labels

    feat์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions