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;