balibabu
feat: Refine reteival of multi-turn conversation #2362 (#2539)
1c7ab64
raw
history blame
5.29 kB
import SimilaritySlider from '@/components/similarity-slider';
import { DeleteOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import {
Button,
Col,
Divider,
Form,
Input,
Row,
Switch,
Table,
TableProps,
Tooltip,
} from 'antd';
import classNames from 'classnames';
import {
ForwardedRef,
forwardRef,
useEffect,
useImperativeHandle,
useState,
} from 'react';
import { v4 as uuid } from 'uuid';
import {
VariableTableDataType as DataType,
IPromptConfigParameters,
ISegmentedContentProps,
} from '../interface';
import { EditableCell, EditableRow } from './editable-cell';
import Rerank from '@/components/rerank';
import TopNItem from '@/components/top-n-item';
import { useTranslate } from '@/hooks/common-hooks';
import { useSelectPromptConfigParameters } from '../hooks';
import styles from './index.less';
const PromptEngine = (
{ show }: ISegmentedContentProps,
ref: ForwardedRef<Array<IPromptConfigParameters>>,
) => {
const [dataSource, setDataSource] = useState<DataType[]>([]);
const parameters = useSelectPromptConfigParameters();
const { t } = useTranslate('chat');
const components = {
body: {
row: EditableRow,
cell: EditableCell,
},
};
const handleRemove = (key: string) => () => {
const newData = dataSource.filter((item) => item.key !== key);
setDataSource(newData);
};
const handleSave = (row: DataType) => {
const newData = [...dataSource];
const index = newData.findIndex((item) => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
...row,
});
setDataSource(newData);
};
const handleAdd = () => {
setDataSource((state) => [
...state,
{
key: uuid(),
variable: '',
optional: true,
},
]);
};
const handleOptionalChange = (row: DataType) => (checked: boolean) => {
const newData = [...dataSource];
const index = newData.findIndex((item) => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
optional: checked,
});
setDataSource(newData);
};
useImperativeHandle(
ref,
() => {
return dataSource
.filter((x) => x.variable.trim() !== '')
.map((x) => ({ key: x.variable, optional: x.optional }));
},
[dataSource],
);
const columns: TableProps<DataType>['columns'] = [
{
title: t('key'),
dataIndex: 'variable',
key: 'variable',
onCell: (record: DataType) => ({
record,
editable: true,
dataIndex: 'variable',
title: 'key',
handleSave,
}),
},
{
title: t('optional'),
dataIndex: 'optional',
key: 'optional',
width: 40,
align: 'center',
render(text, record) {
return (
<Switch
size="small"
checked={text}
onChange={handleOptionalChange(record)}
/>
);
},
},
{
title: t('operation'),
dataIndex: 'operation',
width: 30,
key: 'operation',
align: 'center',
render(_, record) {
return <DeleteOutlined onClick={handleRemove(record.key)} />;
},
},
];
useEffect(() => {
setDataSource(parameters);
}, [parameters]);
return (
<section
className={classNames({
[styles.segmentedHidden]: !show,
})}
>
<Form.Item
label={t('system')}
rules={[{ required: true, message: t('systemMessage') }]}
tooltip={t('systemTip')}
name={['prompt_config', 'system']}
initialValue={t('systemInitialValue')}
>
<Input.TextArea autoSize={{ maxRows: 8, minRows: 5 }} />
</Form.Item>
<Divider></Divider>
<SimilaritySlider isTooltipShown></SimilaritySlider>
<TopNItem></TopNItem>
<Form.Item
label={t('multiTurn')}
tooltip={t('multiTurnTip')}
name={['prompt_config', 'refine_multiturn']}
initialValue={true}
>
<Switch></Switch>
</Form.Item>
<Rerank></Rerank>
<section className={classNames(styles.variableContainer)}>
<Row align={'middle'} justify="end">
<Col span={9} className={styles.variableAlign}>
<label className={styles.variableLabel}>
{t('variable')}
<Tooltip title={t('variableTip')}>
<QuestionCircleOutlined className={styles.variableIcon} />
</Tooltip>
</label>
</Col>
<Col span={15} className={styles.variableAlign}>
<Button size="small" onClick={handleAdd}>
{t('add')}
</Button>
</Col>
</Row>
{dataSource.length > 0 && (
<Row>
<Col span={7}> </Col>
<Col span={17}>
<Table
dataSource={dataSource}
columns={columns}
rowKey={'key'}
className={styles.variableTable}
components={components}
rowClassName={() => styles.editableRow}
/>
</Col>
</Row>
)}
</section>
</section>
);
};
export default forwardRef(PromptEngine);