feat: implement LLM keyword extraction and fusion scoring for table matching

- Add extract_keywords() to LLMService with conversation context support,
  using process_stream + start_log/end_log for logging consistency
- Add expand_with_terminology() to expand keywords with synonym matching
- Add fusion scoring in calc_table_embedding(): α * vec_score + (1-α) * keyword_score
- Add calc_keyword_score() with multi-level matching:
  table name exact (1.0), comment exact (0.9), comment substring (0.7),
  table name partial (0.25-0.5), field comment exact (0.5),
  field comment substring (0.4), field name partial (0.3)
- Scoring considers keyword coverage rate to differentiate tables
  with different numbers of matched keywords
- Extracted keywords persisted to ChatRecord for reuse across endpoints
- get_terminology_template() supports comma-separated keyword input
  with per-keyword matching for higher precision
- Add TABLE_EMBEDDING_ALPHA and TABLE_EMBEDDING_KEYWORD_ENABLED config
This commit is contained in:
ulleo
2026-09-14 17:51:45 +08:00
committed by ulleo
parent aac200aef5
commit 3fd6fa867d
15 changed files with 1200 additions and 29 deletions
+13
View File
@@ -128,6 +128,8 @@ class Settings(BaseSettings):
TABLE_EMBEDDING_ENABLED: bool = True
TABLE_EMBEDDING_COUNT: int = 10
TABLE_EMBEDDING_ALPHA: float = 0.4 # weight for vector score; (1-alpha) is keyword weight
TABLE_EMBEDDING_KEYWORD_ENABLED: bool = True
DS_EMBEDDING_COUNT: int = 10
ORACLE_CLIENT_PATH: str = '/opt/sqlbot/db_client/oracle_instant_client'
@@ -138,6 +140,7 @@ class Settings(BaseSettings):
'PARSE_REASONING_BLOCK_ENABLED',
'PG_POOL_PRE_PING',
'TABLE_EMBEDDING_ENABLED',
'TABLE_EMBEDDING_KEYWORD_ENABLED',
mode='before')
@classmethod
def lowercase_bool(cls, v: Any) -> Any:
@@ -150,5 +153,15 @@ class Settings(BaseSettings):
return False
return v
@field_validator('TABLE_EMBEDDING_ALPHA', mode='before')
@classmethod
def clamp_alpha(cls, v: Any) -> float:
"""将 TABLE_EMBEDDING_ALPHA 限制在 [0.0, 1.0] 范围内"""
try:
v = float(v)
except (TypeError, ValueError):
return 0.4
return max(0.0, min(1.0, v))
settings = Settings() # type: ignore