import * as React from 'react'; import { useLocation } from 'react-router-dom'; import { observer } from 'mobx-react'; import './style.less'; import { Button, Input, Form, Divider, Splitter, Select, InputNumber, InputNumberProps, Radio, Switch, Row, Col, Slider, Space, RadioChangeEvent, Spin, message } from 'antd'; import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons'; import { apis } from '@/apis'; import router from '@/router'; const { TextArea } = Input; const FormItem = Form.Item; const { Option } = Select; const MAX_COUNT = 10; const Index = 1; const QuestionAnswerInfo: React.FC = () => { const [form] = Form.useForm(); // top_p const [topPValue, setTopPValue] = React.useState(0.1); const TopPDecimalStep: React.FC = () => { const onChange: InputNumberProps['onChange'] = (value) => { if (Number.isNaN(value)) { return; } setTopPValue(value as number); }; return ( ); }; const [tempValue, setTempValue] = React.useState(0.01); // temperature const TempDecimalStep: React.FC = () => { const onChange: InputNumberProps['onChange'] = (value) => { if (Number.isNaN(value)) { return; } setTempValue(value as number); }; return ( ); }; type ModelList = { label: string, value: string, }[]; type KnowledgeList = { label: string, value: string, }[]; const [step, setStep] = React.useState(1); const [pageLoading, setPageLoading] = React.useState(false); const [modelList, setModelList] = React.useState([]); const [knowledgeList, setKnowledgeList] = React.useState([]); const [isVisible, setIsVisible] = React.useState(false); const [isVisibleCus, setIsVisibleCus] = React.useState(false); const [isVisibleSlice, setIsVisibleSlice] = React.useState(false); const [isVisibleRerank, setIsVisibleRerank] = React.useState(false); const [name, setName] = React.useState(''); const style: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8, width: 300, }; const location = useLocation(); const init = async (id: string) => { await Promise.all([ api.fetchKnowlegde(), api.fetchModelList(), ]) if (id) { await api.fetchDetail(id); } } React.useEffect(() => { const id = location?.state?.id; init(id) }, []); // 定义一个状态来存储输入框数组 const [inputs, setInputs] = React.useState([{ id: 1, value: '' }]); // 添加新输入框的函数 const addInput = () => { const newId = inputs.length + 1; // 生成新的唯一ID setInputs([...inputs, { id: newId, value: '' }]); }; const delInput = () => { const newId = inputs.length - 1; // 生成新的唯一ID setInputs(inputs.slice(0, inputs.length - 1)); }; // 处理输入变更的函数 const handleChange = (id: number, value: string) => { setInputs(inputs.map(input => (input.id === id ? { ...input, value } : input))); }; // const onChange: InputNumberProps['onChange'] = (value) => { // console.log('changed', value); // }; const onChangeShow = (checked: boolean) => { console.log(`switch to ${checked}`); }; const onChangeModel = (checked: boolean) => { setIsVisibleRerank(!isVisibleRerank); }; const onChangeCount = (value: string) => { if (value === 'fixed') { setIsVisibleSlice(!isVisibleSlice); } else { setIsVisibleSlice(false); } }; // 召回方式 const onChangeRecallMethod = (e: RadioChangeEvent) => { }; // 获取应用详情 const api = { fetchDetail: async (app_id: string) => { setPageLoading(true); try { const res = await apis.fetchApplicationDetail(app_id) console.log(res.data); const sd = res.data.questionlist.map((item: any, index: number) => { return { "id": index + 1, "value": item.question, } }); const info = res.data.detail; console.log(info, 'info-info'); setTopPValue(info.top_p as number); setTempValue(info.temperature as number); setName(info.name); interface Item2 { index_type_id: number, knowledge_id: string } interface Item { show_recall_result: boolean, recall_method: string, rerank_status: number, slice_config_type: string, slice_count: number, recall_slice_splicing_method: string, param_desc: string, rerank_model_name: string, rerank_index_type_list: [Item2], recall_index_type_list: [Item2] } const data_info: Item = JSON.parse(info.knowledgeInfo === '' ? '{}' : info.knowledgeInfo); if (data_info && typeof data_info === 'object' && data_info.param_desc === 'custom') { setIsVisibleCus(!isVisibleCus); //自定义回答风格 } if (data_info && typeof data_info === 'object' && data_info.rerank_status === 1) { console.log('data_info.rerank_status', data_info.rerank_status); setIsVisibleRerank(!isVisibleRerank) //模型 } //召回切片数量 if (data_info && typeof data_info === 'object' && data_info.slice_config_type === 'fixed') { setIsVisibleSlice(!isVisibleSlice); } else { setIsVisibleSlice(false); } form.setFieldsValue({ id: info.id, name: info.name, //应用名称 desc: info.desc, //应用描述 prompt: info.prompt, //应用提示语 top_p: info.top_p as number, //topP temperature: info.temperature as number, //温度 knowledge_ids: info.knowledge_ids, model: info.model, icon_color: info.icon_color, icon_type: info.icon_type, questionList: sd, //问题列表 max_token: info.maxToken, //应用最大token updateDate: info.updateDate, // 更新时间 param_desc: data_info && data_info.param_desc, //回答风格 show_recall_result: data_info && data_info.show_recall_result, //是否展示召回结果 recall_method: data_info && data_info.recall_method, //召回方式 rerank_status: data_info && data_info.rerank_status, //开启rerank rerank_model_name: data_info && data_info.rerank_model_name, //模型名称 slice_config_type: data_info && data_info.slice_config_type, // 召回切片数量 slice_count: data_info && data_info.slice_count, // 切片数量 recall_slice_splicing_method: data_info && data_info.recall_slice_splicing_method, // 切片内容 // rerank_status = 1 rerank_index_type_list // recall_method = 'embedding' || 'mixed' recall_index_type_list //recall_index_type_list: info.recall_index_type_list, //知识库id //rerank_index_type_list: info.rerank_index_type_list, //知识库id }) if (sd.length > 0) { setInputs(sd); } } catch (error) { console.error(error); } finally { setPageLoading(false); } }, //获取知识库列表 fetchKnowlegde: async () => { try { const res = await apis.fetchKnowledgeList(); const list = res.data.map((item: any) => { return { label: item.name, value: item.knowledgeId, } }); setKnowledgeList(list); } catch (error: any) { console.error(error); } }, // 获取模型列表 fetchModelList: async () => { try { const res = await apis.fetchModelList(); const list = res.data.data.map((item: any) => { return { label: item.modelName, value: item.modelCode, } }); setModelList(list); } catch (error: any) { console.error(error); } }, } const handleRedioClick = (value: string) => { setIsVisibleCus(false); // if (value === 'strict') { // setTopPValue(0.5); // setTempValue(0.10); // } else if (value === 'moderate') { // setTopPValue(0.7); // setTempValue(0.50); // } else if (value === 'flexib') { // setTopPValue(0.9); // setTempValue(0.90); // } } return ( 添加预设问题 { inputs.map(input => ( 问题 {input.id} handleChange(input.id, e.target.value)} /> ))} { form.validateFields(['name', 'desc']).then(async (values) => { setStep(2); setInputs(inputs); console.log(inputs, 'inputs'); }).catch((error) => { console.error(error); }); }} > 下一步 { setStep(1); }} > 上一步 { form.validateFields().then(async (values) => { const data = values; // 问题列表 const question: string[] = []; if (inputs) { inputs.map((item, index) => { question.push(item.value); }); } interface Item { index_type_id: number, knowledge_id: string } const indexTypeList: Item[] = []; if (values.knowledge_ids && values.knowledge_ids.length > 0) { values.knowledge_ids.map((item: string, index: any) => { console.log(item, 'item'); const index_type: Item = { index_type_id: index, knowledge_id: item, }; indexTypeList.push(index_type); }); } console.log(values.rerank_status , 'values.rerank_status '); const rerankIndexTypeList: Item[] = []; if (values.rerank_status === 1 || values.rerank_status === true) { values.knowledge_ids.map((item: string, index: any) => { console.log(item, 'rerankIndexTypeList'); const index_type: Item = { index_type_id: index, knowledge_id: item, }; rerankIndexTypeList.push(index_type); }); } console.log(values.rerank_status , 'values.rerank_status '); const data_info = { param_desc: values.param_desc === undefined ? '' : values.param_desc, //回答风格 show_recall_result: values.show_recall_result === undefined ? '' : values.show_recall_result, //是否展示召回结果 recall_method: values.recall_method === undefined ? '' : values.recall_method, //召回方式 rerank_status: values.rerank_status === 1 || values.rerank_status === true ? 1 : 0, //开启rerank rerank_model_name: values.rerank_status === 1 || values.rerank_status === true ? 'rerank' : '', //模型名称 slice_config_type: values.slice_config_type === undefined ? '' : values.slice_config_type, // 召回切片数量 slice_count: values.slice_count === undefined ? '' : values.slice_count, // 切片数量 recall_slice_splicing_method: values.recall_slice_splicing_method === undefined ? '' : values.recall_slice_splicing_method, // 切片内容 rerank_index_type_list: rerankIndexTypeList, //知识库id recall_index_type_list: values.recall_method === undefined ? [] : values.recall_method === 'embedding' || 'mixed' ? indexTypeList : [], embedding_recall_ratio: 0 //向量化检索比例 // rerank_status = 1 rerank_index_type_list // recall_method = 'embedding' || 'embedding' recall_index_type_list }; // const knowledgeIds: string[] = []; // knowledgeIds.push(values.knowledge_ids); const info = { id: values.id, name: values.name, //应用名称 desc: values.desc, //应用描述 prompt: values.prompt, //应用提示语 top_p: topPValue.toString(), //topP temperature: tempValue.toString(), //温度 knowledge_ids: values.knowledge_ids, slice_count: values.slice_count, model: values.model, icon_color: values.icon_color, icon_type: values.icon_type, questionList: question, knowledge_info: data_info, max_token: values.max_token, //应用最大token }; const id = location?.state?.id; let res = null; if (id) { // 编辑应用 res = await apis.modifyApplicationApi(id, info); } else { // 创建应用 res = await await apis.createApplicationApi(info); } if (res.data.code !== 200) { message.error(res.data.message); } else { message.success('修改成功'); router.navigate({ pathname: '/questionAnswer' }); } }).catch((error) => { console.error(error); error.errorFields && error.errorFields.map((item: any) => { console.log(item, 'item'); message.error(`字段 ${item.name} ${item.errors[0]}`); }); }); }} >发布应用 Prompt编写 欢迎使用 {name} { knowledgeList.map((item, index) => { return {item.label} }) } { modelList.map((item, index) => { return {item.label} }) } { !isVisible && { setIsVisible(!isVisible); }} className='questionAnswerInfo-content-title'> 更多设置 } {/* {isVisible && */} {isVisibleCus && } { handleRedioClick('strict') }} value='strict'>严谨 { handleRedioClick('moderate') }} value='moderate'>适中 { handleRedioClick('flexib') }} value='flexib'>发散 { setIsVisibleCus(!isVisibleCus); setTopPValue(0.1); setTempValue(0.01); }} >自定义 重排方式 {isVisibleRerank && 默认rerank模型 } 手动设置 自动设置 {isVisibleSlice && } {/* } */} ); }; export default observer(QuestionAnswerInfo);
重排方式