已经有明确的问题,直接调用 analyze();还没想好从哪里入手,可以先用 suggest() 找分析方向。想先检查生成的代码、再决定是否执行,就把 translate() 和 query() 分开调用。
下面的示例假定已经配置好 ava,并通过 source() 加载了数据。安装与完整配置示例见安装与快速开始。
示例沿用快速开始中的小型销售数据集:
| region | revenue |
|---|---|
| East | 120 |
| West | 90 |
| East | 80 |
提出分析问题
将自然语言问题传给 analyze():
const result = await ava.analyze('What is total revenue by region?');
console.log(result.text);
console.table(result.data);analyze() 按需获取 schema,结合已有 profile 和你提供的业务语义,生成查询、执行并整理答案。业务语义可以说明哪些订单计入收入等规则。它返回数据与文字,不会直接生成图表。
读懂返回结果
上面的问题可能返回如下结果。结论的措辞、生成的查询和列别名会随模型而变化。
{
"query": "What is total revenue by region?",
"text": "East has total revenue of 200, compared with 90 for West.",
"schema": [{ "name": "region" }, { "name": "total_revenue" }],
"data": [
{ "region": "East", "total_revenue": 200 },
{ "region": "West", "total_revenue": 90 }
],
"rowCount": 2
}| 字段 | 类型 | 含义 |
|---|---|---|
query | string | 原始问题。 |
text | string | 模型生成的总结;includeSummary 为 false 时为空字符串。 |
schema | QueryColumn[] | 返回列的定义,每列包含 name: string 和可选的 type: string。 |
data | Record<string, unknown>[] | 可用于展示、导出或可视化的结果行。 |
rowCount | number,可选 | 结果完整时的行数,不是输入数据集的总行数。 |
sql | string,可选 | 实际执行的查询;使用 Python 或 JavaScript 引擎时,这个字段名仍保持不变。 |
markdown | string,可选 | 返回时提供的 Markdown 内容。 |
truncated | true,可选 | 实际数据超过结果限制,返回结果不完整。 |
truncatedBy | 'maxRows' 或 'maxResultBytes',可选 | 触发截断的限制项。 |
请通过 schema 读取实际返回的列名,不要假定模型一定使用 total_revenue 这个别名。
配置一次分析
analyze(query: string, config?: AnalysisConfig) 接受以下输入:
| 参数 | 类型 | 必填 | 默认值与行为 |
|---|---|---|---|
query | string | 是 | 自然语言问题。 |
config | AnalysisConfig | 否 | {}。 |
config.includeSummary | boolean | 否 | true;设为 false 可跳过结果总结。 |
config.maxRows | number | 否 | 200,限制返回行数。 |
config.maxResultBytes | number | 否 | 1048576(1 MiB),限制序列化后的结果数据大小。 |
config.strategy | AnalysisStrategyConfig | 否 | 默认直接分析,详见策略选项。 |
例如,最多返回 100 行,并跳过文字总结:
const result = await ava.analyze('What is total revenue by region?', {
includeSummary: false,
maxRows: 100,
maxResultBytes: 1048576,
});
console.log(result.text); // ''
console.table(result.data);处理不完整的结果
假设这份两地区的结果使用了 maxRows: 1,简化后的返回内容可能是:
{
"schema": [{ "name": "region" }, { "name": "total_revenue" }],
"data": [{ "region": "East", "total_revenue": 200 }],
"truncated": true,
"truncatedBy": "maxRows"
}这只是部分答案。将它作为完整结果展示前,应先检查截断字段:
if (result.truncated) {
console.log(`Showing a partial result: ${result.truncatedBy} was reached.`);
}maxRows 向下取整后限制在 1—1000000 之间;取整后超出安全整数范围则使用默认值。maxResultBytes 向下取整后最小为 1,非有限值使用默认值。这两项限制也适用于下面的 query();它们约束返回数据,并不限制查询的总耗时或内存消耗。
推荐分析问题
使用 suggest() 获取分析方向。也可以先计算 profile,为上下文补充统计信息;这一步可选,且不调用大模型。
await ava.profile();
const suggestions = await ava.suggest(2);
console.log(suggestions);| 参数 | 类型 | 必填 | 默认值与行为 |
|---|---|---|---|
count | number | 否 | 3,期望获取的推荐问题数量。 |
suggest() 需要先加载数据源,并会调用已配置的模型。有最新 profile 时使用 profile,否则使用 schema。
推荐结果
对于销售数据集,返回数组可能如下:
[
{
"query": "What is total revenue by region?",
"score": 0.95,
"reason": "Compare each region's contribution to overall revenue."
},
{
"query": "What is average revenue per record in each region?",
"score": 0.82,
"reason": "Compare typical record values across regions with different record counts."
}
]这些只是示例,并非固定输出。在界面中可以这样使用各字段:
| 字段 | 类型 | 使用方式 |
|---|---|---|
query | string | 展示为可选择的问题,并传给 analyze()。 |
score | number | 用于排序。数值限制在 0—1 之间,并按降序排列;它表示问题的分析价值,不是答案的可信度。 |
reason | string | 解释这个问题为什么值得分析,例如展示在问题下方。 |
最多返回 count 条推荐,也可能返回空数组。提示词会要求模型让问题和推荐理由沿用数据集的语言。
分析推荐的问题
if (suggestions.length > 0) {
const selected = suggestions[0];
const answer = await ava.analyze(selected.query);
console.log(selected.reason);
console.table(answer.data);
}分析策略
analyze() 默认直接分析。如果问题需要不同的处理方式,可以为每次调用指定策略:
| 策略 | 适用情况 |
|---|---|
direct | 问题明确,生成并执行一个查询即可回答。 |
loop | 需要先做中间探索,再形成答案。 |
示例、重试控制与步数限制见分析策略。
分开生成与执行查询
用 translate() 先查看生成的代码,再决定是否交给 query() 执行:
const dsl = await ava.translate('What is total revenue by region?');
console.log(dsl); // Display the generated query for review.
// Run this step when your application is ready to execute the query.
const rows = await ava.query(dsl, {
maxRows: 100,
maxResultBytes: 1048576,
});
console.table(rows.data);| 方法 | 参数 | 类型 | 必填与默认值 |
|---|---|---|---|
translate(query) | query | string | 必填,自然语言问题。 |
query(dsl, options?) | dsl | string | 必填,使用当前引擎语言的可执行语句。 |
query(dsl, options?) | options | ExecutionOptions | 可选,默认值见下方。 |
query(dsl, options?) | options.maxRows | number | 可选,200;边界规则与 analyze() 相同。 |
query(dsl, options?) | options.maxResultBytes | number | 可选,1048576;边界规则与 analyze() 相同。 |
两个方法都需要先加载数据源。translate() 结合模型、schema 和已有 profile,返回字符串;query() 直接执行传入语句,不会做模型翻译、总结或自动纠错。
默认 Node.js 配置生成 SQL;其他引擎则使用各自的 SQL 方言、Python 或 JavaScript。SQL 引擎会验证查询是否只读;Python 和 JavaScript 的执行限制取决于各自的环境。
query() 返回前文介绍的 schema、data 和可选截断信息,但不包含分析结果中的 query、text、sql 字段。
错误处理与资源清理
未加载数据源、模型请求失败、推荐结果无法解析,或重试后仍执行失败等情况,都会让调用抛出错误。不要把错误当成没有数据的答案。
在分析调用外处理错误,并在使用结束后释放实例:
try {
const result = await ava.analyze('What is total revenue by region?');
console.table(result.data);
} catch (error) {
console.error('Analysis failed:', error);
} finally {
await ava.dispose();
}请始终等待清理完成。再次调用 source() 会替换数据集,并清空 schema 和 profile 缓存;新数据源需要统计信息时,请重新调用 profile()。