提交 22ce87b3 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 2a12bcd2
差异被折叠。
...@@ -29,7 +29,8 @@ ...@@ -29,7 +29,8 @@
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"react-router": "^7.4.0", "react-router": "^7.4.0",
"react-syntax-highlighter": "^15.6.1", "rehype-highlight": "^7.0.2",
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
"zustand": "^5.0.3" "zustand": "^5.0.3"
......
// 变量定义
$font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
$monospace-font: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
$border-color: #eaecef;
$table-border-color: #d0d7de;
$link-color: #0366d6;
$code-bg-color: rgba(27, 31, 35, 0.05);
$code-color: #e01e5a;
$blockquote-color: #6a737d;
$table-bg-color: #f6f8fa;
// 基础样式
.markdown-render {
font-family: $font-family;
line-height: 1.6;
color: #333;
// 标题样式
h1,
h2,
h3 {
font-weight: 600;
margin: 1em 0;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
border-bottom: 1px solid $border-color;
padding-bottom: 0.3em;
}
h2 {
font-size: 1.5em;
margin: 0.83em 0;
border-bottom: 1px solid $border-color;
padding-bottom: 0.3em;
}
h3 {
font-size: 1.25em;
}
// 段落样式
p {
margin: 1em 0;
}
// 列表样式
ul,
ol {
padding-left: 2em;
margin: 1em 0;
li {
margin: 0.5em 0;
}
}
// 链接样式
a {
color: $link-color;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
// 引用样式
blockquote {
margin: 1em 0;
padding: 0 1em;
color: $blockquote-color;
border-left: 0.25em solid $border-color;
}
// 表格样式
table {
display: block;
width: 100%;
max-width: 100%;
overflow: auto;
margin: 1em 0;
border-spacing: 0;
border-collapse: collapse;
thead,
tbody {
display: table-header-group;
vertical-align: middle;
border-color: inherit;
}
tbody {
display: table-row-group;
}
tr {
display: table-row;
vertical-align: inherit;
border-color: inherit;
background-color: #fff;
&:nth-child(2n) {
background-color: $table-bg-color;
}
}
th,
td {
display: table-cell;
padding: 6px 13px;
border: 1px solid $table-border-color;
text-align: left;
}
th {
font-weight: 600;
background-color: $table-bg-color;
}
td {
vertical-align: top;
}
}
// 代码块样式
pre {
background-color: $table-bg-color;
border-radius: 6px;
padding: 16px;
overflow: auto;
margin: 1em 0;
code {
background-color: transparent;
padding: 0;
border-radius: 0;
font-family: $monospace-font;
font-size: 85%;
line-height: 1.45;
}
}
// 行内代码样式
:not(pre) > code {
color: $code-color;
background-color: $code-bg-color;
padding: 0.2em 0.4em;
border-radius: 3px;
font-family: $monospace-font;
font-size: 85%;
}
// 代码高亮颜色
.hljs {
color: #24292e;
&-keyword,
&-selector-tag,
&-subst {
color: #d73a49;
}
&-string,
&-doctag {
color: #032f62;
}
&-title,
&-section,
&-selector-id {
color: #6f42c1;
}
&-comment,
&-quote {
color: #6a737d;
}
&-number,
&-literal {
color: #005cc5;
}
}
}
import Markdown from 'react-markdown' import Markdown from 'react-markdown'
import remarkGfm from 'remark-gfm' import remarkGfm from 'remark-gfm'
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' import rehypeHighlight from 'rehype-highlight'
import { dark } from 'react-syntax-highlighter/dist/esm/styles/prism' import rehypeRaw from 'rehype-raw'
import './MarkdownRender.scss'
interface MarkdownRenderProps {
children?: string
}
const MarkdownRender = function MarkdownRender({ children }: MarkdownRenderProps) {
if (!children) {
return null
}
export default function MarkdownRender(props: { children?: string }) {
return ( return (
<Markdown <div className="markdown-render">
remarkPlugins={[remarkGfm]} <Markdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeRaw, rehypeHighlight]}>
components={{ {children}
code(props) { </Markdown>
console.log(props) </div>
const { children, className, ...rest } = props
const match = /language-(\w+)/.exec(className || '')
return match ? (
<SyntaxHighlighter
{...rest}
PreTag="div"
children={String(children).replace(/\n$/, '')}
language={match[1]}
style={dark}
/>
) : (
<code {...rest} className={className}>
{children}
</code>
)
},
}}>
{props.children}
</Markdown>
) )
} }
export default MarkdownRender
import { Button, Flex, Modal, Spin } from 'antd'
import { useEffect, useState } from 'react'
import { useAI } from '@/hooks/useAI'
import MarkdownRender from '@/components/MarkdownRender'
export default function AIModal({ prompt }: { prompt: string }) {
const [open, setOpen] = useState(false)
const { post, isLoading, message } = useAI()
useEffect(() => {
if (open) {
post({
messages: [{ role: 'user', content: prompt }],
})
}
}, [open, prompt])
return (
<>
<Button type="primary" onClick={() => setOpen(true)}>
AI建议
</Button>
<Modal title="AI建议" open={open} footer={null} width={1000} onCancel={() => setOpen(false)} destroyOnClose>
<MarkdownRender>{message?.content}</MarkdownRender>
<Flex justify="center">
<Spin size="large" spinning={isLoading}></Spin>
</Flex>
</Modal>
</>
)
}
...@@ -9,10 +9,12 @@ export default function DataWrap({ ...@@ -9,10 +9,12 @@ export default function DataWrap({
title, title,
headerRender, headerRender,
buttons, buttons,
extraButtons,
empty, empty,
}: { }: {
title: string title: string
buttons?: ReactNode buttons?: ReactNode
extraButtons?: ReactNode
headerRender?: (data: any) => ReactNode headerRender?: (data: any) => ReactNode
empty?: ReactNode empty?: ReactNode
}) { }) {
...@@ -41,7 +43,10 @@ export default function DataWrap({ ...@@ -41,7 +43,10 @@ export default function DataWrap({
<Flex wrap gap={10}> <Flex wrap gap={10}>
{buttons} {buttons}
</Flex> </Flex>
<ViewDataFiledButtonModal></ViewDataFiledButtonModal> <Flex wrap gap={10}>
{extraButtons}
<ViewDataFiledButtonModal></ViewDataFiledButtonModal>
</Flex>
</Flex> </Flex>
)} )}
<DataRender rowKey={'pk_id'} loading={isPending} dataSource={data.list} columns={columns} /> <DataRender rowKey={'pk_id'} loading={isPending} dataSource={data.list} columns={columns} />
......
export const prompt = `任务目标
Apriori算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
核心问题 :该数据集拟解决的业务问题是什么?(例如:发现商品购买关联规则、优化商品推荐策略等)
关联目标:
- 需要挖掘的关联模式类型(如"购买T恤的用户是否常搭配购买牛仔裤")
- 业务价值目标(如"提升交叉销售转化率10%")
2. 特征工程与事务准备
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| 商品名称 | 转为事务列表 | 核心交易项,用于挖掘关联规则 |
| 品类 | 转为事务列表 | 分析品类间的共现模式 |
| 用户ID(可选) | 分组分析 按用户挖掘个性化购买模式 |
排除字段:
| 字段名 | 排除原因 |
| 订单时间 | 无直接关联规则挖掘价值 |
| 物流信息 | 与购买行为无关 |
(2) 特征处理建议:
事务格式要求:
- 数据需转换为\`[[事务1商品列表], [事务2商品列表], ...]\`格式
- 示例:\`[["T恤", "牛仔裤"], ["连衣裙", "帆布鞋"]]\`
缺失值处理:
- 策略:删除空值或填充(如"其他"类别)
数据降维:
- 是否需要合并商品层级?[是/否及理由](如"合并到品类层级以减少项数量")
3. 模型输入设计
事务数据格式:
订单ID | 购买项列表
A123 | [女裤, 泫雅风T恤, 双11优惠]
A456 | [连衣裙, 氨纶材质]
参数配置建议:
\`min_support\`:[建议值及理由](如"设置为0.05以筛选高频项集")
\`min_confidence\`:[建议值及理由](如"设置为0.6以保证规则实用性")
4. 算法实现建议
模型适配性:
是否适合Apriori?[是/否及理由]
若否,推荐调整:
尝试FP-Growth(如"数据规模过大时更高效")
关键参数建议:
\`min_support\`:0.03-0.1(高频商品组合筛选)
\`min_confidence\`:0.5+(保证规则可信度)
\`max_length\`:5(限制规则复杂度)
业务规则过滤:
推荐设置\`min_lift>1.5\`以筛选强关联规则(如"购买T恤的用户更可能购买配套裤子")
计算资源建议:
特征维度>100时,建议先进行商品聚类降维
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述业务问题及目标]
2. 事务构建建议:
- 保留字段:[字段列表及处理方式和理由]
- 排除字段:[字段列表及排除原因]
3. 关键特征分析:
高频项集:
强关联规则:
4. 模型建议:
参数配置:
\`min_support=0.05\`(筛选高频商品组合)
\`min_confidence=0.6\`(保证业务价值)
业务验证方式:
推荐验证方法:人工审核规则合理性(如"是否符合业务常识")
关键评估指标:lift值、置信度、支持度 `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:Apriori" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap title="数据挖掘:Apriori" buttons={<ButtonModal />} extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
随机森林算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
1.
核心问题 :该数据集拟解决的业务问题是什么?(例如:预测用户购买品类、识别高价值客户流失风险等)
2.
因变量(目标)选择 :
字段名:[目标变量字段名]
- 选择依据:
- 业务相关性说明(如"直接关联用户购买行为")
- 数据类型匹配(如分类问题需离散变量、回归问题需连续变量)
模型预期 :
预期性能指标(如准确率>85%、F1-score>0.7)
或业务目标(如"将客户流失预测准确率提升15%")
2. 特征工程与自变量选择
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| [字段1] | 标签编码/One-Hot | 与因变量信息增益高、业务逻辑相关 |
| [字段2] | 处理缺失值(如填充/删除) | 数据质量达标(缺失率<5%)、分布合理 |
排除字段:
| 字段名 | 排除原因 |
| [字段X] | 多重共线性(VIF>10)、无关变量、数据噪声 |
(2) 特征处理建议:
分类特征:
- 编码方式:[标签编码/One-Hot](如"品类字段需One-Hot编码以保留类别信息")
缺失值处理:
- 策略:[填充/删除/模型内置处理](如"年龄字段缺失率3%,用中位数填充")
异常值处理:
- 策略:[离群值截断/删除](如"销量字段存在极端值,使用IQR法处理")
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X):
字段列表及预处理方法:
[字段A]:标签编码 → 转换为整数类型
[字段B]:One-Hot编码 → 扩展为N个二元变量
因变量(Y):
字段名:[字段名]
是否需要离散化?[是/否及方法](如"销售额连续值转为高/中/低三类")
4. 算法实现建议
模型适配性:
是否适合随机森林?[是/否及理由]
若否,推荐调整:
尝试XGBoost/梯度提升树(如"特征间交互复杂,需更深度学习")
关键参数建议:
\`n_estimators\`:[建议值及理由](如"设置为100以平衡计算效率与精度")
\`max_depth\`:[建议值及理由](如"防止过拟合,设置为5")
\`max_features\`:[建议值及理由](如"sqrt型特征子集")
\`class_weight\`:[平衡/不均衡](如"类别分布不均衡时设置'balanced'")
计算资源建议:
是否需要特征选择?[是/否及方法](如"使用特征重要性筛选Top 10字段")
验证与评估:
验证策略:[分层5折交叉验证](如"数据类别分布不均衡")
关键指标:[准确率、F1-score、特征重要性图表]
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 因变量选择:[字段名] + [选择理由]
3. 自变量选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
4. 关键特征分析:
- 相关性最高特征:[字段名](相关系数值)
- 高共线性特征对:[字段对及VIF值]
5. 模型建议:
- 是否需要正则化?[是/否及理由]
- 推荐验证方式:[方法名称]
- 核心参数建议`
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:随机森林" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:随机森林"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
FP-Growth算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
核心问题 :该数据集拟解决的业务问题是什么?(例如:挖掘商品关联购买模式、优化库存组合、设计推荐系统)
分析目标:
- 需要发现的关联模式类型(如“购买连衣裙的用户常搭配高跟鞋”)
- 业务价值目标(如"提升购物车添加率10%")
2. 特征工程与事务构建
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| 品类 | 直接使用 | 核心商品分类维度 |
| 颜色 | 直接使用 | 影响购买组合的因素 |
| 材质 | 直接使用 | 商品属性关联性分析 |
| 优惠类型 | 直接使用 | 购买决策驱动因素 |
排除字段:
| 字段名 | 排除原因 |
| 订单ID | 无业务解释性 |
| 用户年龄 | 非事务型特征 |
| 交易时间 | 与关联规则无直接关系 |
(2) 数据转换建议:
事务格式要求:
- 将数据转换为\`订单ID→[购买项列表]\`的事务格式(如\`订单A→[连衣裙_红色_氨纶, T恤_白色_棉质]\`)
缺失值处理:
- 策略:[删除/填充](如"空购物车订单需排除")
特征组合建议:
- 是否组合字段?[是/否及示例](如"将'品类+颜色+材质'合并为复合项以提升规则实用性")
3. 模型输入设计
事务数据格式:
订单ID | 购买项列表
A123 | [女裤, 泫雅风T恤, 双11优惠]
A456 | [连衣裙, 氨纶材质]
参数配置建议:
\`min_support\`:[建议值及理由](如"设置为0.03以筛选高频商品组合")
\`min_threshold\`:[建议值及理由](如"设置为0.5以保证规则实用性")
4. 算法实现建议
模型适配性:
是否适合FP-Growth?[是/否及理由]
若否,推荐调整:
尝试Apriori(如"小规模数据或低维度场景")
关键参数建议:
\`min_support=0.03-0.05\`(高频项集筛选)
\`use_collector=True\`(优化内存占用)
业务规则过滤:
推荐设置\`min_confidence>0.5\`和\`lift>2\`筛选强关联规则
计算资源建议:
特征维度>100时,建议先进行商品聚类降维
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述业务问题及目标]
2. 事务构建建议:
- 保留字段:[字段列表及处理方式和理由]
- 排除字段:[字段列表及排除原因]
3. 关键特征分析:
高频项集:
强关联规则:
4. 模型建议:
参数配置:
\`min_support=0.05\`(筛选高频商品组合)
\`min_confidence=0.6\`(保证规则可信度)
业务验证方式:
推荐验证方法:人工审核规则合理性(如"是否符合业务常识")
关键评估指标:lift值、置信度、支持度 `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:FP-Growth" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:FP-Growth"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
层次聚类算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
核心问题 :该数据集拟解决的业务问题是什么?(例如:识别用户消费行为分群、分析商品品类相似性等)
聚类目标:
- 需要发现的群体类型(如高价值客户群、相似商品类型群)
- 业务价值目标(如"通过分群优化营销策略")
2. 特征工程与自变量选择
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| 销量 | 标准化 | 核心业务指标,量纲统一需求 |
| 实际付款 | 标准化 | 反映消费能力,数值型特征 |
| 品类 | One-Hot编码 | 类别型特征需转化为数值型 |
排除字段:
| 字段名 | 排除原因 |
| 订单ID | 无业务意义,唯一标识符 |
| 省份 | 分类层级过高(与城市字段冗余) |
(2) 特征处理建议:
标准化要求:
- 强制标准化:层次聚类对特征量纲敏感,必须进行标准化(\`StandardScaler\`)
分类特征:
- 编码方式:[One-Hot/标签编码](如"品类字段需One-Hot编码以保留类别信息")
缺失值处理:
- 策略:[填充/删除](如"年龄字段缺失率<5%,用均值填充")
降维建议:
- 是否需要 PCA?[是/否及理由](如"特征维度>20时降低计算复杂度")
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X):
字段列表及预处理方法:
[销量]:标准化 → 均值0,方差1
[实际付款]:标准化 → 均值0,方差1
[品类]:One-Hot编码 → 扩展为N个二元变量
距离度量:
推荐方法:[欧氏距离/余弦相似度](如"数值型特征适合欧氏距离")
4. 算法实现建议
模型适配性:
是否适合层次聚类?[是/否及理由]
若否,推荐调整:
尝试 K-Means(如"数据规模过大时更高效")
关键参数建议:
链接方法:[ward/complete/average](如"ward方法对球形簇效果最佳")
距离度量:[欧氏距离/余弦相似度]
聚类数量:[建议值及理由](如"通过 dendrogram 确定 elbow 点")
计算资源建议:
数据量>1e4时,建议使用近似算法(如"凝聚聚类替代层次聚类")
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 特征选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
3. 关键特征分析:
对聚类影响最大的特征:
\`实际付款\`(贡献度:32%)
特征冗余性分析:
\`销量\` & \`销售额\`(VIF=8.5,需删除其一)
4. 模型建议:
算法参数:
链接方法:\`ward\`(最小化簇内方差)
距离度量:\`欧氏距离\`(数值型特征适用)
聚类数量:
建议3-5类(通过 dendrogram 的 elbow 点判断)
可视化建议:
绘制 dendrogram 分析层次结构
使用 t-SNE/PCA 降维后观察聚类分布
5. 有效性验证
推荐验证方式:
内部指标:轮廓系数(Silhouette Score)
业务验证:
检查簇内用户特征一致性(如高付款簇的品类偏好)
对比 K-Means 聚类结果 `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:层次聚类" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:层次聚类"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
Holt-Winters算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
核心问题 :该数据集拟解决的业务问题是什么?(例如:预测未来30天商品销量、分析销售季节性规律等)
预测目标:
- 需要预测的指标(如"实际付款金额"、"日订单量")
- 业务价值目标(如"提升库存规划准确性")
2. 时间序列特征配置
请分步骤给出建议:
(1) 关键字段选择:
时间列:
字段名:[字段名]
- 处理方式:[标准化为datetime格式、设置频率(如'D'表示日)]
目标列:
字段名:[字段名](如\`实际付款\`、\`销量\`)
- 选择理由:
- 业务目标直接关联(如"预测销售额以优化库存")
- 数据需满足时间序列连续性(无缺失或稀疏时间段)
预测步长:
- 步数:[N步](如预测未来7天)
- 频率单位:[日/周/月]
(2) 数据预处理建议:
平稳性处理:
- 是否需要差分?[是/否及理由](如"存在明显趋势需一阶差分")
- 是否需要Box-Cox变换?[是/否及理由](如"数据呈指数增长")
缺失值处理:
- 策略:[插值/删除](如"用线性插值填充缺失日期")
季节性周期检测:
- 推荐周期:[N个月/周](如"发现12个月的年季节性")
3. 模型输入设计
数据格式要求:
时间列 | 目标列
2023-11-01 | 415.46
2023-11-02 | 514.28
参数配置建议:
\`seasonal='add'/'mul'\`:[建议类型及理由](如"乘法季节性适合销售额")
\`period=12\`:[周期值及检测依据]
4. 算法实现建议
模型适配性:
是否适合Holt-Winters?[是/否及理由]
若否,推荐调整:
尝试ARIMA(如"存在复杂趋势和噪声")
或 Prophet(如"需加入外生变量")
关键参数建议:
\`smoothing_level (α)\`:[建议值及理由](如"0.3捕捉趋势变化")
\`smoothing_trend (β)\`:[建议值及理由](如"0.1平滑趋势波动")
\`smoothing_seasonal (γ)\`:[建议值及理由](如"0.4捕捉季节性")
验证与评估:
推荐验证方法:滚动窗口验证(如"每30天滚动预测未来7天")
关键指标:MAE、RMSE、MAPE
计算资源建议:
数据量>1e4时,建议使用\`statsmodels\`的\`ExponentialSmoothing\`实现
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述业务问题及目标]
2. 时间序列配置:
时间列:\`交易成功时间\`(已转换为\`datetime\`格式,频率为日)
目标列:\`实际付款\`(连续型数值,需进行Box-Cox变换以稳定方差)
预测步长:30步(预测未来30天)
3. 关键特征分析:
季节性周期检测:
周期:12个月(ACF图显示显著峰值)
趋势稳定性:
需一阶差分(ADF检验p<0.05,原序列非平稳)
4. 模型建议:
参数配置:
\`seasonal='mul'\`(乘法季节性适合销售额增长趋势)
\`period=12\`(年季节性周期)
\`α=0.3, β=0.1, γ=0.4\`(通过网格搜索优化)
验证方式:
滚动窗口验证:最后1年数据作为测试集,每30天滚动预测
关键指标:MAPE<15%(业务可接受误差范围)
数据预处理**:
- 执行Box-Cox变换(λ=0.5)以消除异方差性 `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:Holt-Winters" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:Holt-Winters"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
K-Means算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
核心问题 :该数据集拟解决的业务问题是什么?(例如:客户分群、商品品类聚类、物流路径优化等)
聚类目标:
- 需要发现的群体类型(如高价值客户群、相似商品类型群)
- 业务价值目标(如"通过分群优化营销策略")
2. 特征工程与自变量选择
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| 销量 | 标准化 | 核心业务指标,量纲统一需求 |
| 实际付款 | 标准化 | 消费能力关键指标 |
| 客户年龄 | 标准化 | 与购买行为相关(如年龄分层) |
| 品类 | One-Hot编码 | 类别型特征需转化为数值型 |
排除字段:
| 字段名 | 排除原因 |
| 订单编号 | 无业务意义,唯一标识符 |
| 交易时间 | 非数值型且无直接业务解释性 |
| 物流信息 | 与客户/商品特征无关 |
(2) 特征处理建议:
标准化要求:
- 强制标准化:K-Means对特征量纲敏感,必须进行标准化(\`StandardScaler\`)
分类特征:
- 编码方式:[One-Hot/标签编码](如"品类字段需One-Hot编码以保留类别信息")
缺失值处理:
- 策略:[填充/删除](如"年龄字段缺失率<5%,用均值填充")
降维建议:
- 是否需要 PCA?[是/否及理由](如"特征维度>20时降低计算复杂度")
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X):
字段列表及预处理方法:
[销量]:标准化 → 均值0,方差1
[实际付款]:标准化 → 均值0,方差1
[品类]:One-Hot编码 → 扩展为N个二元变量
距离度量:
推荐方法:欧氏距离(K-Means默认)
4. 算法实现建议
模型适配性:
是否适合K-Means?[是/否及理由]
若否,推荐调整:
尝试层次聚类(如"需要层次结构解释")或DBSCAN(如"存在噪声数据")
关键参数建议:
簇数(n_clusters):[建议值及理由](如"通过肘部法则确定为3类")
初始化方法:[k-means++/随机](推荐k-means++以提高收敛稳定性)
max_iter:[建议值及理由](如"设置为300次迭代以确保收敛")
计算资源建议:
数据量>1e4时,建议使用Mini-Batch K-Means加速
有效性验证:
推荐指标:轮廓系数、Calinski-Harabasz指数
业务验证:检查簇内特征一致性(如高付款簇的品类偏好)
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 特征选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
3. 关键特征分析:
对聚类影响最大的特征:
\`实际付款\`(贡献度:32%)
特征冗余性分析:
\`销量\` & \`销售额\`(VIF=8.5,需删除其一)
4. 模型建议:
簇数建议:
推荐3类(肘部法则显示WCSS在k=3时显著下降)
参数配置:
\`init='k-means++'\`(避免随机初始化陷阱)
\`max_iter=300\`(平衡计算效率与收敛性)
有效性验证:
内部指标:轮廓系数(目标>0.7)
业务验证:
检查簇内客户特征一致性(如高付款簇的品类偏好)
对比层次聚类结果 `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:K-Means" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap title="数据挖掘:K-Means" buttons={<ButtonModal />} extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
线性回归算法设计需求说明,结构化分析和建模建议。
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
1.
核心问题 :该数据集拟解决的业务问题是什么?(例如预测销售额、分析用户行为影响因素等)
2.
因变量(目标)选择 :根据业务目标,选择最适合作为因变量(Y)的字段,并说明选择依据。
3.
模型预期 :预期模型应达到的性能指标(如R²、RMSE等),或业务价值目标(如提升预测准确率10%)。
2. 特征工程与自变量选择
请分步骤给出建议:
(1)特征筛选标准
从数据集中选择适合作为自变量(X)的特征,需满足以下条件:
相关性 :与因变量有显著统计学关联(如皮尔逊相关系数>0.3或p值<0.05);
可解释性 :符合业务逻辑(例如广告投入与销售额应正相关);
数据质量 :无严重缺失值(缺失率<5%)且分布合理(无极端异常值)。
(2)特征处理建议
数值型特征 :是否需要标准化/归一化?(如线性回归对特征量纲敏感)
分类特征 :是否需要独热编码或嵌入处理?(如性别、地区等字段)
交互特征 :是否存在需要组合的特征?(例如广告投入×用户年龄的交互项)
(3)排除特征
列出应排除的特征并说明原因(如多重共线性、冗余字段、无关变量)。
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X) :具体字段名称及预处理方法;
因变量(Y) :字段名称及是否需要转换(如对数变换)。
4. 算法实现建议
1.
模型适配性 :
线性回归是否适合该数据集?若否,是否需要调整(如添加正则化项变为岭回归/lasso)?
若数据存在非线性关系,是否需要先尝试多项式回归?
1.
计算资源建议 :
特征维度是否需要降维(如PCA)以减少模型计算复杂度?
1.
评估与验证 :
推荐的交叉验证策略(如K折交叉验证);
需要监控的评估指标(如R²、调整R²、F统计量)。
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 因变量选择:[字段名] + [选择理由]
3. 自变量选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
4. 关键特征分析:
- 相关性最高特征:[字段名](相关系数值)
- 高共线性特征对:[字段对及VIF值]
5. 模型建议:
- 是否需要正则化?[是/否及理由]
- 推荐验证方式:[方法名称] `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:线性回归" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:线性回归"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
逻辑回归算法设计需求说明,结构化分析和建模建议。
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
输出要求
请以以下结构分点输出,确保结论清晰、逻辑严谨:
1. 问题定义
[一句话描述业务问题及建模目标,例如:"预测用户是否购买高价值商品,以优化营销策略"]
2. 因变量选择
字段名 :[目标变量字段名]
选择理由 :
[业务意义说明,如"该字段直接反映购买行为"]
[数据分布说明,如"二分类/多分类分布均衡"]
3. 自变量选择
保留字段 :
字段名 | 处理方式 | 理由
[字段1] | [标准化/One-Hot等] | [业务相关性/数据质量]
[字段2 | ... | ...
排除字段 :
字段名 | 排除原因
[字段X] | [冗余/强共线性/数据缺失率>30%等]
4. 关键特征分析
相关性最高特征 :
[字段名](与因变量相关系数:[数值],如|r|=0.78)
高共线性特征对 :
[字段A & 字段B](VIF值:[数值],如VIF=8.5,需处理)
5. 模型建议
是否需要正则化 :
[是/否]
理由 :
[如"存在多重共线性(VIF>5),推荐L2正则化"]
[或"特征稀疏且无冗余,无需正则化"]
推荐验证方式 :
[方法名称,如"分层5折交叉验证"]
理由 :
[如"数据量较小且类别分布不均衡"]
6. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 因变量选择:[字段名] + [选择理由]
3. 自变量选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
4. 关键特征分析:
- 相关性最高特征:[字段名](相关系数值)
- 高共线性特征对:[字段对及VIF值]
5. 模型建议:
- 是否需要正则化?[是/否及理由]
- 推荐验证方式:[方法名称] `
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:逻辑回归" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:逻辑回归"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
支持向量机(SVM)算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
1.
核心问题 :该数据集拟解决的业务问题是什么?(例如:预测用户购买品类、识别高价值客户流失风险等)
2.
因变量(目标)选择 :
字段名:[目标变量字段名]
- 选择依据:
- 业务相关性说明(如"直接关联用户购买行为")
- 数据类型匹配(如分类问题需离散变量、回归问题需连续变量)
模型预期 :
预期性能指标(如准确率>85%、F1-score>0.7)
或业务目标(如"将客户流失预测准确率提升15%")
2. 特征工程与自变量选择
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| [字段1] | 标签编码/One-Hot | 标准化/One-Hot | 与因变量相关性显著(如|r|=0.5+)、业务逻辑相关 |
| [字段2] | 处理缺失值(如填充/删除) | 数据质量达标(缺失率<5%)、分布合理 |
排除字段:
| 字段名 | 排除原因 |
| [字段X] | 多重共线性(VIF>10)、无关变量、数据噪声 |
(2) 特征处理建议:
标准化要求:
- 强制标准化:SVM对特征量纲敏感,必须进行标准化(\`StandardScaler\`)
分类特征:
- 编码方式:[One-Hot/标签编码](如"品类字段需One-Hot编码以保留类别信息")
缺失值处理:
- 策略:[填充/删除/模型内置处理](如"年龄字段缺失率3%,用中位数填充")
异常值处理:
- 策略:[离群值截断/删除](如"销量字段存在极端值,使用IQR法处理")
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X):
字段列表及预处理方法:
[字段A]:标准化 → 均值0,方差1
[字段B]:One-Hot编码 → 扩展为N个二元变量
因变量(Y):
字段名:[字段名]
是否需要离散化?[是/否及方法](如"销售额连续值转为高/中/低三类")
4. 算法实现建议
模型适配性:
是否适合SVM?[是/否及理由]
若否,推荐调整:
尝试线性SVM(如"高维稀疏数据")或核技巧(如"非线性边界问题用RBF核")
关键参数建议:
\`C\`:[建议值及理由](如"设置为1.0平衡分类边界与误分类惩罚")
\`kernel\`:[linear/rbf/poly等](如"非线性问题推荐RBF核")
\`gamma\`:[建议值或'auto'](如"RBF核时设为'auto'或网格搜索优化")
计算资源建议:
是否需要降维?[是/否及方法](如"特征维度>1e3时用PCA降维")
验证与评估:
验证策略:[分层5折交叉验证](如"数据类别分布不均衡")
关键指标:[准确率、F1-score、AUC-ROC(二分类时)]
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 因变量选择:[字段名] + [选择理由]
3. 自变量选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
4. 关键特征分析:
- 相关性最高特征:[字段名](相关系数值)
- 高共线性特征对:[字段对及VIF值]
5. 模型建议:
- 是否需要正则化?[是/否及理由]
- 推荐验证方式:[方法名称]
- 核心参数建议`
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:支持向量机" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap
title="数据挖掘:支持向量机"
buttons={<ButtonModal />}
extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
export const prompt = `任务目标
决策树算法设计需求说明,结构化分析和建模建议
数据样本:[在此粘贴数据片段或上传文件(CSV/XLSX)]
1. 问题定义与目标明确
请明确回答以下问题:
1.
核心问题 :该数据集拟解决的业务问题是什么?(例如:预测用户购买品类、识别高价值客户流失风险等)
2.
因变量(目标)选择 :
字段名:[目标变量字段名]
- 选择依据:
- 业务相关性说明(如"直接关联用户购买行为")
- 数据类型匹配(如分类问题需离散变量、回归问题需连续变量)
模型预期 :
预期性能指标(如准确率>85%、F1-score>0.7)
或业务目标(如"将客户流失预测准确率提升15%")
2. 特征工程与自变量选择
请分步骤给出建议:
(1) 特征筛选标准:
保留字段:
| 字段名 | 处理方式 | 保留理由(满足以下条件) |
| [字段1] | 标签编码/One-Hot | 与因变量信息增益高、业务逻辑相关 |
| [字段2] | 处理缺失值(如填充/删除) | 数据质量达标(缺失率<5%)、分布合理 |
排除字段:
| 字段名 | 排除原因 |
| [字段X] | 多重共线性(VIF>10)、无关变量、数据噪声 |
(2) 特征处理建议:
分类特征:
- 编码方式:[标签编码/One-Hot](如"品类字段需One-Hot编码以保留类别信息")
缺失值处理:
- 策略:[填充/删除/模型内置处理](如"年龄字段缺失率3%,用中位数填充")
异常值处理:
- 策略:[离群值截断/删除](如"销量字段存在极端值,使用IQR法处理")
3. 模型输入设计
请给出最终的模型输入方案 :
自变量(X):
字段列表及预处理方法:
[字段A]:标签编码 → 转换为整数类型
[字段B]:One-Hot编码 → 扩展为N个二元变量
因变量(Y):
字段名:[字段名]
是否需要离散化?[是/否及方法](如"销售额连续值转为高/中/低三类")
4. 算法实现建议
模型适配性:
是否适合决策树?[是/否及理由]
若否,推荐调整:
尝试随机森林/梯度提升树(如"特征间交互复杂,需集成学习")
关键参数建议:
\`max_depth\`:[建议值及理由](如"防止过拟合,设置为5")
\`min_samples_split\`:[建议值及理由](如"避免过分割,设置为10")
\`class_weight\`:[平衡/不均衡](如"类别分布不均衡时设置'balanced'")
计算资源建议:
是否需要特征选择?[是/否及方法](如"使用特征重要性筛选Top 10字段")
验证与评估:
验证策略:[分层5折交叉验证](如"数据类别分布不均衡")
关键指标:[准确率、F1-score、特征重要性图表]
5. 输出格式要求
请以以下结构分点输出,便于模型生成清晰结论:
1. 问题定义:[一句话描述]
2. 因变量选择:[字段名] + [选择理由]
3. 自变量选择:
- 保留字段:[字段列表及处理方式]
- 排除字段:[字段列表及排除原因]
4. 关键特征分析:
- 相关性最高特征:[字段名](相关系数值)
- 高共线性特征对:[字段对及VIF值]
5. 模型建议:
- 是否需要正则化?[是/否及理由]
- 推荐验证方式:[方法名称]
- 核心参数建议`
import { lazy } from 'react' import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import { prompt } from '../prompt'
const ButtonModal = lazy(() => import('../components/ButtonModal')) const ButtonModal = lazy(() => import('../components/ButtonModal'))
const AIModal = lazy(() => import('@/components/data/AIModal'))
export default function DataProcess() { export default function DataProcess() {
return <DataWrap title="数据挖掘:决策树" buttons={<ButtonModal />}></DataWrap> return (
<DataWrap title="数据挖掘:决策树" buttons={<ButtonModal />} extraButtons={<AIModal prompt={prompt} />}></DataWrap>
)
} }
...@@ -7,13 +7,14 @@ import { useAI } from '@/hooks/useAI' ...@@ -7,13 +7,14 @@ import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
interface ResultItem { interface ResultItem {
key: string
name: string name: string
desc: string desc: string
} }
export default function ButtonModal() { export default function ButtonModal() {
const [results, setResults] = useState<ResultItem[]>([]) const [results, setResults] = useState<ResultItem[]>([])
const resultsOptions = results.map((result) => result.name) const resultsOptions = results.map((result) => ({ label: result.name, value: result.key }))
const { isLoading, post } = useAI({ const { isLoading, post } = useAI({
onComplete: (message) => { onComplete: (message) => {
...@@ -34,7 +35,7 @@ export default function ButtonModal() { ...@@ -34,7 +35,7 @@ export default function ButtonModal() {
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [value, setValue] = useState(1) const [value, setValue] = useState('')
const onChange = (e: RadioChangeEvent) => { const onChange = (e: RadioChangeEvent) => {
setValue(e.target.value) setValue(e.target.value)
...@@ -79,7 +80,7 @@ export default function ButtonModal() { ...@@ -79,7 +80,7 @@ export default function ButtonModal() {
{current > 0 && <Button onClick={() => prev()}>上一步</Button>} {current > 0 && <Button onClick={() => prev()}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => next()} disabled={!!value}> <Button type="primary" onClick={() => next()} disabled={!value}>
下一步 下一步
</Button> </Button>
)} )}
......
...@@ -7,13 +7,14 @@ import { useAI } from '@/hooks/useAI' ...@@ -7,13 +7,14 @@ import { useAI } from '@/hooks/useAI'
import prompt from '@/utils/prompt' import prompt from '@/utils/prompt'
interface ResultItem { interface ResultItem {
key: string
name: string name: string
desc: string desc: string
} }
export default function ButtonModal() { export default function ButtonModal() {
const [results, setResults] = useState<ResultItem[]>([]) const [results, setResults] = useState<ResultItem[]>([])
const resultsOptions = results.map((result) => result.name) const resultsOptions = results.map((result) => ({ label: result.name, value: result.key }))
const { isLoading, post } = useAI({ const { isLoading, post } = useAI({
onComplete: (message) => { onComplete: (message) => {
...@@ -34,7 +35,7 @@ export default function ButtonModal() { ...@@ -34,7 +35,7 @@ export default function ButtonModal() {
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
const [value, setValue] = useState(1) const [value, setValue] = useState('')
const onChange = (e: RadioChangeEvent) => { const onChange = (e: RadioChangeEvent) => {
setValue(e.target.value) setValue(e.target.value)
...@@ -72,7 +73,7 @@ export default function ButtonModal() { ...@@ -72,7 +73,7 @@ export default function ButtonModal() {
{current > 0 && <Button onClick={() => prev()}>上一步</Button>} {current > 0 && <Button onClick={() => prev()}>上一步</Button>}
{current < steps.length - 1 && ( {current < steps.length - 1 && (
<Button type="primary" onClick={() => next()} disabled={!!value}> <Button type="primary" onClick={() => next()} disabled={!value}>
下一步 下一步
</Button> </Button>
)} )}
......
...@@ -9,13 +9,14 @@ import prompt from '@/utils/prompt' ...@@ -9,13 +9,14 @@ import prompt from '@/utils/prompt'
const CheckboxGroup = Checkbox.Group const CheckboxGroup = Checkbox.Group
interface ResultItem { interface ResultItem {
key: string
name: string name: string
desc: string desc: string
} }
export default function ButtonModal() { export default function ButtonModal() {
const [results, setResults] = useState<ResultItem[]>([]) const [results, setResults] = useState<ResultItem[]>([])
const resultsOptions = results.map((result) => result.name) const resultsOptions = results.map((result) => ({ label: result.name, value: result.key }))
const { isLoading, post } = useAI({ const { isLoading, post } = useAI({
onComplete: (message) => { onComplete: (message) => {
...@@ -49,7 +50,7 @@ export default function ButtonModal() { ...@@ -49,7 +50,7 @@ export default function ButtonModal() {
} }
const onCheckAllChange: CheckboxProps['onChange'] = (e) => { const onCheckAllChange: CheckboxProps['onChange'] = (e) => {
setCheckedList(e.target.checked ? resultsOptions : []) setCheckedList(e.target.checked ? resultsOptions.map((item) => item.value) : [])
} }
const next = () => { const next = () => {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论