diff --git a/packages/global/core/ai/prompt/AIChat.ts b/packages/global/core/ai/prompt/AIChat.ts index 1715081b3..c16c340ec 100644 --- a/packages/global/core/ai/prompt/AIChat.ts +++ b/packages/global/core/ai/prompt/AIChat.ts @@ -8,7 +8,6 @@ export const Prompt_QuoteTemplateList: PromptTemplateItem[] = [ desc: i18nT('app:template.standard_template_des'), value: { ['4.9.7']: `{ - "sourceIndex": "{{sourceIndex}}", "id": "{{id}}", "sourceName": "{{source}}", "content": "{{q}}\n{{a}}" @@ -39,7 +38,6 @@ export const Prompt_QuoteTemplateList: PromptTemplateItem[] = [ desc: i18nT('app:template.standard_strict_des'), value: { ['4.9.7']: `{ - "sourceIndex": "{{sourceIndex}}", "id": "{{id}}", "sourceName": "{{source}}", "content": "{{q}}\n{{a}}" @@ -90,8 +88,8 @@ export const Prompt_userQuotePromptList: PromptTemplateItem[] = [ - 保持答案与 中描述的一致。 - 使用 Markdown 语法优化回答格式。 - 使用与问题相同的语言回答。 -- 使用 [id](QUOTE{{sourceIndex}}) 格式来引用中的知识,其中 QUOTE 是固定常量, id 和 sourceIndex 分别为引文中的值。 -- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE1)。" +- 使用 [id](QUOTE) 格式来引用中的知识,其中 QUOTE 是固定常量, id 为引文中的 id。 +- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE)。" - 每段至少包含一个引用,也可根据内容需要加入多个引用,按顺序排列。`, ['4.9.2']: `使用 标记中的内容作为本次对话的参考: @@ -148,8 +146,8 @@ export const Prompt_userQuotePromptList: PromptTemplateItem[] = [ - 保持答案与 中描述的一致。 - 使用 Markdown 语法优化回答格式。 - 使用与问题相同的语言回答。 -- 使用 [id](QUOTE{{sourceIndex}}) 格式来引用中的知识,其中 QUOTE 是固定常量, id 和 sourceIndex 分别为引文中的值。 -- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE1)。" +- 使用 [id](QUOTE) 格式来引用中的知识,其中 QUOTE 是固定常量, id 为引文中的 id。 +- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE)。" - 每段至少包含一个引用,也可根据内容需要加入多个引用,按顺序排列。 问题:"""{{question}}"""`, @@ -219,8 +217,8 @@ export const Prompt_systemQuotePromptList: PromptTemplateItem[] = [ - 保持答案与 中描述的一致。 - 使用 Markdown 语法优化回答格式。 - 使用与问题相同的语言回答。 -- 使用 [id](QUOTE{{sourceIndex}}) 格式来引用中的知识,其中 QUOTE 是固定常量, id 和 sourceIndex 分别为引文中的值。 -- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE1)。" +- 使用 [id](QUOTE) 格式来引用中的知识,其中 QUOTE 是固定常量, id 为引文中的 id。 +- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE)。" - 每段至少包含一个引用,也可根据内容需要加入多个引用,按顺序排列。`, ['4.9.2']: `使用 标记中的内容作为本次对话的参考: @@ -273,8 +271,8 @@ export const Prompt_systemQuotePromptList: PromptTemplateItem[] = [ - 保持答案与 中描述的一致。 - 使用 Markdown 语法优化回答格式。 - 使用与问题相同的语言回答。 -- 使用 [id](QUOTE{{sourceIndex}}) 格式来引用中的知识,其中 QUOTE 是固定常量, id 和 sourceIndex 分别为引文中的值。 -- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE1)。" +- 使用 [id](QUOTE) 格式来引用中的知识,其中 QUOTE 是固定常量, id 为引文中的 id。 +- 在每段结尾自然地整合引用。例如: "FastGPT 是一个基于大语言模型(LLM)的知识库问答系统[67e517e74767063e882d6861](QUOTE)。" - 每段至少包含一个引用,也可根据内容需要加入多个引用,按顺序排列。 问题:"""{{question}}"""`, diff --git a/packages/service/core/workflow/dispatch/chat/oneapi.ts b/packages/service/core/workflow/dispatch/chat/oneapi.ts index d8d9561db..e1d586c1f 100644 --- a/packages/service/core/workflow/dispatch/chat/oneapi.ts +++ b/packages/service/core/workflow/dispatch/chat/oneapi.ts @@ -348,17 +348,7 @@ async function filterDatasetQuote({ model: LLMModelItemType; quoteTemplate: string; }) { - function getValue({ - item, - index, - sourceList - }: { - item: SearchDataResponseItemType; - index: number; - sourceList: { sourceName: string; sourceId: string; sourceIndex: number }[]; - }) { - const source = sourceList.find((source) => source.sourceId === item.sourceId); - + function getValue({ item, index }: { item: SearchDataResponseItemType; index: number }) { return replaceVariable(quoteTemplate, { id: item.id, q: item.q, @@ -366,7 +356,6 @@ async function filterDatasetQuote({ updateTime: formatTime2YMDHM(item.updateTime), source: item.sourceName, sourceId: String(item.sourceId || ''), - sourceIndex: source?.sourceIndex || 1, index: index + 1 }); } @@ -374,24 +363,9 @@ async function filterDatasetQuote({ // slice filterSearch const filterQuoteQA = await filterSearchResultsByMaxChars(quoteQA, model.quoteMaxToken); - const sourceList = Object.values( - filterQuoteQA.reduce((acc: Record, cur) => { - if (!acc[cur.collectionId]) { - acc[cur.collectionId] = [cur]; - } - return acc; - }, {}) - ) - .flat() - .map((item, index) => ({ - sourceName: item.sourceName || '', - sourceId: item.sourceId || '', - sourceIndex: index + 1 - })); - const datasetQuoteText = filterQuoteQA.length > 0 - ? `${filterQuoteQA.map((item, index) => getValue({ item, index, sourceList }).trim()).join('\n------\n')}` + ? `${filterQuoteQA.map((item, index) => getValue({ item, index }).trim()).join('\n------\n')}` : ''; return { diff --git a/projects/app/src/components/Markdown/A.tsx b/projects/app/src/components/Markdown/A.tsx index 3230ea784..893f618e2 100644 --- a/projects/app/src/components/Markdown/A.tsx +++ b/projects/app/src/components/Markdown/A.tsx @@ -56,9 +56,6 @@ const A = ({ children, ...props }: any) => { // Quote if (props.href?.startsWith('QUOTE') && typeof children?.[0] === 'string') { - const indexMatch = props.href.match(/QUOTE(\d+)/); - const index = indexMatch ? indexMatch[1] : '1'; - const sourceData = useMemo( () => getCollectionSourceData(quoteData?.collection), [quoteData?.collection] @@ -80,27 +77,17 @@ const A = ({ children, ...props }: any) => { onOpen(); runAsync(String(children)); }} + trigger={'hover'} gutter={4} > @@ -118,19 +105,6 @@ const A = ({ children, ...props }: any) => { height={6} mr={1} > - - {index} - { onClick={() => { onClose(); eventBus.emit(EventNameEnum.openQuoteReader, { - // quoteId: String(children), + quoteId: String(children), sourceId: sourceData.sourceId, sourceName: sourceData.sourceName, datasetId: quoteData?.collection.datasetId, diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx index 930004adf..164d4b6f9 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx @@ -227,12 +227,14 @@ const ChatItem = (props: Props) => { collectionId, sourceId, sourceName, - datasetId + datasetId, + quoteId }: { collectionId?: string; sourceId?: string; sourceName?: string; datasetId?: string; + quoteId?: string; }) => { if (!setQuoteData) return; @@ -252,7 +254,8 @@ const ChatItem = (props: Props) => { sourceId: sourceId || '', sourceName: sourceName || '', datasetId: datasetId || '', - outLinkAuthData + outLinkAuthData, + quoteId } : { appId: appId, diff --git a/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/NodeTemplatesModal.tsx b/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/NodeTemplatesModal.tsx index 05ec1434c..d5821157d 100644 --- a/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/NodeTemplatesModal.tsx +++ b/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/NodeTemplatesModal.tsx @@ -72,6 +72,7 @@ type RenderHeaderProps = { onUpdateParentId: (parentId: ParentIdType) => void; }; type RenderListProps = { + templateType: TemplateTypeEnum; templates: NodeTemplateListItemType[]; type: TemplateTypeEnum; onClose: () => void; @@ -247,6 +248,7 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => { setSearchKey={setSearchKey} /> - {template.isFolder && ( + {template.isFolder && templateType === TemplateTypeEnum.teamPlugin && ( vo icon: 'core/app/simpleMode/variable' }, { - key: 'sourceIndex', - label: t('common:core.dataset.search.Source index'), + key: 'sourceId', + label: t('common:core.dataset.search.Source id'), icon: 'core/app/simpleMode/variable' }, { diff --git a/projects/app/src/pageComponents/chat/ChatQuoteList/CollectionQuoteReader.tsx b/projects/app/src/pageComponents/chat/ChatQuoteList/CollectionQuoteReader.tsx index b3002ee06..fccf14fb6 100644 --- a/projects/app/src/pageComponents/chat/ChatQuoteList/CollectionQuoteReader.tsx +++ b/projects/app/src/pageComponents/chat/ChatQuoteList/CollectionQuoteReader.tsx @@ -35,7 +35,7 @@ const CollectionReader = ({ const router = useRouter(); const { userInfo } = useUserStore(); - const { collectionId, datasetId, chatItemDataId, sourceId, sourceName } = metadata; + const { collectionId, datasetId, chatItemDataId, sourceId, sourceName, quoteId } = metadata; const [quoteIndex, setQuoteIndex] = useState(0); // Get dataset permission @@ -45,11 +45,19 @@ const CollectionReader = ({ }); const filterResults = useMemo(() => { - setQuoteIndex(0); - return rawSearch + const res = rawSearch .filter((item) => item.collectionId === collectionId) .sort((a, b) => (a.chunkIndex || 0) - (b.chunkIndex || 0)); - }, [collectionId, rawSearch]); + + if (quoteId) { + setQuoteIndex(res.findIndex((item) => item.id === quoteId)); + } else { + setQuoteIndex(0); + } + + return res; + }, [collectionId, quoteId, rawSearch]); + const currentQuoteItem = useMemo(() => { const item = filterResults[quoteIndex]; if (item) { diff --git a/projects/app/src/web/core/chat/context/chatItemContext.tsx b/projects/app/src/web/core/chat/context/chatItemContext.tsx index b924627c0..fba34f550 100644 --- a/projects/app/src/web/core/chat/context/chatItemContext.tsx +++ b/projects/app/src/web/core/chat/context/chatItemContext.tsx @@ -41,6 +41,7 @@ export type GetQuoteDataBasicProps = { }; // 获取单个集合引用 export type GetCollectionQuoteDataProps = GetQuoteDataBasicProps & { + quoteId?: string; collectionId: string; sourceId: string; sourceName: string;