balibabu
commited on
Commit
·
c39b5d3
1
Parent(s):
74e840b
feat: Retrieval chunks by page #2247 (#2373)
Browse files### What problem does this PR solve?
feat: Retrieval chunks by page #2247
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
web/src/components/retrieval-documents/index.tsx
CHANGED
|
@@ -3,19 +3,22 @@ import { Collapse, Flex, Space } from 'antd';
|
|
| 3 |
import SelectFiles from './select-files';
|
| 4 |
|
| 5 |
import { useSelectTestingResult } from '@/hooks/knowledge-hooks';
|
| 6 |
-
import { useState } from 'react';
|
| 7 |
import { useTranslation } from 'react-i18next';
|
| 8 |
import styles from './index.less';
|
| 9 |
|
| 10 |
interface IProps {
|
| 11 |
-
selectedDocumentIdsLength?: number;
|
| 12 |
onTesting(documentIds: string[]): void;
|
|
|
|
|
|
|
| 13 |
}
|
| 14 |
|
| 15 |
-
const RetrievalDocuments = ({
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
const { t } = useTranslation();
|
| 17 |
const { documents } = useSelectTestingResult();
|
| 18 |
-
const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]);
|
| 19 |
|
| 20 |
return (
|
| 21 |
<Collapse
|
|
|
|
| 3 |
import SelectFiles from './select-files';
|
| 4 |
|
| 5 |
import { useSelectTestingResult } from '@/hooks/knowledge-hooks';
|
|
|
|
| 6 |
import { useTranslation } from 'react-i18next';
|
| 7 |
import styles from './index.less';
|
| 8 |
|
| 9 |
interface IProps {
|
|
|
|
| 10 |
onTesting(documentIds: string[]): void;
|
| 11 |
+
setSelectedDocumentIds(documentIds: string[]): void;
|
| 12 |
+
selectedDocumentIds: string[];
|
| 13 |
}
|
| 14 |
|
| 15 |
+
const RetrievalDocuments = ({
|
| 16 |
+
onTesting,
|
| 17 |
+
selectedDocumentIds,
|
| 18 |
+
setSelectedDocumentIds,
|
| 19 |
+
}: IProps) => {
|
| 20 |
const { t } = useTranslation();
|
| 21 |
const { documents } = useSelectTestingResult();
|
|
|
|
| 22 |
|
| 23 |
return (
|
| 24 |
<Collapse
|
web/src/layouts/components/header/index.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import { ReactComponent as KnowledgeBaseIcon } from '@/assets/svg/knowledge-base
|
|
| 4 |
import { useTranslate } from '@/hooks/common-hooks';
|
| 5 |
import { useFetchAppConf } from '@/hooks/logic-hooks';
|
| 6 |
import { useNavigateWithFromState } from '@/hooks/route-hook';
|
| 7 |
-
import { MessageOutlined } from '@ant-design/icons';
|
| 8 |
import { Flex, Layout, Radio, Space, theme } from 'antd';
|
| 9 |
import { useCallback, useMemo } from 'react';
|
| 10 |
import { useLocation } from 'umi';
|
|
@@ -27,7 +27,7 @@ const RagHeader = () => {
|
|
| 27 |
() => [
|
| 28 |
{ path: '/knowledge', name: t('knowledgeBase'), icon: KnowledgeBaseIcon },
|
| 29 |
{ path: '/chat', name: t('chat'), icon: MessageOutlined },
|
| 30 |
-
|
| 31 |
{ path: '/flow', name: t('flow'), icon: GraphIcon },
|
| 32 |
{ path: '/file', name: t('fileManager'), icon: FileIcon },
|
| 33 |
],
|
|
|
|
| 4 |
import { useTranslate } from '@/hooks/common-hooks';
|
| 5 |
import { useFetchAppConf } from '@/hooks/logic-hooks';
|
| 6 |
import { useNavigateWithFromState } from '@/hooks/route-hook';
|
| 7 |
+
import { MessageOutlined, SearchOutlined } from '@ant-design/icons';
|
| 8 |
import { Flex, Layout, Radio, Space, theme } from 'antd';
|
| 9 |
import { useCallback, useMemo } from 'react';
|
| 10 |
import { useLocation } from 'umi';
|
|
|
|
| 27 |
() => [
|
| 28 |
{ path: '/knowledge', name: t('knowledgeBase'), icon: KnowledgeBaseIcon },
|
| 29 |
{ path: '/chat', name: t('chat'), icon: MessageOutlined },
|
| 30 |
+
{ path: '/search', name: t('search'), icon: SearchOutlined },
|
| 31 |
{ path: '/flow', name: t('flow'), icon: GraphIcon },
|
| 32 |
{ path: '/file', name: t('fileManager'), icon: FileIcon },
|
| 33 |
],
|
web/src/pages/search/hooks.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
| 1 |
import { useFetchMindMap, useFetchRelatedQuestions } from '@/hooks/chat-hooks';
|
| 2 |
import { useTestChunkRetrieval } from '@/hooks/knowledge-hooks';
|
| 3 |
-
import {
|
|
|
|
|
|
|
|
|
|
| 4 |
import { IAnswer } from '@/interfaces/database/chat';
|
| 5 |
import api from '@/utils/api';
|
| 6 |
import { get, isEmpty, trim } from 'lodash';
|
|
@@ -20,6 +23,9 @@ export const useSendQuestion = (kbIds: string[]) => {
|
|
| 20 |
} = useFetchMindMap();
|
| 21 |
const [searchStr, setSearchStr] = useState<string>('');
|
| 22 |
const [isFirstRender, setIsFirstRender] = useState(true);
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
const sendQuestion = useCallback(
|
| 25 |
(question: string) => {
|
|
@@ -55,7 +61,7 @@ export const useSendQuestion = (kbIds: string[]) => {
|
|
| 55 |
);
|
| 56 |
|
| 57 |
const handleTestChunk = useCallback(
|
| 58 |
-
(documentIds: string[]) => {
|
| 59 |
const q = trim(searchStr);
|
| 60 |
if (sendingLoading || isEmpty(q)) return;
|
| 61 |
|
|
@@ -63,10 +69,12 @@ export const useSendQuestion = (kbIds: string[]) => {
|
|
| 63 |
kb_id: kbIds,
|
| 64 |
highlight: true,
|
| 65 |
question: q,
|
| 66 |
-
doc_ids:
|
|
|
|
|
|
|
| 67 |
});
|
| 68 |
},
|
| 69 |
-
[sendingLoading, searchStr, kbIds, testChunk],
|
| 70 |
);
|
| 71 |
|
| 72 |
useEffect(() => {
|
|
@@ -89,6 +97,7 @@ export const useSendQuestion = (kbIds: string[]) => {
|
|
| 89 |
handleSearchStrChange,
|
| 90 |
handleClickRelatedQuestion,
|
| 91 |
handleTestChunk,
|
|
|
|
| 92 |
loading,
|
| 93 |
sendingLoading,
|
| 94 |
answer: currentAnswer,
|
|
@@ -97,6 +106,7 @@ export const useSendQuestion = (kbIds: string[]) => {
|
|
| 97 |
mindMapLoading,
|
| 98 |
searchStr,
|
| 99 |
isFirstRender,
|
|
|
|
| 100 |
};
|
| 101 |
};
|
| 102 |
|
|
@@ -124,3 +134,45 @@ export const useFetchBackgroundImage = () => {
|
|
| 124 |
|
| 125 |
return `https://cn.bing.com${imgUrl}`;
|
| 126 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import { useFetchMindMap, useFetchRelatedQuestions } from '@/hooks/chat-hooks';
|
| 2 |
import { useTestChunkRetrieval } from '@/hooks/knowledge-hooks';
|
| 3 |
+
import {
|
| 4 |
+
useGetPaginationWithRouter,
|
| 5 |
+
useSendMessageWithSse,
|
| 6 |
+
} from '@/hooks/logic-hooks';
|
| 7 |
import { IAnswer } from '@/interfaces/database/chat';
|
| 8 |
import api from '@/utils/api';
|
| 9 |
import { get, isEmpty, trim } from 'lodash';
|
|
|
|
| 23 |
} = useFetchMindMap();
|
| 24 |
const [searchStr, setSearchStr] = useState<string>('');
|
| 25 |
const [isFirstRender, setIsFirstRender] = useState(true);
|
| 26 |
+
const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]);
|
| 27 |
+
|
| 28 |
+
const { pagination } = useGetPaginationWithRouter();
|
| 29 |
|
| 30 |
const sendQuestion = useCallback(
|
| 31 |
(question: string) => {
|
|
|
|
| 61 |
);
|
| 62 |
|
| 63 |
const handleTestChunk = useCallback(
|
| 64 |
+
(documentIds: string[], page: number = 1, size: number = 10) => {
|
| 65 |
const q = trim(searchStr);
|
| 66 |
if (sendingLoading || isEmpty(q)) return;
|
| 67 |
|
|
|
|
| 69 |
kb_id: kbIds,
|
| 70 |
highlight: true,
|
| 71 |
question: q,
|
| 72 |
+
doc_ids: documentIds ?? selectedDocumentIds,
|
| 73 |
+
page,
|
| 74 |
+
size,
|
| 75 |
});
|
| 76 |
},
|
| 77 |
+
[sendingLoading, searchStr, kbIds, testChunk, selectedDocumentIds],
|
| 78 |
);
|
| 79 |
|
| 80 |
useEffect(() => {
|
|
|
|
| 97 |
handleSearchStrChange,
|
| 98 |
handleClickRelatedQuestion,
|
| 99 |
handleTestChunk,
|
| 100 |
+
setSelectedDocumentIds,
|
| 101 |
loading,
|
| 102 |
sendingLoading,
|
| 103 |
answer: currentAnswer,
|
|
|
|
| 106 |
mindMapLoading,
|
| 107 |
searchStr,
|
| 108 |
isFirstRender,
|
| 109 |
+
selectedDocumentIds,
|
| 110 |
};
|
| 111 |
};
|
| 112 |
|
|
|
|
| 134 |
|
| 135 |
return `https://cn.bing.com${imgUrl}`;
|
| 136 |
};
|
| 137 |
+
|
| 138 |
+
export const useTestRetrieval = (
|
| 139 |
+
kbIds: string[],
|
| 140 |
+
searchStr: string,
|
| 141 |
+
sendingLoading: boolean,
|
| 142 |
+
) => {
|
| 143 |
+
const { testChunk, loading } = useTestChunkRetrieval();
|
| 144 |
+
const { pagination } = useGetPaginationWithRouter();
|
| 145 |
+
|
| 146 |
+
const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]);
|
| 147 |
+
|
| 148 |
+
const handleTestChunk = useCallback(() => {
|
| 149 |
+
const q = trim(searchStr);
|
| 150 |
+
if (sendingLoading || isEmpty(q)) return;
|
| 151 |
+
|
| 152 |
+
testChunk({
|
| 153 |
+
kb_id: kbIds,
|
| 154 |
+
highlight: true,
|
| 155 |
+
question: q,
|
| 156 |
+
doc_ids: Array.isArray(selectedDocumentIds) ? selectedDocumentIds : [],
|
| 157 |
+
page: pagination.current,
|
| 158 |
+
size: pagination.pageSize,
|
| 159 |
+
});
|
| 160 |
+
}, [
|
| 161 |
+
sendingLoading,
|
| 162 |
+
searchStr,
|
| 163 |
+
kbIds,
|
| 164 |
+
testChunk,
|
| 165 |
+
selectedDocumentIds,
|
| 166 |
+
pagination,
|
| 167 |
+
]);
|
| 168 |
+
|
| 169 |
+
useEffect(() => {
|
| 170 |
+
handleTestChunk();
|
| 171 |
+
}, [handleTestChunk]);
|
| 172 |
+
|
| 173 |
+
return {
|
| 174 |
+
loading,
|
| 175 |
+
selectedDocumentIds,
|
| 176 |
+
setSelectedDocumentIds,
|
| 177 |
+
};
|
| 178 |
+
};
|
web/src/pages/search/index.less
CHANGED
|
@@ -62,6 +62,10 @@
|
|
| 62 |
// background-color: aqua;
|
| 63 |
overflow: auto;
|
| 64 |
padding: 20px 10px 10px;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
}
|
| 66 |
|
| 67 |
.graph {
|
|
@@ -100,6 +104,9 @@
|
|
| 100 |
|
| 101 |
.globalInput {
|
| 102 |
width: 600px;
|
|
|
|
|
|
|
|
|
|
| 103 |
.input();
|
| 104 |
}
|
| 105 |
.partialInput {
|
|
|
|
| 62 |
// background-color: aqua;
|
| 63 |
overflow: auto;
|
| 64 |
padding: 20px 10px 10px;
|
| 65 |
+
.chunks {
|
| 66 |
+
// overflow: auto;
|
| 67 |
+
// height: 60vh;
|
| 68 |
+
}
|
| 69 |
}
|
| 70 |
|
| 71 |
.graph {
|
|
|
|
| 104 |
|
| 105 |
.globalInput {
|
| 106 |
width: 600px;
|
| 107 |
+
position: sticky;
|
| 108 |
+
top: 0;
|
| 109 |
+
z-index: 1;
|
| 110 |
.input();
|
| 111 |
}
|
| 112 |
.partialInput {
|
web/src/pages/search/index.tsx
CHANGED
|
@@ -1,7 +1,11 @@
|
|
| 1 |
import HightLightMarkdown from '@/components/highlight-markdown';
|
| 2 |
import { ImageWithPopover } from '@/components/image';
|
| 3 |
import IndentedTree from '@/components/indented-tree/indented-tree';
|
|
|
|
|
|
|
|
|
|
| 4 |
import { useSelectTestingResult } from '@/hooks/knowledge-hooks';
|
|
|
|
| 5 |
import { IReference } from '@/interfaces/database/chat';
|
| 6 |
import {
|
| 7 |
Card,
|
|
@@ -10,19 +14,18 @@ import {
|
|
| 10 |
Input,
|
| 11 |
Layout,
|
| 12 |
List,
|
|
|
|
|
|
|
| 13 |
Skeleton,
|
| 14 |
Space,
|
| 15 |
Tag,
|
| 16 |
} from 'antd';
|
| 17 |
import { useState } from 'react';
|
|
|
|
| 18 |
import MarkdownContent from '../chat/markdown-content';
|
| 19 |
import { useFetchBackgroundImage, useSendQuestion } from './hooks';
|
| 20 |
import SearchSidebar from './sidebar';
|
| 21 |
|
| 22 |
-
import PdfDrawer from '@/components/pdf-drawer';
|
| 23 |
-
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
|
| 24 |
-
import RetrievalDocuments from '@/components/retrieval-documents';
|
| 25 |
-
import { useTranslation } from 'react-i18next';
|
| 26 |
import styles from './index.less';
|
| 27 |
|
| 28 |
const { Content } = Layout;
|
|
@@ -31,13 +34,14 @@ const { Search } = Input;
|
|
| 31 |
const SearchPage = () => {
|
| 32 |
const { t } = useTranslation();
|
| 33 |
const [checkedList, setCheckedList] = useState<string[]>([]);
|
| 34 |
-
const
|
| 35 |
// const appConf = useFetchAppConf();
|
| 36 |
const {
|
| 37 |
sendQuestion,
|
| 38 |
handleClickRelatedQuestion,
|
| 39 |
handleSearchStrChange,
|
| 40 |
handleTestChunk,
|
|
|
|
| 41 |
answer,
|
| 42 |
sendingLoading,
|
| 43 |
relatedQuestions,
|
|
@@ -46,10 +50,17 @@ const SearchPage = () => {
|
|
| 46 |
searchStr,
|
| 47 |
loading,
|
| 48 |
isFirstRender,
|
|
|
|
| 49 |
} = useSendQuestion(checkedList);
|
| 50 |
const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
|
| 51 |
useClickDrawer();
|
| 52 |
const imgUrl = useFetchBackgroundImage();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
const InputSearch = (
|
| 55 |
<Search
|
|
@@ -106,14 +117,16 @@ const SearchPage = () => {
|
|
| 106 |
)}
|
| 107 |
<Divider></Divider>
|
| 108 |
<RetrievalDocuments
|
| 109 |
-
|
|
|
|
| 110 |
onTesting={handleTestChunk}
|
| 111 |
></RetrievalDocuments>
|
| 112 |
<Divider></Divider>
|
| 113 |
-
{
|
| 114 |
<List
|
| 115 |
-
dataSource={
|
| 116 |
loading={loading}
|
|
|
|
| 117 |
renderItem={(item) => (
|
| 118 |
<List.Item>
|
| 119 |
<Card className={styles.card}>
|
|
@@ -145,6 +158,12 @@ const SearchPage = () => {
|
|
| 145 |
</Flex>
|
| 146 |
</Card>
|
| 147 |
)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
</section>
|
| 149 |
<section className={styles.graph}>
|
| 150 |
{mindMapLoading ? (
|
|
|
|
| 1 |
import HightLightMarkdown from '@/components/highlight-markdown';
|
| 2 |
import { ImageWithPopover } from '@/components/image';
|
| 3 |
import IndentedTree from '@/components/indented-tree/indented-tree';
|
| 4 |
+
import PdfDrawer from '@/components/pdf-drawer';
|
| 5 |
+
import { useClickDrawer } from '@/components/pdf-drawer/hooks';
|
| 6 |
+
import RetrievalDocuments from '@/components/retrieval-documents';
|
| 7 |
import { useSelectTestingResult } from '@/hooks/knowledge-hooks';
|
| 8 |
+
import { useGetPaginationWithRouter } from '@/hooks/logic-hooks';
|
| 9 |
import { IReference } from '@/interfaces/database/chat';
|
| 10 |
import {
|
| 11 |
Card,
|
|
|
|
| 14 |
Input,
|
| 15 |
Layout,
|
| 16 |
List,
|
| 17 |
+
Pagination,
|
| 18 |
+
PaginationProps,
|
| 19 |
Skeleton,
|
| 20 |
Space,
|
| 21 |
Tag,
|
| 22 |
} from 'antd';
|
| 23 |
import { useState } from 'react';
|
| 24 |
+
import { useTranslation } from 'react-i18next';
|
| 25 |
import MarkdownContent from '../chat/markdown-content';
|
| 26 |
import { useFetchBackgroundImage, useSendQuestion } from './hooks';
|
| 27 |
import SearchSidebar from './sidebar';
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
import styles from './index.less';
|
| 30 |
|
| 31 |
const { Content } = Layout;
|
|
|
|
| 34 |
const SearchPage = () => {
|
| 35 |
const { t } = useTranslation();
|
| 36 |
const [checkedList, setCheckedList] = useState<string[]>([]);
|
| 37 |
+
const { chunks, total } = useSelectTestingResult();
|
| 38 |
// const appConf = useFetchAppConf();
|
| 39 |
const {
|
| 40 |
sendQuestion,
|
| 41 |
handleClickRelatedQuestion,
|
| 42 |
handleSearchStrChange,
|
| 43 |
handleTestChunk,
|
| 44 |
+
setSelectedDocumentIds,
|
| 45 |
answer,
|
| 46 |
sendingLoading,
|
| 47 |
relatedQuestions,
|
|
|
|
| 50 |
searchStr,
|
| 51 |
loading,
|
| 52 |
isFirstRender,
|
| 53 |
+
selectedDocumentIds,
|
| 54 |
} = useSendQuestion(checkedList);
|
| 55 |
const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
|
| 56 |
useClickDrawer();
|
| 57 |
const imgUrl = useFetchBackgroundImage();
|
| 58 |
+
const { pagination } = useGetPaginationWithRouter();
|
| 59 |
+
|
| 60 |
+
const onChange: PaginationProps['onChange'] = (pageNumber, pageSize) => {
|
| 61 |
+
pagination.onChange?.(pageNumber, pageSize);
|
| 62 |
+
handleTestChunk(selectedDocumentIds, pageNumber, pageSize);
|
| 63 |
+
};
|
| 64 |
|
| 65 |
const InputSearch = (
|
| 66 |
<Search
|
|
|
|
| 117 |
)}
|
| 118 |
<Divider></Divider>
|
| 119 |
<RetrievalDocuments
|
| 120 |
+
selectedDocumentIds={selectedDocumentIds}
|
| 121 |
+
setSelectedDocumentIds={setSelectedDocumentIds}
|
| 122 |
onTesting={handleTestChunk}
|
| 123 |
></RetrievalDocuments>
|
| 124 |
<Divider></Divider>
|
| 125 |
+
{chunks.length > 0 && (
|
| 126 |
<List
|
| 127 |
+
dataSource={chunks}
|
| 128 |
loading={loading}
|
| 129 |
+
className={styles.chunks}
|
| 130 |
renderItem={(item) => (
|
| 131 |
<List.Item>
|
| 132 |
<Card className={styles.card}>
|
|
|
|
| 158 |
</Flex>
|
| 159 |
</Card>
|
| 160 |
)}
|
| 161 |
+
<Divider></Divider>
|
| 162 |
+
<Pagination
|
| 163 |
+
{...pagination}
|
| 164 |
+
total={total}
|
| 165 |
+
onChange={onChange}
|
| 166 |
+
/>
|
| 167 |
</section>
|
| 168 |
<section className={styles.graph}>
|
| 169 |
{mindMapLoading ? (
|