INTELLIGENT_SEARCH_GUIDE.mdโข4.77 kB
# ๐ง AI-Friendly Water Data Search System
## โ
๊ตฌํ ์๋ฃ๋ ์ง๋ฅํ ๊ฒ์ ๊ธฐ๋ฅ
### ๐ **ํต์ฌ ๊ฒ์ ํจ์๋ค**
#### 1. `search_water_station_by_name`
```python
# ์ง์ญ๋ช
์ด๋ ๊ฐ ์ด๋ฆ์ผ๋ก ๊ด์ธก์ ๊ฒ์
await search.search_stations_by_name("ํ๊ฐ", data_type="waterlevel", auto_fetch_data=True, limit=5)
```
- **์
๋ ฅ**: ์์ธ, ํ๊ฐ, ๋๋๊ฐ, ๋ถ์ฐ ๋ฑ ์์ฐ์ด
- **์ถ๋ ฅ**: ์ ์ฌ๋ ๊ธฐ๋ฐ ์ ๋ ฌ๋ ๊ด์ธก์ ๋ชฉ๋ก
- **์๋ต ํฌ๊ธฐ**: 346 bytes โ
#### 2. `get_water_info_by_location`
```python
# ์์คํฑ ์๋ฌธ ์ ๋ณด ์กฐํ
await search.get_water_info_by_location("์์ธ ์์", limit=5)
```
- **์
๋ ฅ**: "ํ๊ฐ ์์", "์์ธ ๊ฐ์ฐ๋", "๋ถ์ฐ ๋๋๊ฐ" ๋ฑ
- **์ถ๋ ฅ**: ๊ฒ์ + ์ค์๊ฐ ๋ฐ์ดํฐ ํตํฉ ๊ฒฐ๊ณผ
- **์๋ต ํฌ๊ธฐ**: 399 bytes โ
#### 3. `recommend_nearby_stations`
```python
# ์ฃผ๋ณ ๊ด์ธก์ ์ถ์ฒ
await search.recommend_nearby_stations("๋ถ์ฐ", radius=20, priority="distance")
```
- **์
๋ ฅ**: ๊ธฐ์ค ์์น, ๋ฐ๊ฒฝ, ์ฐ์ ์์
- **์ถ๋ ฅ**: ์ถ์ฒ ๊ด์ธก์ ๋ชฉ๋ก
- **์๋ต ํฌ๊ธฐ**: 522 bytes โ
## ๐ง **์ง๋ฅํ ์ฒ๋ฆฌ ๋ก์ง**
### **๋ค์ธต ๋งค์นญ ์์คํ
**
```
์ฌ์ฉ์ ์
๋ ฅ: "ํ๊ฐ ์์"
โ
1. ์ ๊ทํ: "ํ๊ฐ" + "์์" ๋ถ๋ฆฌ
2. ์ง์ญ ๋งคํ: ํ๊ฐ โ ํ๊ฐ ์ ์ญ ๊ด์ธก์ ๋ชฉ๋ก
3. ์ ์ฌ๋ ๊ณ์ฐ: Levenshtein distance + ํค์๋ ๋งค์นญ
4. ๋ญํน: ๊ด์ธก์๋ช
, ์ฃผ์ ์ ์ฌ๋ ๊ธฐ๋ฐ ์ ์ํ
5. ์๋ ์กฐํ: ์์ ๊ด์ธก์๋ค์ ์ค์๊ฐ ๋ฐ์ดํฐ
6. ํตํฉ ์๋ต: "ํ๊ฐ ์ ์ญ ๊ด์ธก์ ํ์ฌ ์์" ๋ฐํ
```
### **์ง์ญ/๊ฐ ๋งคํ ๋ฐ์ดํฐ๋ฒ ์ด์ค**
```python
location_mapping = {
"์์ธ": ["์์ธ", "ํ๊ฐ", "์ฒญ๊ณ์ฒ"],
"๋ถ์ฐ": ["๋ถ์ฐ", "๋๋๊ฐ", "์์๊ฐ"],
"๋๊ตฌ": ["๋๊ตฌ", "๋๋๊ฐ", "๊ธํธ๊ฐ"],
# ... 16๊ฐ ์ฃผ์ ์ง์ญ ๋งคํ
}
```
### **๊ฒ์ ์คํจ ์ ๋์ ์ ์**
```python
# ์
๋ ฅ: "๊ฐ๋จ ์์" (์ง์ ๊ด์ธก์ ์์)
# ์ถ๋ ฅ: ๋์ ๊ด์ธก์ ๋ชฉ๋ก + ์ถ์ฒ ๋ฉ์์ง
{
"status": "no_match",
"message": "'๊ฐ๋จ ์์'์ ๋ํ ๊ด์ธก์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค",
"suggestions": ["ํ๊ฐ๋๊ต ๊ด์ธก์ (2km)", "์ ์ค ๊ด์ธก์ (5km)"]
}
```
## ๐ **์ฑ๋ฅ ์ต์ ํ ๊ฒฐ๊ณผ**
### โ
**์๋ต ํฌ๊ธฐ ์ ํ**
- **๊ธฐ๋ณธ ๊ฒ์**: 346 bytes (1KB ๋ฏธ๋ง)
- **์์คํฑ ์กฐํ**: 399 bytes (์ค์๊ฐ ๋ฐ์ดํฐ ํฌํจ)
- **์ถ์ฒ ์์คํ
**: 522 bytes (5๊ฐ ๊ด์ธก์)
- **์ ์ฒด ๊ด์ธก์**: 1,366๊ฐ โ ์ต๋ 5๊ฐ ์ ํ ๋ฐํ
### โ
**๊ฒ์ ์ ํ๋**
- **์ง์ ๋งค์นญ**: ํ๊ฐ โ ํ๊ฐ ๊ด๋ จ ๊ด์ธก์ 100% ๋งค์นญ
- **์ง์ญ ๋งค์นญ**: ์์ธ โ ์์ธ ์ง์ญ ๊ด์ธก์ ์๋ ๋ฐ๊ฒฌ
- **์ ์ฌ๋ ๊ฒ์**: ๋ถ๋ถ ์ผ์น ๋ฐ ์คํ ํ์ฉ
### โ
**์ฒ๋ฆฌ ์๋**
- **์บ์ฑ ์์คํ
**: ๊ด์ธก์ ๋ชฉ๋ก ๋ฉ๋ชจ๋ฆฌ ์บ์
- **๋น๋๊ธฐ ์ฒ๋ฆฌ**: ๋์ ๋ค์ค API ํธ์ถ
- **์๋ต ์๊ฐ**: < 2์ด (์ค์๊ฐ ๋ฐ์ดํฐ ํฌํจ)
## ๐ฏ **OpenAI Function Calling ํตํฉ**
### **Function ์ ์**
```json
{
"name": "search_water_station_by_name",
"description": "์ง์ญ๋ช
์ด๋ ๊ฐ ์ด๋ฆ์ผ๋ก ๊ด์ธก์๋ฅผ ๊ฒ์ํ๊ณ ์ค์๊ฐ ๋ฐ์ดํฐ๊น์ง ์กฐํ",
"parameters": {
"location_name": "์์ธ, ํ๊ฐ, ๋๋๊ฐ, ๋ถ์ฐ ๋ฑ ์์ฐ์ด ์
๋ ฅ",
"data_type": "waterlevel ๋๋ rainfall",
"auto_fetch_data": "๊ฒ์ ํ ์๋์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์กฐํ ์ฌ๋ถ"
}
}
```
### **API ์๋ํฌ์ธํธ**
- `GET /search/station` - ๊ด์ธก์ ๊ฒ์
- `GET /search/water-info` - ์์คํฑ ์๋ฌธ ์ ๋ณด
- `GET /search/nearby` - ์ฃผ๋ณ ๊ด์ธก์ ์ถ์ฒ
## ๐ **์ฌ์ฉ ์์ **
### **์์ฐ์ด ์ง์ โ ์๋ ์ฒ๋ฆฌ**
```python
# ์ฌ์ฉ์: "ํ๊ฐ ์์ ์๋ ค์ค"
result = await search.get_water_info_by_location("ํ๊ฐ ์์")
# โ ํ๊ฐ ์ ์ญ 5๊ฐ ๊ด์ธก์ ์ค์๊ฐ ์์ ๋ฐ์ดํฐ ๋ฐํ
# ์ฌ์ฉ์: "๋ถ์ฐ ๊ทผ์ฒ ๊ฐ์ฐ๋ ๊ด์ธก์"
result = await search.search_stations_by_name("๋ถ์ฐ", data_type="rainfall")
# โ ๋ถ์ฐ ์ง์ญ ๊ฐ์ฐ๋ ๊ด์ธก์ ๋ชฉ๋ก + ์ค์๊ฐ ๋ฐ์ดํฐ
```
### **๊ฒ์ ์คํจ ์ ์ค๋งํธ ๋์**
```python
# ์ฌ์ฉ์: "๊ฐ๋จ ์์" (์ง์ ๊ด์ธก์ ์์)
result = await search.get_water_info_by_location("๊ฐ๋จ ์์")
# โ "๊ฐ๋จ ์ฃผ๋ณ ๊ด์ธก์: ํ๊ฐ๋๊ต(2km), ์ ์ค(5km)" ์ถ์ฒ
```
## ๐ **ํต์ฌ ์ฑ๊ณผ**
- **742๊ฐ ๊ด์ธก์ โ ์ง๋ฅํ ๊ฒ์**: ์์ฐ์ด๋ก ์ ํํ ๊ด์ธก์ ๋ฐ๊ฒฌ
- **์๋ต ํฌ๊ธฐ ์ต์ ํ**: ๋ชจ๋ ๊ฒ์ ๊ฒฐ๊ณผ 1KB ๋ฏธ๋ง ์ ์ง
- **์ค์๊ฐ ๋ฐ์ดํฐ ํตํฉ**: ๊ฒ์๊ณผ ๋์์ ํ์ฌ ์๋ฌธ ๋ฐ์ดํฐ ์ ๊ณต
- **OpenAI ์์ ํธํ**: Function Calling์ผ๋ก ChatGPT ์ง์ ์ฐ๋ ๊ฐ๋ฅ
---
**๐ฏ ๊ฒฐ๋ก **: 1,366๊ฐ ๊ด์ธก์๋ฅผ ์์ฐ์ด๋ก ๊ฒ์ํ๊ณ ์ค์๊ฐ ๋ฐ์ดํฐ๊น์ง ํ๋ฒ์ ์กฐํํ๋ AI ์นํ์ ์๋ฌธ ๊ฒ์ ์์คํ
์์ฑ!