Skip to content

Commit

Permalink
feat: search max tokens
Browse files Browse the repository at this point in the history
  • Loading branch information
c121914yu committed Dec 8, 2023
1 parent 883045c commit 2e063da
Show file tree
Hide file tree
Showing 14 changed files with 235 additions and 116 deletions.
3 changes: 2 additions & 1 deletion files/deploy/fastgpt/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# 非 host 版本, 不使用本机代理
# (不懂 Docker 的,只需要关心 OPENAI_BASE_URL 和 CHAT_API_KEY 即可!)
version: '3.3'
services:
pg:
Expand Down Expand Up @@ -47,7 +48,7 @@ services:
environment:
# root 密码,用户名为: root
- DEFAULT_ROOT_PSW=1234
# 中转地址,如果是用官方号,不需要管
# 中转地址,如果是用官方号,不需要管。务必加 /v1
- OPENAI_BASE_URL=https://api.openai.com/v1
- CHAT_API_KEY=sk-xxxx
- DB_MAX_LINK=5 # database max link
Expand Down
2 changes: 1 addition & 1 deletion packages/global/core/app/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const getDefaultAppForm = (templateId = 'fastgpt-universal'): AppSimpleEd
dataset: {
datasets: [],
similarity: 0.4,
limit: 5,
limit: 1500,
searchEmptyText: '',
searchMode: DatasetSearchModeEnum.embedding
},
Expand Down
13 changes: 3 additions & 10 deletions packages/global/core/module/template/system/datasetSearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,10 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
{
key: ModuleInputKeyEnum.datasetLimit,
type: FlowNodeInputTypeEnum.hidden,
label: '单次搜索上限',
description: '最多取 n 条记录作为本次问题引用',
value: 5,
label: '引用上限',
description: '单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens',
value: 1500,
valueType: ModuleDataTypeEnum.number,
min: 1,
max: 20,
step: 1,
markList: [
{ label: '1', value: 1 },
{ label: '20', value: 20 }
],
showTargetInApp: false,
showTargetInPlugin: false
},
Expand Down
3 changes: 3 additions & 0 deletions projects/app/public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -408,8 +408,11 @@
},
"link": "Link",
"search": {
"Dataset Search Params": "Dataset Search Params",
"Empty result response": "Empty Response",
"Empty result response Tips": "If you fill in the content, if no suitable content is found, you will directly reply to the content.",
"Max Tokens": "Max Tokens",
"Max Tokens Tips": "The maximum number of Tokens in a single search, about 1 word in Chinese =1.7Tokens, about 1 word in English =1 tokens",
"Min Similarity": "Min Similarity",
"Min Similarity Tips": "The similarity of different index models is different, please use the search test to select the appropriate value",
"Params Setting": "Params Setting",
Expand Down
3 changes: 3 additions & 0 deletions projects/app/public/locales/zh/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -408,8 +408,11 @@
},
"link": "链接",
"search": {
"Dataset Search Params": "搜索参数",
"Empty result response": "空搜索回复",
"Empty result response Tips": "若填写该内容,没有搜索到合适内容时,将直接回复填写的内容。",
"Max Tokens": "引用上限",
"Max Tokens Tips": "单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens",
"Min Similarity": "最低相关度",
"Min Similarity Tips": "不同索引模型的相关度有区别,请通过搜索测试来选择合适的数值,使用 ReRank 时,相关度可能会很低。",
"Params Setting": "搜索参数设置",
Expand Down
4 changes: 2 additions & 2 deletions projects/app/src/components/ChatBox/WholeResponseModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ const WholeResponseModal = ({
rawDom={
activeModule.historyPreview ? (
<>
{activeModule.historyPreview?.map((item) => (
{activeModule.historyPreview?.map((item, i) => (
<Box
key={item.dataId}
key={i}
_notLast={{
borderBottom: '1px solid',
borderBottomColor: 'myWhite.700',
Expand Down
2 changes: 1 addition & 1 deletion projects/app/src/components/common/MyRadio/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ const MyRadio = ({
<Box pr={2}>
<Box>{t(item.title)}</Box>
{!!item.desc && (
<Box fontSize={'sm'} color={'myGray.500'}>
<Box fontSize={['xs', 'sm']} color={'myGray.500'}>
{t(item.desc)}
</Box>
)}
Expand Down
54 changes: 31 additions & 23 deletions projects/app/src/components/core/module/DatasetParamsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ type DatasetParamsProps = {
limit?: number;
searchMode: `${DatasetSearchModeEnum}`;
searchEmptyText?: string;
maxTokens?: number;
};

const DatasetParamsModal = ({
searchEmptyText,
limit,
similarity,
searchMode = DatasetSearchModeEnum.embedding,
maxTokens = 3000,
onClose,
onSuccess
}: DatasetParamsProps & { onClose: () => void; onSuccess: (e: DatasetParamsProps) => void }) => {
Expand Down Expand Up @@ -52,8 +54,8 @@ const DatasetParamsModal = ({
isOpen={true}
onClose={onClose}
iconSrc="/imgs/modal/params.svg"
title={'搜索参数调整'}
minW={['90vw', '500px']}
title={t('core.dataset.search.Dataset Search Params')}
w={['90vw', '550px']}
h={['90vh', 'auto']}
overflow={'unset'}
isCentered={searchEmptyText !== undefined}
Expand All @@ -78,36 +80,42 @@ const DatasetParamsModal = ({
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<MySlider
markList={[
{ label: '0', value: 0 },
{ label: '1', value: 1 }
]}
min={0}
max={1}
step={0.01}
value={getValues(ModuleInputKeyEnum.datasetSimilarity) ?? 0.5}
onChange={(val) => {
setValue(ModuleInputKeyEnum.datasetSimilarity, val);
setRefresh(!refresh);
}}
/>
<Box flex={1} mx={4}>
<MySlider
markList={[
{ label: '0', value: 0 },
{ label: '1', value: 1 }
]}
min={0}
max={1}
step={0.01}
value={getValues(ModuleInputKeyEnum.datasetSimilarity) ?? 0.5}
onChange={(val) => {
setValue(ModuleInputKeyEnum.datasetSimilarity, val);
setRefresh(!refresh);
}}
/>
</Box>
</Box>
)}
{limit !== undefined && (
<Box display={['block', 'flex']} py={8}>
<Box flex={'0 0 100px'} mb={[8, 0]}>
{t('core.dataset.search.Top K')}
{t('core.dataset.search.Max Tokens')}
<MyTooltip label={t('core.dataset.search.Max Tokens Tips')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<Box flex={1}>
<Box flex={1} mx={4}>
<MySlider
markList={[
{ label: '1', value: 1 },
{ label: '30', value: 30 }
{ label: '300', value: 300 },
{ label: maxTokens, value: maxTokens }
]}
min={1}
max={30}
value={getValues(ModuleInputKeyEnum.datasetLimit) ?? 5}
min={300}
max={maxTokens}
step={10}
value={getValues(ModuleInputKeyEnum.datasetLimit) ?? 1000}
onChange={(val) => {
setValue(ModuleInputKeyEnum.datasetLimit, val);
setRefresh(!refresh);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {
Grid,
Switch
} from '@chakra-ui/react';
import { FlowNodeInputTypeEnum } from '@fastgpt/global/core/module/node/constant';
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import dynamic from 'next/dynamic';
import { onChangeNode, useFlowProviderStore } from '../../FlowProvider';
Expand All @@ -37,6 +37,7 @@ import { useQuery } from '@tanstack/react-query';
import type { EditFieldModeType, EditFieldType } from '../modules/FieldEditModal';
import { feConfigs } from '@/web/common/system/staticData';
import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constant';
import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants';

const FieldEditModal = dynamic(() => import('../modules/FieldEditModal'));
const SelectAppModal = dynamic(() => import('../../SelectAppModal'));
Expand Down Expand Up @@ -635,16 +636,36 @@ const SelectAppRender = React.memo(function SelectAppRender({ item, moduleId }:
});

const SelectDatasetParamsRender = React.memo(function SelectDatasetParamsRender({
item,
inputs = [],
moduleId
}: RenderProps) {
const { nodes } = useFlowProviderStore();

const { t } = useTranslation();
const [data, setData] = useState({
searchMode: DatasetSearchModeEnum.embedding,
limit: 5,
similarity: 0.5
});

const tokenLimit = useMemo(() => {
let maxTokens = 3000;

nodes.forEach((item) => {
if (item.type === FlowNodeTypeEnum.chatNode) {
const model =
item.data.inputs.find((item) => item.key === ModuleInputKeyEnum.aiModel)?.value || '';
const quoteMaxToken =
chatModelList.find((item) => item.model === model)?.quoteMaxToken || 3000;

maxTokens = Math.max(maxTokens, quoteMaxToken);
}
});

return maxTokens;
}, [nodes]);

const { isOpen, onOpen, onClose } = useDisclosure();

useEffect(() => {
Expand All @@ -671,6 +692,7 @@ const SelectDatasetParamsRender = React.memo(function SelectDatasetParamsRender(
{isOpen && (
<DatasetParamsModal
{...data}
maxTokens={tokenLimit}
onClose={onClose}
onSuccess={(e) => {
for (let key in e) {
Expand Down
106 changes: 71 additions & 35 deletions projects/app/src/global/core/prompt/AIChat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,77 +4,113 @@ export const Prompt_QuoteTemplateList: PromptTemplateItem[] = [
{
title: '标准模板',
desc: '标准提示词,用于结构不固定的知识库。',
value: `{{q}}\n{{a}}`
value: `<data>
{{q}}
{{a}}
</data>`
},
{
title: '问答模板',
desc: '适合 QA 问答结构的知识库,或大部分核心介绍位于 a 的知识库。',
value: `{instruction:"{{q}}",output:"{{a}}"}`
desc: '适合 QA 问答结构的知识库,可以让AI较为严格的按预设内容回答',
value: `<QA>
<问题>
{{q}}
</问题>
<答案>
{{a}}
</答案>
</QA>`
},
{
title: '标准严格模板',
desc: '在标准模板基础上,对模型的回答做更严格的要求。',
value: `{{q}}\n{{a}}`
value: `<data>
{{q}}
{{a}}
</data>`
},
{
title: '严格问答模板',
desc: '在问答模板基础上,对模型的回答做更严格的要求。',
value: `{question:"{{q}}",answer:"{{a}}"}`
value: `<QA>
<问题>
{{q}}
</问题>
<答案>
{{a}}
</答案>
</QA>`
}
];

export const Prompt_QuotePromptList: PromptTemplateItem[] = [
{
title: '标准模板',
desc: '',
value: `你的知识库:
"""
value: `使用 <data></data> 标记中的内容作为你的知识:
{{quote}}
"""
回答要求:
1. 优先使用知识库内容回答问题。
2. 不要提及你是从知识库获取的知识。
3. 知识库包含 markdown 内容时,按 markdown 格式返回。
我的问题是:"{{question}}"`
- 如果你不清楚答案,你需要澄清。
- 避免提及你是从 data 获取的知识。
- 保持答案与 data 中描述的一致。
- 使用 Markdown 语法优化回答格式。
- 使用与问题相同的语言回答。
问题:"{{question}}"`
},
{
title: '问答模板',
desc: '',
value: `你的知识库:
"""
value: `使用 <QA></QA> 标记中的问答对进行回答。
{{quote}}
"""
回答要求:
1. 优先使用知识库内容回答问题,其中 instruction 是相关介绍,output 是预期回答或补充。
2. 不要提及你是从知识库获取的知识。
3. 知识库包含 markdown 内容时,按 markdown 格式返回。
我的问题是:"{{question}}"`
- 选择其中一个或多个问答对进行回答。
- 回答的内容应尽可能与 <答案></答案> 中的内容一致。
- 如果没有相关的问答对,你需要澄清。
- 避免提及你是从 QA 获取的知识,只需要回复答案。
问题:"{{question}}"`
},
{
title: '标准严格模板',
desc: '',
value: `你的知识库:
"""
value: `忘记你已有的知识,仅使用 <data></data> 标记中的内容作为你的知识:
{{quote}}
"""
思考流程:
1. 判断问题是否与 <data></data> 标记中的内容有关。
2. 如果有关,你按下面的要求回答。
3. 如果无关,你直接拒绝回答本次问题。
回答要求:
1. 仅使用知识库内容回答问题。
2. 与知识库无关的问题,你直接回答我不知道。
3. 不要提及你是从知识库获取的知识。
4. 知识库包含 markdown 内容时,按 markdown 格式返回。
我的问题是:"{{question}}"`
- 避免提及你是从 data 获取的知识。
- 保持答案与 data 中描述的一致。
- 使用 Markdown 语法优化回答格式。
- 使用与问题相同的语言回答。
问题:"{{question}}"`
},
{
title: '严格问答模板',
desc: '',
value: `你的知识库:
"""
value: `忘记你已有的知识,仅使用 <QA></QA> 标记中的问答对进行回答。
{{quote}}
"""
回答要求:
1. 从知识库中选择一个合适的答案进行回答,其中 instruction 是相关问题,answer 是已知答案。
2. 与知识库无关的问题,你直接回答我不知道。
3. 不要提及你是从知识库获取的知识。
我的问题是:"{{question}}"`
思考流程:
1. 判断问题是否与 <QA></QA> 标记中的内容有关。
2. 如果无关,你直接拒绝回答本次问题。
3. 判断是否有相近或相同的问题。
4. 如果有相同的问题,直接输出对应答案。
5. 如果只有相近的问题,请把相近的问题和答案一起输出。
最后,避免提及你是从 QA 获取的知识,只需要回复答案。
问题:"{{question}}"`
}
];
Loading

0 comments on commit 2e063da

Please sign in to comment.