mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 12:32:30 +08:00
Feat:setting metadata in the retrieval (#10682)
### What problem does this PR solve? issue: [#9272](https://github.com/infiniflow/ragflow/issues/9272) change: setting metadata in the retrieval ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@ -18,12 +18,14 @@ import re
|
|||||||
from abc import ABC
|
from abc import ABC
|
||||||
from agent.tools.base import ToolParamBase, ToolBase, ToolMeta
|
from agent.tools.base import ToolParamBase, ToolBase, ToolMeta
|
||||||
from api.db import LLMType
|
from api.db import LLMType
|
||||||
|
from api.db.services.document_service import DocumentService
|
||||||
|
from api.db.services.dialog_service import meta_filter
|
||||||
from api.db.services.knowledgebase_service import KnowledgebaseService
|
from api.db.services.knowledgebase_service import KnowledgebaseService
|
||||||
from api.db.services.llm_service import LLMBundle
|
from api.db.services.llm_service import LLMBundle
|
||||||
from api import settings
|
from api import settings
|
||||||
from api.utils.api_utils import timeout
|
from api.utils.api_utils import timeout
|
||||||
from rag.app.tag import label_question
|
from rag.app.tag import label_question
|
||||||
from rag.prompts.generator import cross_languages, kb_prompt
|
from rag.prompts.generator import cross_languages, kb_prompt, gen_meta_filter
|
||||||
|
|
||||||
|
|
||||||
class RetrievalParam(ToolParamBase):
|
class RetrievalParam(ToolParamBase):
|
||||||
@ -58,6 +60,7 @@ class RetrievalParam(ToolParamBase):
|
|||||||
self.use_kg = False
|
self.use_kg = False
|
||||||
self.cross_languages = []
|
self.cross_languages = []
|
||||||
self.toc_enhance = False
|
self.toc_enhance = False
|
||||||
|
self.meta_data_filter={}
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
self.check_decimal_float(self.similarity_threshold, "[Retrieval] Similarity threshold")
|
self.check_decimal_float(self.similarity_threshold, "[Retrieval] Similarity threshold")
|
||||||
@ -117,6 +120,21 @@ class Retrieval(ToolBase, ABC):
|
|||||||
vars = self.get_input_elements_from_text(kwargs["query"])
|
vars = self.get_input_elements_from_text(kwargs["query"])
|
||||||
vars = {k:o["value"] for k,o in vars.items()}
|
vars = {k:o["value"] for k,o in vars.items()}
|
||||||
query = self.string_format(kwargs["query"], vars)
|
query = self.string_format(kwargs["query"], vars)
|
||||||
|
|
||||||
|
doc_ids=[]
|
||||||
|
if self._param.meta_data_filter!={}:
|
||||||
|
metas = DocumentService.get_meta_by_kbs(kb_ids)
|
||||||
|
if self._param.meta_data_filter.get("method") == "auto":
|
||||||
|
chat_mdl = LLMBundle(self._canvas.get_tenant_id(), LLMType.CHAT)
|
||||||
|
filters = gen_meta_filter(chat_mdl, metas, query)
|
||||||
|
doc_ids.extend(meta_filter(metas, filters))
|
||||||
|
if not doc_ids:
|
||||||
|
doc_ids = None
|
||||||
|
elif self._param.meta_data_filter.get("method") == "manual":
|
||||||
|
doc_ids.extend(meta_filter(metas, self._param.meta_data_filter["manual"]))
|
||||||
|
if not doc_ids:
|
||||||
|
doc_ids = None
|
||||||
|
|
||||||
if self._param.cross_languages:
|
if self._param.cross_languages:
|
||||||
query = cross_languages(kbs[0].tenant_id, None, query, self._param.cross_languages)
|
query = cross_languages(kbs[0].tenant_id, None, query, self._param.cross_languages)
|
||||||
|
|
||||||
@ -131,6 +149,7 @@ class Retrieval(ToolBase, ABC):
|
|||||||
self._param.top_n,
|
self._param.top_n,
|
||||||
self._param.similarity_threshold,
|
self._param.similarity_threshold,
|
||||||
1 - self._param.keywords_similarity_weight,
|
1 - self._param.keywords_similarity_weight,
|
||||||
|
doc_ids=doc_ids,
|
||||||
aggs=False,
|
aggs=False,
|
||||||
rerank_mdl=rerank_mdl,
|
rerank_mdl=rerank_mdl,
|
||||||
rank_feature=label_question(query, kbs),
|
rank_feature=label_question(query, kbs),
|
||||||
|
|||||||
@ -2,6 +2,10 @@ import { Collapse } from '@/components/collapse';
|
|||||||
import { CrossLanguageFormField } from '@/components/cross-language-form-field';
|
import { CrossLanguageFormField } from '@/components/cross-language-form-field';
|
||||||
import { FormContainer } from '@/components/form-container';
|
import { FormContainer } from '@/components/form-container';
|
||||||
import { KnowledgeBaseFormField } from '@/components/knowledge-base-item';
|
import { KnowledgeBaseFormField } from '@/components/knowledge-base-item';
|
||||||
|
import {
|
||||||
|
MetadataFilter,
|
||||||
|
MetadataFilterSchema,
|
||||||
|
} from '@/components/metadata-filter';
|
||||||
import { RAGFlowFormItem } from '@/components/ragflow-form';
|
import { RAGFlowFormItem } from '@/components/ragflow-form';
|
||||||
import { RerankFormFields } from '@/components/rerank';
|
import { RerankFormFields } from '@/components/rerank';
|
||||||
import { SimilaritySliderFormField } from '@/components/similarity-slider';
|
import { SimilaritySliderFormField } from '@/components/similarity-slider';
|
||||||
@ -41,6 +45,7 @@ export const RetrievalPartialSchema = {
|
|||||||
cross_languages: z.array(z.string()),
|
cross_languages: z.array(z.string()),
|
||||||
use_kg: z.boolean(),
|
use_kg: z.boolean(),
|
||||||
toc_enhance: z.boolean(),
|
toc_enhance: z.boolean(),
|
||||||
|
...MetadataFilterSchema,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const FormSchema = z.object({
|
export const FormSchema = z.object({
|
||||||
@ -118,6 +123,7 @@ function RetrievalForm({ node }: INextOperatorForm) {
|
|||||||
></SimilaritySliderFormField>
|
></SimilaritySliderFormField>
|
||||||
<TopNFormField></TopNFormField>
|
<TopNFormField></TopNFormField>
|
||||||
<RerankFormFields></RerankFormFields>
|
<RerankFormFields></RerankFormFields>
|
||||||
|
<MetadataFilter></MetadataFilter>
|
||||||
<EmptyResponseField></EmptyResponseField>
|
<EmptyResponseField></EmptyResponseField>
|
||||||
<CrossLanguageFormField name="cross_languages"></CrossLanguageFormField>
|
<CrossLanguageFormField name="cross_languages"></CrossLanguageFormField>
|
||||||
<UseKnowledgeGraphFormField name="use_kg"></UseKnowledgeGraphFormField>
|
<UseKnowledgeGraphFormField name="use_kg"></UseKnowledgeGraphFormField>
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { Collapse } from '@/components/collapse';
|
|||||||
import { CrossLanguageFormField } from '@/components/cross-language-form-field';
|
import { CrossLanguageFormField } from '@/components/cross-language-form-field';
|
||||||
import { FormContainer } from '@/components/form-container';
|
import { FormContainer } from '@/components/form-container';
|
||||||
import { KnowledgeBaseFormField } from '@/components/knowledge-base-item';
|
import { KnowledgeBaseFormField } from '@/components/knowledge-base-item';
|
||||||
|
import { MetadataFilter } from '@/components/metadata-filter';
|
||||||
import { RerankFormFields } from '@/components/rerank';
|
import { RerankFormFields } from '@/components/rerank';
|
||||||
import { SimilaritySliderFormField } from '@/components/similarity-slider';
|
import { SimilaritySliderFormField } from '@/components/similarity-slider';
|
||||||
import { TOCEnhanceFormField } from '@/components/toc-enhance-form-field';
|
import { TOCEnhanceFormField } from '@/components/toc-enhance-form-field';
|
||||||
@ -51,6 +52,7 @@ const RetrievalForm = () => {
|
|||||||
></SimilaritySliderFormField>
|
></SimilaritySliderFormField>
|
||||||
<TopNFormField></TopNFormField>
|
<TopNFormField></TopNFormField>
|
||||||
<RerankFormFields></RerankFormFields>
|
<RerankFormFields></RerankFormFields>
|
||||||
|
<MetadataFilter></MetadataFilter>
|
||||||
<EmptyResponseField></EmptyResponseField>
|
<EmptyResponseField></EmptyResponseField>
|
||||||
<CrossLanguageFormField name="cross_languages"></CrossLanguageFormField>
|
<CrossLanguageFormField name="cross_languages"></CrossLanguageFormField>
|
||||||
<UseKnowledgeGraphFormField name="use_kg"></UseKnowledgeGraphFormField>
|
<UseKnowledgeGraphFormField name="use_kg"></UseKnowledgeGraphFormField>
|
||||||
|
|||||||
Reference in New Issue
Block a user