perf: template
This commit is contained in:
parent
5e0b147048
commit
b7d18e38d1
File diff suppressed because it is too large
Load Diff
@ -31,6 +31,10 @@ export enum FlowModuleTypeEnum {
|
|||||||
classifyQuestion = 'classifyQuestion'
|
classifyQuestion = 'classifyQuestion'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum SpecialInputKeyEnum {
|
||||||
|
'answerText' = 'text'
|
||||||
|
}
|
||||||
|
|
||||||
export const initModuleType: Record<string, boolean> = {
|
export const initModuleType: Record<string, boolean> = {
|
||||||
[FlowModuleTypeEnum.historyNode]: true,
|
[FlowModuleTypeEnum.historyNode]: true,
|
||||||
[FlowModuleTypeEnum.questionInput]: true
|
[FlowModuleTypeEnum.questionInput]: true
|
||||||
@ -38,8 +42,8 @@ export const initModuleType: Record<string, boolean> = {
|
|||||||
|
|
||||||
export const edgeOptions = {
|
export const edgeOptions = {
|
||||||
style: {
|
style: {
|
||||||
strokeWidth: 1,
|
strokeWidth: 1.5,
|
||||||
stroke: '#5A646Es'
|
stroke: '#5A646Es'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export const connectionLineStyle = { strokeWidth: 1, stroke: '#5A646Es' };
|
export const connectionLineStyle = { strokeWidth: 1.5, stroke: '#5A646Es' };
|
||||||
|
|||||||
@ -41,15 +41,19 @@ const NodeCard = ({
|
|||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
)}
|
)}
|
||||||
<Box flex={1} />
|
<Box flex={1} />
|
||||||
<MyIcon
|
<Flex
|
||||||
className={'nodrag'}
|
className={'nodrag'}
|
||||||
name="delete"
|
w={'22px'}
|
||||||
cursor={'pointer'}
|
h={'22px'}
|
||||||
|
alignItems={'center'}
|
||||||
|
justifyContent={'center'}
|
||||||
color={'myGray.600'}
|
color={'myGray.600'}
|
||||||
w={'16px'}
|
|
||||||
_hover={{ color: 'red.600' }}
|
_hover={{ color: 'red.600' }}
|
||||||
|
cursor={'pointer'}
|
||||||
onClick={() => onDelNode(moduleId)}
|
onClick={() => onDelNode(moduleId)}
|
||||||
/>
|
>
|
||||||
|
<MyIcon name="delete" w={'16px'} />
|
||||||
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
{children}
|
{children}
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@ -283,7 +283,6 @@ const AppEdit = ({ app, fullScreen, onFullScreen }: Props) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initData(JSON.parse(JSON.stringify(app)));
|
initData(JSON.parse(JSON.stringify(app)));
|
||||||
}, [app, initData]);
|
}, [app, initData]);
|
||||||
console.log(flow2AppModules());
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -51,7 +51,7 @@ export const dispatchClassifyQuestion = async (props: Record<string, any>): Prom
|
|||||||
// function body
|
// function body
|
||||||
const agentFunction = {
|
const agentFunction = {
|
||||||
name: agentFunName,
|
name: agentFunName,
|
||||||
description: '判断用户问题的类型,并返回指定值',
|
description: '判断用户问题的类型属于哪方面,返回对应的枚举字段',
|
||||||
parameters: {
|
parameters: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
@ -81,13 +81,9 @@ export const dispatchClassifyQuestion = async (props: Record<string, any>): Prom
|
|||||||
|
|
||||||
const arg = JSON.parse(response.data.choices?.[0]?.message?.function_call?.arguments || '');
|
const arg = JSON.parse(response.data.choices?.[0]?.message?.function_call?.arguments || '');
|
||||||
|
|
||||||
if (!arg.type) {
|
|
||||||
throw new Error('');
|
|
||||||
}
|
|
||||||
|
|
||||||
const tokens = response.data.usage?.total_tokens || 0;
|
const tokens = response.data.usage?.total_tokens || 0;
|
||||||
|
|
||||||
const result = agents.find((item) => item.key === arg.type) || agents[0];
|
const result = agents.find((item) => item.key === arg?.type) || agents[0];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
[result.key]: 1,
|
[result.key]: 1,
|
||||||
|
|||||||
@ -31,7 +31,7 @@ const simplifyStr = (str = '') =>
|
|||||||
.replace(/[^\S\r\n]+/g, ' ') // 连续空白内容
|
.replace(/[^\S\r\n]+/g, ' ') // 连续空白内容
|
||||||
.trim();
|
.trim();
|
||||||
|
|
||||||
/* 聊天上下文 tokens 截断 */
|
/* slice chat context by tokens */
|
||||||
export const ChatContextFilter = ({
|
export const ChatContextFilter = ({
|
||||||
model,
|
model,
|
||||||
prompts,
|
prompts,
|
||||||
@ -41,33 +41,19 @@ export const ChatContextFilter = ({
|
|||||||
prompts: ChatItemType[];
|
prompts: ChatItemType[];
|
||||||
maxTokens: number;
|
maxTokens: number;
|
||||||
}) => {
|
}) => {
|
||||||
const systemPrompts: ChatItemType[] = [];
|
const rawTextLen = prompts.reduce((sum, item) => sum + item.value.length, 0);
|
||||||
const chatPrompts: ChatItemType[] = [];
|
|
||||||
|
|
||||||
let rawTextLen = 0;
|
// If the text length is less than half of the maximum token, no calculation is required
|
||||||
prompts.forEach((item) => {
|
|
||||||
const val = simplifyStr(item.value);
|
|
||||||
rawTextLen += val.length;
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
_id: item._id,
|
|
||||||
obj: item.obj,
|
|
||||||
value: val
|
|
||||||
};
|
|
||||||
|
|
||||||
if (item.obj === ChatRoleEnum.System) {
|
|
||||||
systemPrompts.push(data);
|
|
||||||
} else {
|
|
||||||
chatPrompts.push(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 长度太小时,不需要进行 token 截断
|
|
||||||
if (rawTextLen < maxTokens * 0.5) {
|
if (rawTextLen < maxTokens * 0.5) {
|
||||||
return [...systemPrompts, ...chatPrompts];
|
return prompts;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 去掉 system 的 token
|
// filter startWith system prompt
|
||||||
|
const chatStartIndex = prompts.findIndex((item) => item.obj !== ChatRoleEnum.System);
|
||||||
|
const systemPrompts: ChatItemType[] = prompts.slice(0, chatStartIndex);
|
||||||
|
const chatPrompts: ChatItemType[] = prompts.slice(chatStartIndex);
|
||||||
|
|
||||||
|
// reduce token of systemPrompt
|
||||||
maxTokens -= modelToolMap.countTokens({
|
maxTokens -= modelToolMap.countTokens({
|
||||||
model,
|
model,
|
||||||
messages: systemPrompts
|
messages: systemPrompts
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import type { AppModuleInputItemType, AppModuleItemType, VariableItemType } from '@/types/app';
|
import type { AppModuleInputItemType, AppModuleItemType, VariableItemType } from '@/types/app';
|
||||||
import { chatModelList, vectorModelList } from '@/store/static';
|
import { chatModelList, vectorModelList } from '@/store/static';
|
||||||
import { FlowModuleTypeEnum } from '@/constants/flow';
|
import { FlowModuleTypeEnum, SpecialInputKeyEnum } from '@/constants/flow';
|
||||||
import { SystemInputEnum } from '@/constants/app';
|
import { SystemInputEnum } from '@/constants/app';
|
||||||
|
import { TaskResponseKeyEnum } from '@/constants/chat';
|
||||||
import type { SelectedKbType } from '@/types/plugin';
|
import type { SelectedKbType } from '@/types/plugin';
|
||||||
|
|
||||||
export type EditFormType = {
|
export type EditFormType = {
|
||||||
@ -128,7 +129,7 @@ export const appModules2Form = (modules: AppModuleItemType[]) => {
|
|||||||
if (emptyOutput) {
|
if (emptyOutput) {
|
||||||
const target = modules.find((item) => item.moduleId === emptyOutput.moduleId);
|
const target = modules.find((item) => item.moduleId === emptyOutput.moduleId);
|
||||||
defaultAppForm.kb.searchEmptyText =
|
defaultAppForm.kb.searchEmptyText =
|
||||||
target?.inputs?.find((item) => item.key === 'answerText')?.value || '';
|
target?.inputs?.find((item) => item.key === SpecialInputKeyEnum.answerText)?.value || '';
|
||||||
}
|
}
|
||||||
} else if (module.flowType === FlowModuleTypeEnum.userGuide) {
|
} else if (module.flowType === FlowModuleTypeEnum.userGuide) {
|
||||||
const val =
|
const val =
|
||||||
@ -173,6 +174,10 @@ const chatModelInput = (formData: EditFormType): AppModuleInputItemType[] => [
|
|||||||
value: formData.chatModel.limitPrompt,
|
value: formData.chatModel.limitPrompt,
|
||||||
connected: true
|
connected: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'switch',
|
||||||
|
connected: formData.kb.list.length > 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: 'quoteQA',
|
key: 'quoteQA',
|
||||||
connected: formData.kb.list.length > 0
|
connected: formData.kb.list.length > 0
|
||||||
@ -289,7 +294,7 @@ const simpleChatTemplate = (formData: EditFormType): AppModuleItemType[] => [
|
|||||||
inputs: chatModelInput(formData),
|
inputs: chatModelInput(formData),
|
||||||
outputs: [
|
outputs: [
|
||||||
{
|
{
|
||||||
key: 'answerText',
|
key: TaskResponseKeyEnum.answerText,
|
||||||
targets: []
|
targets: []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -439,7 +444,7 @@ const kbTemplate = (formData: EditFormType): AppModuleItemType[] => [
|
|||||||
connected: true
|
connected: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'answerText',
|
key: SpecialInputKeyEnum.answerText,
|
||||||
value: formData.kb.searchEmptyText,
|
value: formData.kb.searchEmptyText,
|
||||||
connected: true
|
connected: true
|
||||||
}
|
}
|
||||||
@ -458,7 +463,7 @@ const kbTemplate = (formData: EditFormType): AppModuleItemType[] => [
|
|||||||
inputs: chatModelInput(formData),
|
inputs: chatModelInput(formData),
|
||||||
outputs: [
|
outputs: [
|
||||||
{
|
{
|
||||||
key: 'answerText',
|
key: TaskResponseKeyEnum.answerText,
|
||||||
targets: []
|
targets: []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user