2024-02-20 18:10:20 +08:00
import {
LlmModelType ,
ModelVariableType ,
settledModelVariableMap ,
} from '@/constants/knowledge' ;
import { Divider , Flex , Form , InputNumber , Select , Slider , Switch } from 'antd' ;
2024-02-19 19:16:23 +08:00
import classNames from 'classnames' ;
2024-02-20 18:10:20 +08:00
import { useEffect } from 'react' ;
2024-02-22 17:14:25 +08:00
import { ISegmentedContentProps } from '../interface' ;
2024-02-19 19:16:23 +08:00
2024-02-20 18:10:20 +08:00
import { useFetchLlmList , useSelectLlmOptions } from '@/hooks/llmHooks' ;
2024-02-22 17:14:25 +08:00
import { variableEnabledFieldMap } from '../constants' ;
2024-02-19 19:16:23 +08:00
import styles from './index.less' ;
2024-02-20 18:10:20 +08:00
const ModelSetting = ( { show , form } : ISegmentedContentProps ) = > {
const parameterOptions = Object . values ( ModelVariableType ) . map ( ( x ) = > ( {
label : x ,
value : x ,
} ) ) ;
const modelOptions = useSelectLlmOptions ( ) ;
const handleParametersChange = ( value : ModelVariableType ) = > {
2024-03-14 19:22:39 +08:00
const variable = settledModelVariableMap [ value ] ;
2024-02-20 18:10:20 +08:00
form . setFieldsValue ( { llm_setting : variable } ) ;
2024-03-14 19:22:39 +08:00
} ;
2024-02-20 18:10:20 +08:00
useEffect ( ( ) = > {
const values = Object . keys ( variableEnabledFieldMap ) . reduce <
Record < string , boolean >
> ( ( pre , field ) = > {
pre [ field ] = true ;
return pre ;
} , { } ) ;
form . setFieldsValue ( values ) ;
} , [ form ] ) ;
useFetchLlmList ( LlmModelType . Chat ) ;
2024-02-19 19:16:23 +08:00
return (
< section
className = { classNames ( {
[ styles . segmentedHidden ] : ! show ,
} ) }
>
< Form.Item
label = "Model"
2024-02-20 18:10:20 +08:00
name = "llm_id"
2024-03-22 15:35:06 +08:00
tooltip = "Large language chat model"
2024-02-20 18:10:20 +08:00
rules = { [ { required : true , message : 'Please select!' } ] }
2024-02-19 19:16:23 +08:00
>
2024-03-11 16:13:34 +08:00
< Select options = { modelOptions } showSearch / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< Divider > < / Divider >
< Form.Item
2024-03-22 15:35:06 +08:00
label = "Freedom"
2024-02-19 19:16:23 +08:00
name = "parameters"
2024-03-22 15:35:06 +08:00
tooltip = "'Precise' means the LLM will be conservative and answer your question cautiously. 'Improvise' means the you want LLM talk much and freely. 'Balance' is between cautiously and freely."
2024-02-20 18:10:20 +08:00
initialValue = { ModelVariableType . Precise }
2024-02-19 19:16:23 +08:00
// rules={[{ required: true, message: 'Please input!' }]}
>
2024-02-20 18:10:20 +08:00
< Select < ModelVariableType >
options = { parameterOptions }
onChange = { handleParametersChange }
/ >
2024-02-19 19:16:23 +08:00
< / Form.Item >
2024-03-22 15:35:06 +08:00
< Form.Item label = "Temperature" tooltip = { 'This parameter controls the randomness of predictions by the model. A lower temperature makes the model more confident in its responses, while a higher temperature makes it more creative and diverse.' } >
2024-02-20 18:10:20 +08:00
< Flex gap = { 20 } align = "center" >
< Form.Item
name = { 'temperatureEnabled' }
valuePropName = "checked"
noStyle
>
< Switch size = "small" / >
< / Form.Item >
2024-02-19 19:16:23 +08:00
< Flex flex = { 1 } >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'temperature' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Temperature is required' } ] }
2024-02-19 19:16:23 +08:00
>
2024-02-20 18:10:20 +08:00
< Slider className = { styles . variableSlider } max = { 1 } step = { 0.01 } / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< / Flex >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'temperature' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Temperature is required' } ] }
2024-02-19 19:16:23 +08:00
>
< InputNumber
2024-02-20 18:10:20 +08:00
className = { styles . sliderInputNumber }
max = { 1 }
min = { 0 }
step = { 0.01 }
2024-02-19 19:16:23 +08:00
/ >
< / Form.Item >
< / Flex >
< / Form.Item >
2024-03-22 15:35:06 +08:00
< Form.Item label = "Top P" tooltip = { 'Also known as “nucleus sampling,” this parameter sets a threshold to select a smaller set of words to sample from. It focuses on the most likely words, cutting off the less probable ones.' } >
2024-02-20 18:10:20 +08:00
< Flex gap = { 20 } align = "center" >
< Form.Item name = { 'topPEnabled' } valuePropName = "checked" noStyle >
< Switch size = "small" / >
< / Form.Item >
2024-02-19 19:16:23 +08:00
< Flex flex = { 1 } >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'top_p' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Top_p is required' } ] }
2024-02-19 19:16:23 +08:00
>
2024-02-20 18:10:20 +08:00
< Slider className = { styles . variableSlider } max = { 1 } step = { 0.01 } / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< / Flex >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'top_p' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Top_p is required' } ] }
2024-02-19 19:16:23 +08:00
>
< InputNumber
2024-02-20 18:10:20 +08:00
className = { styles . sliderInputNumber }
max = { 1 }
min = { 0 }
step = { 0.01 }
2024-02-19 19:16:23 +08:00
/ >
< / Form.Item >
< / Flex >
< / Form.Item >
2024-03-22 15:35:06 +08:00
< Form.Item label = "Presence Penalty" tooltip = { 'This discourages the model from repeating the same information by penalizing words that have already appeared in the conversation.' } >
2024-02-20 18:10:20 +08:00
< Flex gap = { 20 } align = "center" >
< Form.Item
name = { 'presencePenaltyEnabled' }
valuePropName = "checked"
noStyle
>
< Switch size = "small" / >
< / Form.Item >
2024-02-19 19:16:23 +08:00
< Flex flex = { 1 } >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'presence_penalty' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [
{ required : true , message : 'Presence Penalty is required' } ,
] }
2024-02-19 19:16:23 +08:00
>
2024-02-20 18:10:20 +08:00
< Slider className = { styles . variableSlider } max = { 1 } step = { 0.01 } / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< / Flex >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'presence_penalty' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [
{ required : true , message : 'Presence Penalty is required' } ,
] }
2024-02-19 19:16:23 +08:00
>
< InputNumber
2024-02-20 18:10:20 +08:00
className = { styles . sliderInputNumber }
max = { 1 }
min = { 0 }
step = { 0.01 }
2024-02-19 19:16:23 +08:00
/ >
< / Form.Item >
< / Flex >
< / Form.Item >
2024-03-22 15:35:06 +08:00
< Form.Item label = "Frequency Penalty" tooltip = { 'Similar to the presence penalty, this reduces the model’ s tendency to repeat the same words frequently.' } >
2024-02-20 18:10:20 +08:00
< Flex gap = { 20 } align = "center" >
< Form.Item
name = { 'frequencyPenaltyEnabled' }
valuePropName = "checked"
noStyle
>
< Switch size = "small" / >
< / Form.Item >
2024-02-19 19:16:23 +08:00
< Flex flex = { 1 } >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'frequency_penalty' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [
{ required : true , message : 'Frequency Penalty is required' } ,
] }
2024-02-19 19:16:23 +08:00
>
2024-02-20 18:10:20 +08:00
< Slider className = { styles . variableSlider } max = { 1 } step = { 0.01 } / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< / Flex >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'frequency_penalty' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [
{ required : true , message : 'Frequency Penalty is required' } ,
] }
2024-02-19 19:16:23 +08:00
>
< InputNumber
2024-02-20 18:10:20 +08:00
className = { styles . sliderInputNumber }
max = { 1 }
min = { 0 }
step = { 0.01 }
2024-02-19 19:16:23 +08:00
/ >
< / Form.Item >
< / Flex >
< / Form.Item >
2024-03-22 15:35:06 +08:00
< Form.Item label = "Max Tokens" tooltip = { 'This sets the maximum length of the model’ s output, measured in the number of tokens (words or pieces of words).' } >
2024-02-20 18:10:20 +08:00
< Flex gap = { 20 } align = "center" >
< Form.Item name = { 'maxTokensEnabled' } valuePropName = "checked" noStyle >
< Switch size = "small" / >
< / Form.Item >
2024-02-19 19:16:23 +08:00
< Flex flex = { 1 } >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'max_tokens' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Max Tokens is required' } ] }
2024-02-19 19:16:23 +08:00
>
2024-02-20 18:10:20 +08:00
< Slider className = { styles . variableSlider } max = { 2048 } / >
2024-02-19 19:16:23 +08:00
< / Form.Item >
< / Flex >
< Form.Item
2024-02-20 18:10:20 +08:00
name = { [ 'llm_setting' , 'max_tokens' ] }
2024-02-19 19:16:23 +08:00
noStyle
2024-03-15 14:34:09 +08:00
rules = { [ { required : true , message : 'Max Tokens is required' } ] }
2024-02-19 19:16:23 +08:00
>
< InputNumber
2024-02-20 18:10:20 +08:00
className = { styles . sliderInputNumber }
max = { 2048 }
min = { 0 }
2024-02-19 19:16:23 +08:00
/ >
< / Form.Item >
< / Flex >
< / Form.Item >
< / section >
) ;
} ;
export default ModelSetting ;