diff --git a/backend/app/data/schema_view.py b/backend/app/data/schema_view.py index 9f95bd66..1b3ef7cb 100644 --- a/backend/app/data/schema_view.py +++ b/backend/app/data/schema_view.py @@ -17,6 +17,11 @@ agent 看到的目录少了遮罩列那部分(README 写明)。 文档是表名、注释、目录里的中文名 / 粒度 / 说明、列名、列的中文名(遮罩列只用列名);探查范围外的对象只按名字和注释参与, 权重低一档。切词用 memory/embeddings._tokens(英文按词、中文按字补二元组)加 catalog.name_words(下划线、驼峰拆词)。 +**限制:范围外、又没有注释的对象,中文需求命不中。** 它只剩英文名可检索,英文名拆出的词没有中文说法:仓库里没有现成的英中 +业务词对照(命名推断只拆词、不翻译,catalog.name_words 也一样),这里不临时编一份词表(编出来的覆盖不全、还会把不相干的表 +抬上来),所以「上周的退款」找不到只叫 refund_orders、没写注释的表。真库多半有注释,注释照常参与检索,影响小;范围内的表另有 +目录里的中文名、列名可配。要用这张表时按英文名点名查看(会按需加入),或者请管理员把它加进探查范围、补上注释或目录的中文名。 + **三种「不在」**(absent_detail):表已不在、在探查范围外、在范围里却读不到结构,说法分开;只有真删除才说「表已不在」。 只读:只看表结构缓存(schema_cache)和调用方读好的数据目录、剖析事实、对象索引,不碰业务库。这里的文字都是写给模型看的, @@ -342,6 +347,7 @@ def _doc_text(name: str, meta: Mapping[str, Any] | None, notes: Mapping[str, Any def _outside_text(name: str, comment: str | None) -> str: + """一个范围外对象的检索文档:名字、名字拆出的词、注释。没有注释的只有英文(见模块说明的限制)。""" from app.data.catalog import name_words return " ".join([name, " ".join(name_words(name)), comment or ""]) diff --git a/backend/tests/test_look_large.py b/backend/tests/test_look_large.py index aaad0f73..584435e8 100644 --- a/backend/tests/test_look_large.py +++ b/backend/tests/test_look_large.py @@ -236,3 +236,20 @@ async def test_out_of_scope_parent_is_not_called_missing(big): checks = catalog_profile.plan_checks("ord_hdr_east", tables["ord_hdr_east"], {"relations": [rel]}, tables=tables, masked=set(), outside=outside) assert [c for c in checks if c.kind == "relation"][0].skip[0] == "missing" + + +def test_out_of_scope_objects_without_a_comment_match_only_their_english_name(): + """范围外、又没有注释的对象只有英文名可检索(data/schema_view 模块说明写明的限制):英文名拆出的词(catalog.name_words) + 没有中文说法——仓库里没有现成的英中业务词对照,不临时编词表,中文需求命不中只叫 refund_orders 的表;有注释的照常命中。 + 以后接了词表,这条要跟着改。""" + from types import SimpleNamespace + + from app.data import schema_view + + source = SimpleNamespace(schema_cache={"tables": {}}, options={}) + outside = [SimpleNamespace(name="refund_orders", comment=None), + SimpleNamespace(name="cust_complaint", comment="客户投诉单")] + search = schema_view.TableSearch(source, {}, outside) + assert [h.name for h in search.search("refund", limit=5)] == ["refund_orders"], "英文名、拆出的词照常命中" + assert "refund_orders" not in [h.name for h in search.search("上周的退款", limit=5)], "没有注释、没有词表:中文需求命不中英文名" + assert [h.name for h in search.search("投诉", limit=5)] == ["cust_complaint"], "有注释的按注释命中"