This commit is contained in:
2026-07-15 08:29:21 +07:00
parent 55cc0f78c9
commit 6fb2d5f82b
+96
View File
@@ -767,6 +767,54 @@ julia> conn = "host=localhost port=5432 dbname=winedb user=admin password=secret
julia> fruits = GeneralUtils.harvest_entity_catalog(conn, "products", "fruit_name") julia> fruits = GeneralUtils.harvest_entity_catalog(conn, "products", "fruit_name")
["Apple", "Banana", "Orange", "Mango"] ["Apple", "Banana", "Orange", "Mango"]
``` ```
# Integration Guide: Finding Closest Entity Match in Database
When users type queries, they often make typos or use abbreviations. This function finds
the closest matching entity from a database column, handling common input errors.
**Example:**
```julia
# Database contains: ["Hand Old Bar & Grill", "Hand Old", "Wine Cellar"]
# User types: "HandOld" (compressed words, missing space)
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "venues", "name")
closest = GeneralUtils.resolve_entity("HandOld", catalog; threshold=0.9)
# Returns: "Hand Old Bar & Grill" (closest match)
```
**Step 1: Extract all valid values from a column**
```julia
# Get all wine names from the database
wine_names = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", "wine_name")
# Returns: ["Château Margaux", "Château Lafite", "Domaine Leroy", ...]
```
**Step 2: Find closest match for user input**
```julia
# User types a wine name with a typo
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", "wine_name")
closest_wine = GeneralUtils.resolve_entity("Chateu Margaux", catalog; threshold=0.9)
# Returns: "Château Margaux" (closest match)
```
**Step 3: Resolve all fields in a response**
```julia
# Agent produces a response with potentially misspelled values
responsedict = Dict("wine_name" => "Chateu Margaux", "region" => "Bord")
# For each field, find the closest match in the database
for (k, v) in responsedict
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", k)
resolved = GeneralUtils.resolve_entity(v, catalog; threshold=0.9)
responsedict[k] = resolved # Replace messy input with database entity
end
```
**Threshold guidance:**
- `threshold=0.5` - Lenient, may return false positives
- `threshold=0.7` - Moderate balance
- `threshold=0.9` - Strict, only high-confidence matches
- Returns `""` when no match meets threshold
""" """
function harvest_entity_catalog(pg_conn_str::String, table::String, column::String)::Vector{String} function harvest_entity_catalog(pg_conn_str::String, table::String, column::String)::Vector{String}
conn = LibPQ.Connection(pg_conn_str) conn = LibPQ.Connection(pg_conn_str)
@@ -832,6 +880,54 @@ julia> GeneralUtils.resolve_entity("Wine Cellar", catalog; threshold=0.5)
julia> GeneralUtils.resolve_entity("Unknown Place", catalog; threshold=0.5) julia> GeneralUtils.resolve_entity("Unknown Place", catalog; threshold=0.5)
"" ""
``` ```
# Integration Guide: Finding Closest Entity Match in Database
When users type queries, they often make typos or use abbreviations. This function finds
the closest matching entity from a database column, handling common input errors.
**Example:**
```julia
# Database contains: ["Hand Old Bar & Grill", "Hand Old", "Wine Cellar"]
# User types: "HandOld" (compressed words, missing space)
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "venues", "name")
closest = GeneralUtils.resolve_entity("HandOld", catalog; threshold=0.9)
# Returns: "Hand Old Bar & Grill" (closest match)
```
**Step 1: Extract all valid values from a column**
```julia
# Get all wine names from the database
wine_names = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", "wine_name")
# Returns: ["Château Margaux", "Château Lafite", "Domaine Leroy", ...]
```
**Step 2: Find closest match for user input**
```julia
# User types a wine name with a typo
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", "wine_name")
closest_wine = GeneralUtils.resolve_entity("Chateu Margaux", catalog; threshold=0.9)
# Returns: "Château Margaux" (closest match)
```
**Step 3: Resolve all fields in a response**
```julia
# Agent produces a response with potentially misspelled values
responsedict = Dict("wine_name" => "Chateu Margaux", "region" => "Bord")
# For each field, find the closest match in the database
for (k, v) in responsedict
catalog = GeneralUtils.harvest_entity_catalog(pg_conn_str, "wine", k)
resolved = GeneralUtils.resolve_entity(v, catalog; threshold=0.9)
responsedict[k] = resolved # Replace messy input with database entity
end
```
**Threshold guidance:**
- `threshold=0.5` - Lenient, may return false positives
- `threshold=0.7` - Moderate balance
- `threshold=0.9` - Strict, only high-confidence matches
- Returns `""` when no match meets threshold
""" """
function resolve_entity(messy_input::String, catalog::Vector{String}; threshold=0.5)::String function resolve_entity(messy_input::String, catalog::Vector{String}; threshold=0.5)::String
best_match = "" best_match = ""