diff --git a/api/db/services/document_service.py b/api/db/services/document_service.py
index 7b7ef53ec..7df4a4873 100644
--- a/api/db/services/document_service.py
+++ b/api/db/services/document_service.py
@@ -627,9 +627,9 @@ class DocumentService(CommonService):
def begin2parse(cls, doc_id, keep_progress=False):
info = {
"progress_msg": "Task is queued...",
- "process_begin_at": get_format_time(),
}
if not keep_progress:
+ info["process_begin_at"] = get_format_time()
info["progress"] = random.random() * 1 / 100.
info["run"] = TaskStatus.RUNNING.value
# keep the doc in DONE state when keep_progress=True for GraphRAG, RAPTOR and Mindmap tasks
@@ -720,10 +720,12 @@ class DocumentService(CommonService):
freeze_progress = special_task_running and doc_progress >= 1 and not finished
msg = "\n".join(sorted(msg))
info = {
- "process_duration": datetime.timestamp(
- datetime.now()) -
- d["process_begin_at"].timestamp(),
- "run": status}
+ "run": status
+ }
+ if not freeze_progress and 0 < doc_progress < 1:
+ info["process_duration"] = (
+ datetime.timestamp(datetime.now()) - d["process_begin_at"].timestamp()
+ )
if prg != 0 and not freeze_progress:
info["progress"] = prg
if msg:
diff --git a/pyproject.toml b/pyproject.toml
index 8e2efb0ac..4aef01fd2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -151,6 +151,7 @@ dependencies = [
"pip>=25.2",
"moodlepy>=0.23.0",
"pypandoc>=1.16",
+ "croniter>=2.0.1,<3.0.0",
"pyobvector==0.2.18",
"exceptiongroup>=1.3.0,<2.0.0",
"ffmpeg-python>=0.2.0",
diff --git a/pyproject.toml.orig b/pyproject.toml.orig
new file mode 100644
index 000000000..026ed4c71
--- /dev/null
+++ b/pyproject.toml.orig
@@ -0,0 +1,201 @@
+[project]
+name = "ragflow"
+version = "0.22.1"
+description = "[RAGFlow](https://ragflow.io/) is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding. It offers a streamlined RAG workflow for businesses of any scale, combining LLM (Large Language Models) to provide truthful question-answering capabilities, backed by well-founded citations from various complex formatted data."
+authors = [{ name = "Zhichang Yu", email = "yuzhichang@gmail.com" }]
+license-files = ["LICENSE"]
+readme = "README.md"
+requires-python = ">=3.10,<3.13"
+dependencies = [
+ "datrie>=0.8.3,<0.9.0",
+ "akshare>=1.15.78,<2.0.0",
+ "azure-storage-blob==12.22.0",
+ "azure-identity==1.17.1",
+ "azure-storage-file-datalake==12.16.0",
+ "anthropic==0.34.1",
+ "arxiv==2.1.3",
+ "aspose-slides>=25.10.0,<26.0.0; platform_machine == 'x86_64' or (sys_platform == 'darwin' and platform_machine == 'arm64')",
+ "atlassian-python-api==4.0.7",
+ "beartype>=0.18.5,<0.19.0",
+ "bio==1.7.1",
+ "blinker==1.7.0",
+ "boto3==1.34.140",
+ "botocore==1.34.140",
+ "cachetools==5.3.3",
+ "chardet==5.2.0",
+ "cn2an==0.5.22",
+ "cohere==5.6.2",
+ "Crawl4AI>=0.3.8",
+ "dashscope==1.20.11",
+ "deepl==1.18.0",
+ "demjson3==3.0.6",
+ "discord-py==2.3.2",
+ "dropbox==12.0.2",
+ "duckduckgo-search>=7.2.0,<8.0.0",
+ "editdistance==0.8.1",
+ "elastic-transport==8.12.0",
+ "elasticsearch==8.12.1",
+ "elasticsearch-dsl==8.12.0",
+ "extract-msg>=0.39.0",
+ "filelock==3.15.4",
+ "flask==3.0.3",
+ "flask-cors==5.0.0",
+ "flask-login==0.6.3",
+ "flask-session==0.8.0",
+ "google-search-results==2.4.2",
+ "google-auth-oauthlib>=1.2.0,<2.0.0",
+ "groq==0.9.0",
+ "hanziconv==0.3.2",
+ "html-text==0.6.2",
+ "httpx[socks]>=0.28.1,<0.29.0",
+ "huggingface-hub>=0.25.0,<0.26.0",
+ "infinity-sdk==0.6.5",
+ "infinity-emb>=0.0.66,<0.0.67",
+ "itsdangerous==2.1.2",
+ "json-repair==0.35.0",
+ "jira==3.10.5",
+ "markdown==3.6",
+ "markdown-to-json==2.1.1",
+ "minio==7.2.4",
+ "mistralai==0.4.2",
+ "mypy-boto3-s3==1.40.26",
+ "nltk==3.9.1",
+ "numpy>=1.26.0,<2.0.0",
+ "Office365-REST-Python-Client==2.6.2",
+ "ollama>=0.5.0",
+ "onnxruntime==1.19.2; sys_platform == 'darwin' or platform_machine != 'x86_64'",
+ "onnxruntime-gpu==1.19.2; sys_platform != 'darwin' and platform_machine == 'x86_64'",
+ "openai>=1.45.0",
+ "opencv-python==4.10.0.84",
+ "opencv-python-headless==4.10.0.84",
+ "openpyxl>=3.1.0,<4.0.0",
+ "opendal>=0.45.0,<0.46.0",
+ "ormsgpack==1.5.0",
+ "pandas>=2.2.0,<3.0.0",
+ "pdfplumber==0.10.4",
+ "peewee==3.17.1",
+ "pillow==10.4.0",
+ "protobuf==5.27.2",
+ "psycopg2-binary==2.9.9",
+ "pyclipper==1.3.0.post5",
+ "pycryptodomex==3.20.0",
+ "pymysql>=1.1.1,<2.0.0",
+ "pypdf==6.0.0",
+ "python-dotenv==1.0.1",
+ "python-dateutil==2.8.2",
+ "python-pptx>=1.0.2,<2.0.0",
+ "pywencai==0.12.2",
+ "qianfan==0.4.6",
+ "quart-auth==0.11.0",
+ "quart-cors==0.8.0",
+ "Quart==0.20.0",
+ "ranx==0.3.20",
+ "readability-lxml==0.8.1",
+ "valkey==6.0.2",
+ "requests==2.32.2",
+ "replicate==0.31.0",
+ "roman-numbers==1.0.2",
+ "ruamel-base==1.0.0",
+ "ruamel-yaml>=0.18.6,<0.19.0",
+ "scholarly==1.7.11",
+ "scikit-learn==1.5.0",
+ "selenium==4.22.0",
+ "selenium-wire==5.1.0",
+ "setuptools>=75.2.0,<76.0.0",
+ "shapely==2.0.5",
+ "six==1.16.0",
+ "slack-sdk==3.37.0",
+ "strenum==0.4.15",
+ "tabulate==0.9.0",
+ "tavily-python==0.5.1",
+ "tencentcloud-sdk-python==3.0.1478",
+ "tika==2.6.0",
+ "tiktoken==0.7.0",
+ "umap_learn==0.5.6",
+ "vertexai==1.70.0",
+ "google-genai>=1.41.0,<2.0.0",
+ "volcengine==1.0.194",
+ "voyageai==0.2.3",
+ "webdriver-manager==4.0.1",
+ "werkzeug==3.0.6",
+ "wikipedia==1.4.0",
+ "word2number==1.1",
+ "xgboost==1.6.0",
+ "xpinyin==0.7.6",
+ "yfinance==0.2.65",
+ "zhipuai==2.0.1",
+ "google-generativeai>=0.8.1,<0.9.0", # Needed for cv_model and embedding_model
+ "python-docx>=1.1.2,<2.0.0",
+ "pypdf2>=3.0.1,<4.0.0",
+ "graspologic>=3.4.1,<4.0.0",
+ "mini-racer>=0.12.4,<0.13.0",
+ "pyodbc>=5.2.0,<6.0.0",
+ "pyicu>=2.15.3,<3.0.0",
+ "flasgger>=0.9.7.1,<0.10.0",
+ "xxhash>=3.5.0,<4.0.0",
+ "trio>=0.29.0",
+ "langfuse>=2.60.0",
+ "debugpy>=1.8.13",
+ "mcp>=1.9.4",
+ "opensearch-py==2.7.1",
+ "pluginlib==0.9.4",
+ "click>=8.1.8",
+ "python-calamine>=0.4.0",
+ "litellm>=1.74.15.post1",
+ "flask-mail>=0.10.0",
+ "lark>=1.2.2",
+ "mammoth>=1.11.0",
+ "markdownify>=1.2.0",
+ "captcha>=0.7.1",
+ "pip>=25.2",
+ "pypandoc>=1.16",
+<<<<<<< HEAD
+ "croniter>=2.0.1,<3.0.0",
+=======
+ "pyobvector==0.2.18",
+>>>>>>> main
+]
+
+[dependency-groups]
+test = [
+ "hypothesis>=6.132.0",
+ "openpyxl>=3.1.5",
+ "pillow>=10.4.0",
+ "pytest>=8.3.5",
+ "python-docx>=1.1.2",
+ "python-pptx>=1.0.2",
+ "reportlab>=4.4.1",
+ "requests>=2.32.2",
+ "requests-toolbelt>=1.0.0",
+]
+
+[[tool.uv.index]]
+url = "https://pypi.tuna.tsinghua.edu.cn/simple"
+
+[tool.setuptools]
+packages = [
+ 'agent',
+ 'agentic_reasoning',
+ 'api',
+ 'deepdoc',
+ 'graphrag',
+ 'intergrations.chatgpt-on-wechat.plugins',
+ 'mcp.server',
+ 'rag',
+ 'sdk.python.ragflow_sdk',
+]
+
+[tool.ruff]
+line-length = 200
+exclude = [".venv", "rag/svr/discord_svr.py"]
+
+[tool.ruff.lint]
+extend-select = ["ASYNC", "ASYNC1"]
+ignore = ["E402"]
+
+[tool.pytest.ini_options]
+markers = [
+ "p1: high priority test cases",
+ "p2: medium priority test cases",
+ "p3: low priority test cases",
+]
diff --git a/rag/svr/task_executor.py b/rag/svr/task_executor.py
index 714b886eb..11b8e23ae 100644
--- a/rag/svr/task_executor.py
+++ b/rag/svr/task_executor.py
@@ -51,7 +51,7 @@ import faulthandler
import numpy as np
from peewee import DoesNotExist
from common.constants import LLMType, ParserType, PipelineTaskType
-from api.db.services.document_service import DocumentService
+from api.db.services.document_service import DocumentService, queue_raptor_o_graphrag_tasks
from api.db.services.llm_service import LLMBundle
from api.db.services.task_service import TaskService, has_canceled, CANVAS_DEBUG_DOC_ID, GRAPH_RAPTOR_FAKE_DOC_ID
from api.db.services.file2document_service import File2DocumentService
@@ -68,6 +68,7 @@ from common.signal_utils import start_tracemalloc_and_snapshot, stop_tracemalloc
from common.exceptions import TaskCanceledException
from common import settings
from common.constants import PAGERANK_FLD, TAG_FLD, SVR_CONSUMER_GROUP_NAME
+from croniter import croniter
BATCH_SIZE = 64
@@ -638,6 +639,8 @@ async def run_dataflow(task: dict):
logging.info("[Done], chunks({}), token({}), elapsed:{:.2f}".format(len(chunks), embedding_token_consumption, task_time_cost))
PipelineOperationLogService.create(document_id=doc_id, pipeline_id=dataflow_id, task_type=PipelineTaskType.PARSE, dsl=str(pipeline))
+ trigger_update_after(task_dataset_id, doc_id)
+
@timeout(3600)
async def run_raptor_for_kb(row, kb_parser_config, chat_mdl, embd_mdl, vector_size, callback=None, doc_ids=[]):
@@ -772,6 +775,27 @@ async def insert_es(task_id, task_tenant_id, task_dataset_id, chunks, progress_c
return True
+def trigger_update_after(kb_id: str, doc_id: str):
+ try:
+ ok, kb = KnowledgebaseService.get_by_id(kb_id)
+ if not ok:
+ return
+ conf = kb.parser_config or {}
+ gconf = conf.get("graphrag") or {}
+ rconf = conf.get("raptor") or {}
+ if gconf.get("use_graphrag") and gconf.get("strategy") == "update_after":
+ docs, _ = DocumentService.get_by_kb_id(kb_id=kb.id, page_number=0, items_per_page=0, orderby="create_time", desc=False, keywords="", run_status=[], types=[], suffix=[])
+ sample_document = docs[0] if docs else {"id": doc_id}
+ tid = queue_raptor_o_graphrag_tasks(sample_doc_id=sample_document, ty="graphrag", priority=0, fake_doc_id=GRAPH_RAPTOR_FAKE_DOC_ID, doc_ids=[doc_id])
+ KnowledgebaseService.update_by_id(kb.id, {"graphrag_task_id": tid})
+ if rconf.get("use_raptor") and rconf.get("strategy") == "update_after":
+ docs, _ = DocumentService.get_by_kb_id(kb_id=kb.id, page_number=0, items_per_page=0, orderby="create_time", desc=False, keywords="", run_status=[], types=[], suffix=[])
+ sample_document = docs[0] if docs else {"id": doc_id}
+ tid = queue_raptor_o_graphrag_tasks(sample_doc_id=sample_document, ty="raptor", priority=0, fake_doc_id=GRAPH_RAPTOR_FAKE_DOC_ID, doc_ids=[doc_id])
+ KnowledgebaseService.update_by_id(kb.id, {"raptor_task_id": tid})
+ except Exception:
+ pass
+
@timeout(60*60*3, 1)
async def do_handle_task(task):
task_type = task.get("task_type", "")
@@ -973,6 +997,7 @@ async def do_handle_task(task):
"Chunk doc({}), page({}-{}), chunks({}), token({}), elapsed:{:.2f}".format(task_document_name, task_from_page,
task_to_page, len(chunks),
token_count, task_time_cost))
+ trigger_update_after(task_dataset_id, task_doc_id)
async def handle_task():
@@ -1087,6 +1112,90 @@ async def task_manager():
task_limiter.release()
+async def _due(cron: str, last_finish: datetime):
+ try:
+ if not cron:
+ return False
+ if not croniter.is_valid(cron):
+ return False
+ slot = datetime.now().replace(second=0, microsecond=0)
+ prev_time = croniter(cron, slot).get_prev(datetime)
+ if last_finish and last_finish >= prev_time:
+ return False
+ return True
+ except Exception:
+ return False
+
+
+async def scheduler():
+ while not stop_event.is_set():
+ try:
+ def _doc_finish_ts_ms(doc):
+ pb = doc.get("process_begin_at")
+ dur = doc.get("process_duration") or 0
+ if not pb:
+ return None
+ try:
+ pb_ts_ms = int(pb.timestamp() * 1000)
+ except Exception:
+ return None
+ return pb_ts_ms + int(dur * 1000)
+
+ def _schedule_if_needed(kb, changed_docs, ty):
+ if not changed_docs:
+ return
+ if ty == "graphrag":
+ task_id = kb.graphrag_task_id
+ else:
+ task_id = kb.raptor_task_id
+ skip = False
+ if task_id:
+ ok, t = TaskService.get_by_id(task_id)
+ skip = bool(ok and t and t.progress not in [-1, 1])
+ if skip:
+ return
+ sample_document = changed_docs[0]
+ document_ids = [d["id"] for d in changed_docs]
+ tid = queue_raptor_o_graphrag_tasks(sample_doc_id=sample_document, ty=ty, priority=0, fake_doc_id=GRAPH_RAPTOR_FAKE_DOC_ID, doc_ids=document_ids)
+ if ty == "graphrag":
+ KnowledgebaseService.update_by_id(kb.id, {"graphrag_task_id": tid})
+ else:
+ KnowledgebaseService.update_by_id(kb.id, {"raptor_task_id": tid})
+
+ ids = KnowledgebaseService.get_all_ids()
+ for kb_id in ids:
+ ok, kb = KnowledgebaseService.get_by_id(kb_id)
+ if not ok:
+ continue
+ conf = kb.parser_config or {}
+ gconf = (conf.get("graphrag") or {})
+ rconf = (conf.get("raptor") or {})
+ if gconf.get("use_graphrag") and gconf.get("strategy") == "timed" and gconf.get("cron"):
+ if await _due(gconf.get("cron"), kb.graphrag_task_finish_at):
+ documents, _ = DocumentService.get_by_kb_id(kb_id=kb.id, page_number=0, items_per_page=0, orderby="create_time", desc=False, keywords="", run_status=[], types=[], suffix=[])
+ if documents:
+ finish_dt = kb.graphrag_task_finish_at
+ changed_docs = documents
+ if finish_dt:
+ finish_ts_ms = int(finish_dt.timestamp() * 1000)
+ changed_docs = [d for d in documents if (lambda t: t is not None and t > finish_ts_ms)(_doc_finish_ts_ms(d))]
+ _schedule_if_needed(kb, changed_docs, "graphrag")
+ if rconf.get("use_raptor") and rconf.get("strategy") == "timed" and rconf.get("cron"):
+ if await _due(rconf.get("cron"), kb.raptor_task_finish_at):
+ documents, _ = DocumentService.get_by_kb_id(kb_id=kb.id, page_number=0, items_per_page=0, orderby="create_time", desc=False, keywords="", run_status=[], types=[], suffix=[])
+ if documents:
+ finish_dt = kb.raptor_task_finish_at
+ changed_docs = documents
+ if finish_dt:
+ finish_ts_ms = int(finish_dt.timestamp() * 1000)
+ changed_docs = [d for d in documents if (lambda t: t is not None and t > finish_ts_ms)(_doc_finish_ts_ms(d))]
+ _schedule_if_needed(kb, changed_docs, "raptor")
+ except Exception as e:
+ logging.exception(e)
+ pass
+ await trio.sleep(60) # Special tasks take a long time to run, so the start time of scheduled tasks does not need to be very precise
+
+
async def main():
logging.info(r"""
____ __ _
@@ -1114,6 +1223,7 @@ async def main():
async with trio.open_nursery() as nursery:
nursery.start_soon(report_status)
+ nursery.start_soon(scheduler)
while not stop_event.is_set():
await task_limiter.acquire()
nursery.start_soon(task_manager)
diff --git a/web/package.json b/web/package.json
index 7f5e3f8dd..9466f86f5 100644
--- a/web/package.json
+++ b/web/package.json
@@ -69,6 +69,7 @@
"classnames": "^2.5.1",
"clsx": "^2.1.1",
"cmdk": "^1.0.4",
+ "cron-validate": "^1.4.5",
"dayjs": "^1.11.10",
"dompurify": "^3.1.6",
"eventsource-parser": "^1.1.2",
diff --git a/web/src/components/parse-configuration/graph-rag-form-fields.tsx b/web/src/components/parse-configuration/graph-rag-form-fields.tsx
index af1d51f83..c8c922310 100644
--- a/web/src/components/parse-configuration/graph-rag-form-fields.tsx
+++ b/web/src/components/parse-configuration/graph-rag-form-fields.tsx
@@ -18,6 +18,8 @@ import {
FormLabel,
FormMessage,
} from '../ui/form';
+import { ExpandedInput } from '../ui/input';
+import { Radio } from '../ui/radio';
import { RAGFlowSelect } from '../ui/select';
import { Switch } from '../ui/switch';
@@ -119,6 +121,10 @@ const GraphRagItems = ({
control: form.control,
name: 'parser_config.graphrag.use_graphrag',
});
+ const strategy = useWatch({
+ control: form.control,
+ name: 'parser_config.graphrag.strategy',
+ });
const methodOptions = useMemo(() => {
return [MethodValue.Light, MethodValue.General].map((x) => ({
@@ -136,6 +142,60 @@ const GraphRagItems = ({
return (
Do you want to continue?
`,
+ useGraphRag: 'Knowledge Graph Generation',
+ useRaptor: 'RAPTOR Generation',
+ raptorStrategy: 'RAPTOR Generation Strategy',
extractRaptor: 'Extract Raptor',
extractKnowledgeGraph: 'Extract Knowledge Graph',
+ graphRagStrategy: 'GraphRAG Generation Strategy',
+ strategyManual: 'Manual',
+ strategyUpdateAfter: 'Update after',
+ strategyTimed: 'Timed',
+ cronExpression: 'Cron expression',
+ cronPlaceholder: 'Please input cron expression',
filterPlaceholder: 'please input filter',
fileFilterTip: '',
fileFilter: 'File Filter',
diff --git a/web/src/locales/es.ts b/web/src/locales/es.ts
index 8d7c5da73..16f28e887 100644
--- a/web/src/locales/es.ts
+++ b/web/src/locales/es.ts
@@ -158,6 +158,17 @@ export default {
html4excel: 'Excel a HTML',
html4excelTip: `Usar junto con el método de fragmentación General. Cuando está desactivado, los archivos de hoja de cálculo (XLSX, XLS (Excel 97-2003)) se analizan línea por línea como pares clave-valor. Cuando está activado, los archivos de hoja de cálculo se convierten en tablas HTML. Si la tabla original tiene más de 12 filas, el sistema la dividirá automáticamente en varias tablas HTML cada 12 filas. Para más información, consulte https://ragflow.io/docs/dev/enable_excel2html.`,
},
+ knowledgeConfiguration: {
+ useGraphRag: 'Generación de grafo de conocimiento',
+ useRaptor: 'Generación de RAPTOR',
+ raptorStrategy: 'Estrategia de generación de RAPTOR',
+ graphRagStrategy: 'Estrategia de generación de GraphRAG',
+ strategyManual: 'Manual',
+ strategyUpdateAfter: 'Tras actualización',
+ strategyTimed: 'Programado',
+ cronExpression: 'Expresión cron',
+ cronPlaceholder: 'Introduzca la expresión cron',
+ },
// Otros bloques de traducción
// Continua con la misma estructura
diff --git a/web/src/locales/fr.ts b/web/src/locales/fr.ts
index cf39def66..269b5a341 100644
--- a/web/src/locales/fr.ts
+++ b/web/src/locales/fr.ts
@@ -194,6 +194,15 @@ export default {
'Le modèle de réordonnancement est très consommateur de temps.',
},
knowledgeConfiguration: {
+ useGraphRag: 'Génération du graphe de connaissances',
+ useRaptor: 'Utiliser RAPTOR pour améliorer la récupération',
+ raptorStrategy: 'Stratégie de génération RAPTOR',
+ graphRagStrategy: 'Stratégie de génération GraphRAG',
+ strategyManual: 'Manuel',
+ strategyUpdateAfter: 'Après mise à jour',
+ strategyTimed: 'Planifié',
+ cronExpression: 'Expression cron',
+ cronPlaceholder: 'Veuillez saisir une expression cron',
titleDescription:
'Modifiez ici la configuration de votre base de connaissances, notamment la méthode de découpage.',
name: 'Nom de la base de connaissances',
@@ -234,6 +243,7 @@ export default {
'Affichera une explication visuelle des catégories de base de connaissances',
// Les contenus HTML comme "book", "laws", etc. sont laissés en l’état pour ne pas altérer leur structure technique.
useRaptor: 'Utiliser RAPTOR pour améliorer la récupération',
+
useRaptorTip:
'Activez RAPTOR pour les questions nécessitant plusieurs étapes. Voir https: //ragflow.io/docs/dev/enable_raptor pour plus d’informations.',
prompt: 'Prompt',
diff --git a/web/src/locales/id.ts b/web/src/locales/id.ts
index c59185350..aeb2035d1 100644
--- a/web/src/locales/id.ts
+++ b/web/src/locales/id.ts
@@ -163,6 +163,13 @@ export default {
html4excelTip: `Gunakan bersama dengan metode pemotongan General. Ketika dinonaktifkan, file spreadsheet (XLSX, XLS (Excel 97-2003)) akan dianalisis baris demi baris menjadi pasangan kunci-nilai. Ketika diaktifkan, file spreadsheet akan dianalisis menjadi tabel HTML. Jika tabel asli memiliki lebih dari 12 baris, sistem akan secara otomatis membagi menjadi beberapa tabel HTML setiap 12 baris. Untuk informasi lebih lanjut, lihat https://ragflow.io/docs/dev/enable_excel2html.`,
},
knowledgeConfiguration: {
+ useGraphRag: 'Generasi grafik pengetahuan',
+ graphRagStrategy: 'Strategi generasi GraphRAG',
+ strategyManual: 'Manual',
+ strategyUpdateAfter: 'Setelah pembaruan',
+ strategyTimed: 'Terjadwal',
+ cronExpression: 'Ekspresi cron',
+ cronPlaceholder: 'Masukkan ekspresi cron',
titleDescription:
'Perbarui detail basis pengetahuan Anda terutama metode parsing di sini.',
name: 'Nama basis pengetahuan',
@@ -290,6 +297,7 @@ export default {
Perhatikan jenis entitas yang perlu Anda tentukan.
その後、チャンクはLLMに入力され、ナレッジグラフとマインドマップのエンティティと関係を抽出します。
エンティティタイプを設定することを忘れないでください。
`, useRaptor: 'RAPTORを使用して検索を強化', + raptorStrategy: 'RAPTOR 生成戦略', useRaptorTip: 'マルチホップ質問応答タスクでRAPTORを有効にしてください。詳細は https://ragflow.io/docs/dev/enable_raptor をご覧ください。', prompt: 'プロンプト', diff --git a/web/src/locales/pt-br.ts b/web/src/locales/pt-br.ts index 8e9d5dade..f01de8e7d 100644 --- a/web/src/locales/pt-br.ts +++ b/web/src/locales/pt-br.ts @@ -201,6 +201,13 @@ export default { metaData: 'Metadados', }, knowledgeConfiguration: { + useGraphRag: 'Geração de grafo de conhecimento', + graphRagStrategy: 'Estratégia de geração GraphRAG', + strategyManual: 'Manual', + strategyUpdateAfter: 'Após atualização', + strategyTimed: 'Agendado', + cronExpression: 'Expressão cron', + cronPlaceholder: 'Insira a expressão cron', titleDescription: 'Atualize a configuração da sua base de conhecimento aqui, especialmente o método de fragmentação.', name: 'Nome da base de conhecimento', @@ -262,6 +269,7 @@ export default {Linhas de texto que não seguirem essas regras serão ignoradas, e cada par de Pergunta & Resposta será tratado como um fragmento distinto.
`, useRaptor: 'Usar RAPTOR para melhorar a recuperação', + raptorStrategy: 'Estratégia de geração RAPTOR', useRaptorTip: 'Ative o RAPTOR para tarefas de perguntas e respostas multi-hop. Veja https://ragflow.io/docs/dev/enable_raptor para mais detalhes.', prompt: 'Prompt', diff --git a/web/src/locales/ru.ts b/web/src/locales/ru.ts index 36161c957..8367991b9 100644 --- a/web/src/locales/ru.ts +++ b/web/src/locales/ru.ts @@ -277,6 +277,15 @@ export default { reRankModelWaring: 'Re-rank модель очень требовательна ко времени.', }, knowledgeConfiguration: { + useGraphRag: 'Генерация графа знаний', + useRaptor: 'Генерация RAPTOR', + raptorStrategy: 'Стратегия генерации RAPTOR', + graphRagStrategy: 'Стратегия генерации GraphRAG', + strategyManual: 'Вручную', + strategyUpdateAfter: 'После обновления', + strategyTimed: 'По расписанию', + cronExpression: 'Cron-выражение', + cronPlaceholder: 'Введите cron-выражение', generationScopeTip: 'Определяет, генерируется ли RAPTOR для всего набора данных или для одного файла.', scopeDataset: 'Датасет', diff --git a/web/src/locales/ru.ts.orig b/web/src/locales/ru.ts.orig new file mode 100644 index 000000000..0c85d1036 --- /dev/null +++ b/web/src/locales/ru.ts.orig @@ -0,0 +1,2139 @@ +export default { + translation: { + common: { + confirm: 'Подтвердить', + back: 'Назад', + noResults: 'Результатов нет.', + selectPlaceholder: 'выберите значение', + selectAll: 'Выбрать все', + delete: 'Удалить', + deleteModalTitle: 'Вы уверены, что хотите удалить этот элемент?', + ok: 'Ок', + cancel: 'Отмена', + yes: 'Да', + no: 'Нет', + total: 'Всего', + rename: 'Переименовать', + name: 'Название', + save: 'Сохранить', + namePlaceholder: 'Введите название', + next: 'Далее', + create: 'Создать', + edit: 'Редактировать', + upload: 'Загрузить', + english: 'Английский', + portugueseBr: 'Португальский (Бразилия)', + chinese: 'Китайский упрощенный', + traditionalChinese: 'Китайский традиционный', + russian: 'Русский', + language: 'Язык', + languageMessage: 'Пожалуйста, укажите ваш язык!', + languagePlaceholder: 'выберите ваш язык', + copy: 'Копировать', + copied: 'Скопировано', + comingSoon: 'Скоро будет', + download: 'Скачать', + close: 'Закрыть', + preview: 'Предпросмотр', + move: 'Переместить', + warn: 'Предупреждение', + action: 'Действие', + s: 'С', + pleaseSelect: 'Пожалуйста, выберите', + pleaseInput: 'Пожалуйста, введите', + submit: 'Отправить', + clear: 'Очистить', + embedIntoSite: 'Встроить на веб-страницу', + previousPage: 'Назад', + nextPage: 'Вперед', + add: 'Добавить', + remove: 'Удалить', + search: 'Поиск', + noDataFound: 'Данные не найдены.', + noData: 'Нет данных', + promptPlaceholder: `Введите текст или используйте / для быстрой вставки переменных.`, + mcp: { + namePlaceholder: 'Мой MCP Сервер', + nameRequired: + 'Длина должна быть от 1 до 64 символов и может содержать только буквы, цифры, дефисы и подчеркивания.', + urlPlaceholder: 'https://api.example.com/v1/mcp', + tokenPlaceholder: 'например, eyJhbGciOiJIUzI1Ni...', + }, + }, + login: { + loginTitle: 'Войдите в свою учетную запись', + signUpTitle: 'Создать учетную запись', + login: 'Войти', + signUp: 'Зарегистрироваться', + loginDescription: 'Мы рады снова видеть вас!', + registerDescription: 'Рады приветствовать вас на борту!', + emailLabel: 'Email', + emailPlaceholder: 'Введите email', + passwordLabel: 'Пароль', + passwordPlaceholder: 'Введите пароль', + rememberMe: 'Запомнить меня', + signInTip: 'Нет учетной записи?', + signUpTip: 'Уже есть учетная запись?', + nicknameLabel: 'Никнейм', + nicknamePlaceholder: 'Введите никнейм', + register: 'Создать учетную запись', + continue: 'Продолжить', + title: 'Ведущий RAG-движок для контекста LLM', + start: 'Давайте начнем', + description: + 'Зарегистрируйтесь бесплатно, чтобы изучить передовые RAG-технологии. Создавайте базы знаний и ИИ для развития вашего бизнеса.', + review: 'на основе 500+ отзывов', + }, + header: { + knowledgeBase: 'Датасет', + chat: 'Чат', + register: 'Регистрация', + signin: 'Войти', + home: 'Главная', + setting: 'Настройки пользователя', + logout: 'Выйти', + fileManager: 'Управление файлами', + flow: 'Агент', + search: 'Поиск', + welcome: 'Добро пожаловать в', + dataset: 'Датасет', + }, + knowledgeList: { + welcome: 'С возвращением', + description: 'Какие базы знаний вы будете использовать сегодня?', + createKnowledgeBase: 'Создать Датасет', + name: 'Название', + namePlaceholder: 'Пожалуйста, введите название.', + doc: 'Документы', + searchKnowledgePlaceholder: 'Поиск', + noMoreData: `Это всё. Больше ничего нет.`, + }, + knowledgeDetails: { + localUpload: 'Локальная загрузка', + fileSize: 'Размер файла', + fileType: 'Тип файла', + uploadedBy: 'Загружено', + notGenerated: 'Не сгенерировано', + generatedOn: 'Сгенерировано ', + subbarFiles: 'Файлы', + generateKnowledgeGraph: + 'Это извлечет сущности и отношения из всех ваших документов в этом наборе данных. Процесс может занять некоторое время.', + generateRaptor: + 'Выполняет рекурсивную кластеризацию и суммаризацию фрагментов документов для построения иерархической древовидной структуры, обеспечивая более осознанное извлечение контекста в длинных документах.', + generate: 'Сгенерировать', + raptor: 'RAPTOR', + processingType: 'Тип обработки', + dataPipeline: 'Пайплайн обработки', + operations: 'Операции', + taskId: 'ID задачи', + duration: 'Продолжительность', + details: 'Детали', + status: 'Статус', + task: 'Задача', + startDate: 'Дата начала', + source: 'Источник', + fileName: 'Имя файла', + datasetLogs: 'Датасет', + fileLogs: 'Файл', + overview: 'Логи', + success: 'Успешно', + failed: 'Неудача', + completed: 'Завершено', + datasetLog: 'Лог Датасета', + created: 'Создано', + learnMore: 'Введение во встроенный пайплайн', + general: 'Общие', + chunkMethodTab: 'Метод чанкинга', + testResults: 'Результаты теста', + testSetting: 'Настройки теста', + retrievalTesting: 'Тестирование извлечения', + retrievalTestingDescription: + 'Проведите тест извлечения, чтобы проверить, может ли RAGFlow восстановить целевой контент для LLM.', + Parse: 'Парсинг', + dataset: 'Датасет', + testing: 'Тестирование извлечения', + files: 'файлы', + configuration: 'Конфигурация', + knowledgeGraph: 'Граф знаний', + name: 'Название', + namePlaceholder: 'Пожалуйста, введите название!', + doc: 'Документы', + datasetDescription: + 'Пожалуйста, дождитесь завершения парсинга ваших файлов, прежде чем начинать чат с ИИ.', + addFile: 'Добавить файл', + searchFiles: 'Поиск по вашим файлам', + localFiles: 'Локальные файлы', + emptyFiles: 'Создать пустой файл', + webCrawl: 'Веб-краулинг', + chunkNumber: 'Количество чанков', + uploadDate: 'Дата загрузки', + chunkMethod: 'Метод чанкинга', + enabled: 'Включено', + disabled: 'Выключено', + action: 'Действие', + parsingStatus: 'Статус парсинга', + parsingStatusTip: + 'Время парсинга документа варьируется в зависимости от нескольких факторов. Включение таких функций, как Граф знаний, RAPTOR, Автоизвлечение вопросов или Автоизвлечение ключевых слов, значительно увеличит время обработки. Если индикатор выполнения завис, обратитесь к этим двум FAQ: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + processBeginAt: 'Начало в', + processDuration: 'Продолжительность', + progressMsg: 'Прогресс', + noTestResultsForRuned: + 'Релевантные результаты не найдены. Попробуйте изменить запрос или параметры.', + noTestResultsForNotRuned: + 'Тест еще не проводился. Результаты появятся здесь.', + testingDescription: + 'Проведите тест извлечения, чтобы проверить, может ли RAGFlow восстановить целевой контент для LLM. Если вы изменили настройки по умолчанию, такие как вес ключевого слова или порог схожести, для достижения оптимальных результатов, имейте в виду, что эти изменения не будут сохранены автоматически. Вы должны применить их в настройках вашего чат-ассистента или в настройках компонента Retrieval агента.', + similarityThreshold: 'Порог схожести', + similarityThresholdTip: + 'RAGFlow использует либо комбинацию взвешенной схожести по ключевым словам и взвешенного косинусного сходства векторов, либо комбинацию взвешенной схожести по ключевым словам и взвешенного reranking-счета при извлечении. Этот параметр устанавливает порог для схожести между пользовательским запросом и чанками. Любой чанк с оценкой схожести ниже этого порога будет исключен из результатов. По умолчанию порог установлен на 0.2. Это означает, что будут извлекаться только чанки с комбинированной оценкой схожести 20 или выше.', + vectorSimilarityWeight: 'Вес векторной схожести', + vectorSimilarityWeightTip: + 'Это устанавливает вес векторной схожести в комбинированной оценке схожести, используемой либо с косинусным сходством векторов, либо с reranking-счетом. Сумма двух весов должна быть равна 1.0.', + keywordSimilarityWeight: 'Вес схожести по ключевым словам', + keywordSimilarityWeightTip: + 'Это устанавливает вес схожести по ключевым словам в комбинированной оценке схожести, используемой либо с косинусным сходством векторов, либо с reranking-счетом. Сумма двух весов должна быть равна 1.0.', + testText: 'Тестовый текст', + testTextPlaceholder: 'Введите ваш вопрос здесь!', + testingLabel: 'Запустить', + similarity: 'Комбинированная схожесть', + termSimilarity: 'Схожесть терминов', + vectorSimilarity: 'Векторная схожесть', + hits: 'Результаты', + view: 'Просмотр', + filesSelected: 'Файлов выбрано', + upload: 'Загрузить', + run: 'Парсить', + runningStatus0: 'ОЖИДАНИЕ', + runningStatus1: 'ПАРСИНГ', + runningStatus2: 'ОТМЕНЕНО', + runningStatus3: 'УСПЕХ', + runningStatus4: 'НЕУДАЧА', + pageRanges: 'Диапазон страниц', + pageRangesTip: + 'Диапазон страниц для парсинга; страницы вне этого диапазона обрабатываться не будут.', + fromPlaceholder: 'от', + fromMessage: 'Отсутствует номер начальной страницы', + toPlaceholder: 'до', + toMessage: 'Отсутствует номер конечной страницы (исключительно)', + layoutRecognize: 'PDF парсер', + layoutRecognizeTip: + 'Используйте визуальную модель для анализа макета PDF для эффективного определения заголовков документов, текстовых блоков, изображений и таблиц. Если выбран наивный вариант, будет извлекаться только простой текст из PDF. Обратите внимание, что эта опция в настоящее время работает ТОЛЬКО для PDF-документов.', + taskPageSize: 'Размер страницы задачи', + taskPageSizeMessage: 'Пожалуйста, введите размер страницы задачи!', + taskPageSizeTip: `Во время распознавания макета PDF-файл разбивается на части и обрабатывается параллельно для увеличения скорости обработки. Этот параметр устанавливает размер каждой части. Больший размер части снижает вероятность разделения непрерывного текста между страницами.`, + addPage: 'Добавить страницу', + greaterThan: 'Текущее значение должно быть больше, чем "до"!', + greaterThanPrevious: + 'Текущее значение должно быть больше предыдущего значения "до"!', + selectFiles: 'Выбрать файлы', + changeSpecificCategory: 'Изменить конкретную категорию', + uploadTitle: 'Перетащите ваш файл сюда для загрузки', + uploadDescription: + 'Поддерживает одиночную или пакетную загрузку файлов. Для локально развернутого RAGFlow: общий ограничение размера файлов за одну загрузку составляет 1 ГБ, с ограничением пакетной загрузки в 32 файла. Нет ограничения на общее количество файлов на аккаунт. Для demo.ragflow.io общий ограничение размера файлов за одну загрузку составляет 10 МБ, каждый файл не должен превышать 10 МБ, максимум 128 файлов на аккаунт.', + chunk: 'Чанк', + bulk: 'Пакетно', + cancel: 'Отмена', + close: 'Закрыть', + rerankModel: 'Rerank модель', + rerankPlaceholder: 'Пожалуйста, выберите', + rerankTip: `Опционально. Если оставить пустым, RAGFlow будет использовать комбинацию взвешенной схожести по ключевым словам и взвешенного косинусного сходства векторов; если выбрана rerank модель, взвешенный reranking счет заменит взвешенное косинусное сходство векторов. Имейте в виду, что использование rerank модели значительно увеличит время отклика системы. Если вы хотите использовать rerank модель, убедитесь, что вы используете SaaS reranker; если вы предпочитаете локально развернутую rerank модель, убедитесь, что вы запускаете RAGFlow с помощью docker-compose-gpu.yml.`, + topK: 'Топ-K', + topKTip: `Используется вместе с Rerank моделью, эта настройка определяет количество текстовых чанков, которые будут отправлены в указанную rerank модель.`, + delimiter: `Разделитель текста`, + delimiterTip: + 'Разделитель может состоять из одного или нескольких специальных символов. Если это несколько символов, убедитесь, что они заключены в обратные кавычки (``). Например, если вы настроите разделители так: \\n`##`;, то ваш текст будет разделен по переводам строк, двойным символам решетки (##) и точкам с запятой.', + html4excel: 'Excel в HTML', + html4excelTip: `Используется с методом чанкинга General. Когда отключено, электронные таблицы (XLSX или XLS (Excel 97-2003)) в базе знаний будут разобраны в пары ключ-значение. Когда включено, они будут разобраны в HTML таблицы, разделяя каждые 12 строк, если исходная таблица имеет более 12 строк. Подробности см. на https://ragflow.io/docs/dev/enable_excel2html.`, + autoKeywords: 'Авто-ключевые слова', + autoKeywordsTip: `Автоматически извлекает N ключевых слов для каждого чанка, чтобы повысить их рейтинг для запросов, содержащих эти ключевые слова. Имейте в виду, что дополнительные токены будут потребляться чат-моделью, указанной в 'Системных настройках модели'. Вы можете проверить или обновить добавленные ключевые слова для чанка из списка чанков. Подробности см. на https://ragflow.io/docs/dev/autokeyword_autoquestion.`, + autoQuestions: 'Авто-вопросы', + autoQuestionsTip: `Автоматически извлекает N вопросов для каждого чанка, чтобы повысить их рейтинг для запросов, содержащих эти вопросы. Вы можете проверить или обновить добавленные вопросы для чанка из списка чанков. Эта функция не нарушит процесс чанкинга в случае ошибки, за исключением того, что может добавить пустой результат в исходный чанк. Имейте в виду, что дополнительные токены будут потребляться LLM, указанной в 'Системных настройках модели'. Подробности см. на https://ragflow.io/docs/dev/autokeyword_autoquestion.`, + redo: 'Вы хотите очистить существующие {{chunkNum}} чанков?', + setMetaData: 'Установить Метаданные', + pleaseInputJson: 'Пожалуйста, введите JSON', + documentMetaTips: `Метаданные представлены в формате Json (они не доступны для поиска). Они будут добавлены в промпт для LLM, если какие-либо чанки этого документа включены в промпт.
+Примеры:
+Метаданные:
+ {
+ "Автор": "Алекс Доусон",
+ "Дата": "2024-11-12"
+ }
+Документ: имя_документа
+Автор: Алекс Доусон
+Дата: 2024-11-12
+Релевантные фрагменты следующие:
+Удаление сгенерированных результатов {{type}} + удалит все производные сущности и отношения из этого набора данных. + Ваши исходные файлы останутся нетронутыми.
+
+ Вы хотите продолжить?
+ `,
+ extractRaptor: 'Извлечь Raptor',
+ extractKnowledgeGraph: 'Извлечь Граф знаний',
+ filterPlaceholder: 'пожалуйста, введите фильтр',
+ fileFilterTip: '',
+ fileFilter: 'Фильтр файлов',
+ setDefaultTip: '',
+ setDefault: 'Установить по умолчанию',
+ eidtLinkDataPipeline: 'Редактировать пайплайн обработки',
+ linkPipelineSetTip: 'Управление связью пайплайна обработки с этим набором данных',
+ default: 'По умолчанию',
+ dataPipeline: 'Пайплайн обработки',
+ linkDataPipeline: 'Связать пайплайн обработки',
+>>>>>>> main
+ enableAutoGenerate: 'Включить авто-генерацию',
+ teamPlaceholder: 'Пожалуйста, выберите команду.',
+ dataFlowPlaceholder: 'Пожалуйста, выберите пайплайн.',
+ buildItFromScratch: 'Построить с нуля',
+ dataFlow: 'Пайплайн',
+ parseType: 'Тип парсинга',
+ manualSetup: 'Выбрать пайплайн',
+ builtIn: 'Встроенный',
+ titleDescription:
+ 'Обновите конфигурацию вашей базы знаний здесь, особенно метод чанкинга.',
+ name: 'Название базы знаний',
+ photo: 'Фото базы знаний',
+ photoTip: 'Вы можете загрузить файл размером до 4 МБ',
+ description: 'Описание',
+ language: 'Язык документа',
+ languageMessage: 'Пожалуйста, укажите ваш язык!',
+ languagePlaceholder: 'Пожалуйста, укажите ваш язык!',
+ permissions: 'Права доступа',
+ embeddingModel: 'Модель эмбеддингов',
+ chunkTokenNumber: 'Рекомендуемый размер чанка',
+ chunkTokenNumberMessage: 'Требуется количество токенов чанка для текста',
+ embeddingModelTip:
+ 'Модель эмбеддингов по умолчанию для базы знаний. Она не может быть изменена после того, как в базе знаний есть чанки. Чтобы переключиться на другую модель эмбеддингов по умолчанию, вы должны удалить все существующие чанки в базе знаний.',
+ permissionsTip:
+ "Если установлено значение 'Команда', все члены вашей команды смогут управлять базой знаний.",
+ chunkTokenNumberTip:
+ 'Это своего рода устанавливает порог токенов для создания чанка. Сегмент с меньшим количеством токенов, чем этот порог, будет объединен со следующими сегментами до тех пор, пока количество токенов не превысит порог, после чего будет создан чанк. Новый чанк не создается, если не встречен разделитель, даже если порог превышен.',
+ chunkMethod: 'Метод чанкинга',
+ chunkMethodTip: 'Смотрите подсказки справа.',
+ upload: 'Загрузить',
+ english: 'Английский',
+ chinese: 'Китайский',
+ portugueseBr: 'Португальский (Бразилия)',
+ embeddingModelPlaceholder: 'Пожалуйста, выберите модель эмбеддингов.',
+ chunkMethodPlaceholder: 'Пожалуйста, выберите метод чанкинга.',
+ save: 'Сохранить',
+ me: 'Только я',
+ team: 'Команда',
+ cancel: 'Отмена',
+ methodTitle: 'Описание метода чанкинга',
+ methodExamples: 'Примеры',
+ methodExamplesDescription:
+ 'Для наглядности предоставлены следующие скриншоты.',
+ dialogueExamplesTitle: 'просмотр',
+ methodEmpty:
+ 'Здесь будет отображено визуальное объяснение категорий базы знаний',
+ book: `
Поддерживаемые форматы файлов: DOCX, PDF, TXT.
+ Для каждой книги в PDF, пожалуйста, установите диапазон страниц, чтобы удалить нежелательную информацию и сократить время анализа.
`, + laws: `Поддерживаемые форматы файлов: DOCX, PDF, TXT.
+ Юридические документы обычно следуют строгому формату написания. Мы используем особенности текста для определения точек разделения. +
+ Чанк имеет гранулярность, соответствующую 'СТАТЬЕ', обеспечивая включение всего текста верхнего уровня в чанк. +
`, + manual: `Поддерживается только PDF.
+ Мы предполагаем, что руководство имеет иерархическую структуру разделов, используя заголовки самых низких разделов в качестве базовой единицы для чанкинга документов. Поэтому рисунки и таблицы в одном разделе не будут разделены, что может привести к большему размеру чанков. +
`, + naive: `Поддерживаемые форматы файлов: MD, MDX, DOCX, XLSX, XLS (Excel 97-2003), PPTX, PDF, TXT, JPEG, JPG, PNG, TIF, GIF, CSV, JSON, EML, HTML.
+Этот метод разбивает файлы 'наивным' способом:
++
Поддерживается только PDF файл.
+ Статьи будут разделены по разделам, таким как аннотация, 1.1, 1.2.
+ Этот подход позволяет LLM более эффективно суммировать статью и предоставлять более полные, понятные ответы. + Однако это также увеличивает контекст для разговоров с ИИ и добавляет вычислительные затраты для LLM. Поэтому во время разговора рассмотрите возможность уменьшения значения 'topN'.
`, + presentation: `Поддерживаемые форматы файлов: PDF, PPTX.
+ Каждая страница в слайдах рассматривается как чанк, с сохранением ее уменьшенного изображения.
+ Этот метод чанкинга автоматически применяется ко всем загруженным PPT файлам, поэтому вам не нужно указывать его вручную.
`, + qa: ` ++ Этот метод чанкинга поддерживает форматы файлов XLSX и CSV/TXT. +
++ + Строки текста, не следующие приведенным выше правилам, будут проигнорированы, и + каждая пара Вопрос-Ответ будет считаться отдельным чанком. + +
+ `, + resume: `Поддерживаемые форматы файлов: DOCX, PDF, TXT. +
+ Резюме различных форм анализируются и организуются в структурированные данные для облегчения поиска кандидатов для рекрутеров. +
+ `, + table: `Поддерживаемые форматы файлов: XLSX и CSV/TXT.
+ Вот некоторые предварительные условия и советы: +
+ Вот несколько примеров заголовков:
Поддерживаются файлы изображений, поддержка видео скоро появится.
+ Этот метод использует модель OCR для извлечения текстов из изображений. +
+ Если текст, извлеченный моделью OCR, считается недостаточным, указанная визуальная LLM будет использована для предоставления описания изображения. +
`, + one: ` +Поддерживаемые форматы файлов: DOCX, XLSX, XLS (Excel 97-2003), PDF, TXT. +
+ Этот метод рассматривает каждый документ целиком как один чанк. +
+ Применимо, когда вы требуете, чтобы LLM суммировал весь документ, при условии, что он может обработать такой объем контекста. +
`, + knowledgeGraph: `Поддерживаемые форматы файлов: DOCX, EXCEL, PPT, IMAGE, PDF, TXT, MD, JSON, EML + +
Этот подход разбивает файлы, используя 'наивный'/'Общий' метод. Он разделяет документ на сегменты, а затем объединяет соседние сегменты до тех пор, пока количество токенов не превысит порог, указанный в 'Количестве токенов чанка для текста', после чего создается чанк.
+Затем чанки передаются в LLM для извлечения сущностей и отношений для графа знаний и ментальной карты.
+Убедитесь, что вы установили Типы сущностей.
`, + tag: `База знаний, использующая метод чанкинга 'Тег', функционирует как набор тегов. Другие базы знаний используют ее для тегирования своих чанков, и запросы к этим базам знаний также тегируются с использованием этого набора тегов.
+Набор тегов НЕ будет напрямую участвовать в процессе RAG (Retrieval-Augmented Generation).
+Каждый чанк в этой базе знаний является независимой парой описание-тег.
+Поддерживаемые форматы файлов включают XLSX и CSV/TXT:
+Если файл в формате XLSX, он должен содержать два столбца без заголовков: один для описаний тегов, другой для имен тегов, причем столбец с описанием предшествует столбцу с тегом. Несколько листов допустимы, при условии, что столбцы правильно структурированы.
+Если файл в формате CSV/TXT, он должен быть закодирован в UTF-8 с TAB в качестве разделителя для разделения описаний и тегов.
+В столбце Тег запятая используется для разделения тегов.
+Строки текста, не следующие приведенным выше правилам, будут проигнорированы. +`, + useRaptor: 'RAPTOR', + useRaptorTip: + 'RAPTOR может использоваться для многошаговых вопросно-ответных задач. Перейдите на страницу Файлы, нажмите Сгенерировать > RAPTOR, чтобы включить его. Подробности см. на https://ragflow.io/docs/dev/enable_raptor.', + prompt: 'Промпт', + promptTip: + 'Используйте системный промпт, чтобы описать задачу для LLM, указать, как она должна отвечать, и очертить другие различные требования. Системный промпт часто используется вместе с ключами (переменными), которые служат различными входными данными для LLM. Используйте прямую косую черту `/` или кнопку (x), чтобы показать ключи для использования.', + promptMessage: 'Промпт обязателен', + promptText: `Пожалуйста, суммируйте следующие параграфы. Будьте внимательны с числами, не выдумывайте. Параграфы следующие: + {cluster_content} +Выше приведено содержимое, которое вам нужно суммировать.`, + maxToken: 'Макс. токенов', + maxTokenTip: 'Максимальное количество токенов на генерируемый суммаризированный чанк.', + maxTokenMessage: 'Макс. токенов обязательно', + threshold: 'Порог', + thresholdTip: + 'В RAPTOR чанки кластеризуются по их семантическому сходству. Параметр Порог устанавливает минимальное сходство, необходимое для группировки чанков вместе. Более высокий Порог означает меньше чанков в каждом кластере, а более низкий - больше.', + thresholdMessage: 'Порог обязателен', + maxCluster: 'Макс. кластеров', + maxClusterTip: 'Максимальное количество создаваемых кластеров.', + maxClusterMessage: 'Макс. кластеров обязательно', + randomSeed: 'Случайное начальное число', + randomSeedMessage: 'Случайное начальное число обязательно', + entityTypes: 'Типы сущностей', + vietnamese: 'Вьетнамский', + pageRank: 'Page rank', + pageRankTip: `Вы можете назначить более высокий балл PageRank определенным базам знаний во время извлечения. Соответствующий балл добавляется к комбинированным оценкам схожести извлеченных чанков из этих баз знаний, повышая их рейтинг. Подробности см. на https://ragflow.io/docs/dev/set_page_rank.`, + tagName: 'Тег', + frequency: 'Частота', + searchTags: 'Поиск тегов', + tagCloud: 'Облако', + tagTable: 'Таблица', + tagSet: 'Наборы тегов', + tagSetTip: ` +Выберите одну или несколько баз знаний тегов для автоматического тегирования чанков в вашей базе знаний. Подробности см. на https://ragflow.io/docs/dev/use_tag_sets.
+Пользовательский запрос также будет автоматически тегирован.
+Эта функция автоматического тегирования улучшает извлечение, добавляя еще один уровень предметно-ориентированных знаний к существующему набору данных. +Разница между авто-тегом и авто-ключевым словом:
+Вы уверены, что хотите удалить эту ссылку на источник данных?
`, + deleteSourceModalConfirmText: 'Подтвердить', + errorMsg: 'Сообщение об ошибке', + newDocs: 'Новые документы', + timeStarted: 'Время начала', + log: 'Лог', + confluenceDescription: + 'Интегрируйте ваше рабочее пространство Confluence для поиска документации.', + s3Description: + 'Подключитесь к вашему AWS S3 бакету для импорта и синхронизации хранимых файлов.', + discordDescription: + 'Свяжите ваш Discord сервер для доступа и анализа данных чата.', + notionDescription: + 'Синхронизируйте страницы и базы данных из Notion для извлечения знаний.', + google_driveDescription: + 'Подключите ваш Google Drive через OAuth и синхронизируйте определенные папки или диски.', + google_driveTokenTip: + 'Загрузите JSON токена OAuth, сгенерированный из помощника OAuth или Google Cloud Console. Вы также можете загрузить client_secret JSON из "установленного" или "веб" приложения. Если это ваша первая синхронизация, откроется окно браузера для завершения согласия OAuth. Если JSON уже содержит токен обновления, он будет автоматически повторно использован.', + google_drivePrimaryAdminTip: + 'Адрес электронной почты, который имеет доступ к содержимому Диска, которое синхронизируется.', + google_driveMyDriveEmailsTip: + 'Электронные почты через запятую, чье содержимое "Мой диск" должно индексироваться (включите основного администратора).', + google_driveSharedFoldersTip: + 'Ссылки на папки Google Drive через запятую для обхода.', + jiraDescription: + 'Подключите ваше рабочее пространство Jira для синхронизации задач, комментариев и вложений.', + jiraBaseUrlTip: + 'Базовый URL вашего сайта Jira (например, https://your-domain.atlassian.net).', + jiraProjectKeyTip: + 'Опционально: ограничьте синхронизацию одним ключом проекта (например, ENG).', + jiraJqlTip: + 'Опциональный фильтр JQL. Оставьте пустым, чтобы полагаться на фильтры проекта/времени.', + jiraBatchSizeTip: + 'Максимальное количество задач, запрашиваемых из Jira за пакет.', + jiraCommentsTip: + 'Включить комментарии Jira в сгенерированный markdown документ.', + jiraAttachmentsTip: + 'Загружать вложения как отдельные документы во время синхронизации.', + jiraAttachmentSizeTip: + 'Вложения размером больше этого количества байт будут пропущены.', + jiraLabelsTip: + 'Метки, которые должны быть пропущены при индексации (через запятую).', + jiraBlacklistTip: + 'Комментарии, автор которых соответствует этим записям, будут игнорироваться.', + jiraScopedTokenTip: + 'Включите это при использовании ограниченных токенов Atlassian (api.atlassian.com).', + jiraEmailTip: 'Email, связанный с учетной записью/API токеном Jira.', + jiraTokenTip: + 'API токен, сгенерированный из https://id.atlassian.com/manage-profile/security/api-tokens.', + jiraPasswordTip: + 'Опциональный пароль для сред Jira Server/Data Center.', + availableSourcesDescription: 'Выберите источник данных для добавления', + availableSources: 'Доступные источники', + datasourceDescription: 'Управляйте вашими источниками данных и подключениями', + save: 'Сохранить', + search: 'Поиск', + availableModels: 'Доступные модели', + profile: 'Профиль', + avatar: 'Аватар', + avatarTip: 'Это будет отображаться в вашем профиле.', + profileDescription: 'Обновите ваше фото и личные данные здесь.', + maxTokens: 'Макс. Токенов', + maxTokensMessage: 'Макс. Токенов обязательно', + maxTokensTip: `Это устанавливает максимальную длину вывода модели, измеряемую в количестве токенов (слов или частей слов). По умолчанию 512. Если отключено, вы снимаете ограничение на максимальное количество токенов, позволяя модели определять количество токенов в своих ответах.`, + maxTokensInvalidMessage: 'Пожалуйста, введите действительное число для Макс. Токенов.', + maxTokensMinMessage: 'Макс. Токенов не может быть меньше 0.', + password: 'Пароль', + passwordDescription: + 'Пожалуйста, введите ваш текущий пароль, чтобы изменить ваш пароль.', + model: 'Провайдеры моделей', + systemModelDescription: 'Пожалуйста, завершите эти настройки перед началом', + dataSources: 'Источники данных', + team: 'Команда', + system: 'Система', + logout: 'Выйти', + api: 'API', + username: 'Имя', + usernameMessage: 'Пожалуйста, введите ваше имя!', + photo: 'Ваше фото', + photoDescription: 'Это будет отображаться в вашем профиле.', + colorSchema: 'Цветовая схема', + colorSchemaMessage: 'Пожалуйста, выберите вашу цветовую схему!', + colorSchemaPlaceholder: 'выберите вашу цветовую схему', + bright: 'Светлая', + dark: 'Темная', + timezone: 'Часовой пояс', + timezoneMessage: 'Пожалуйста, укажите ваш часовой пояс!', + timezonePlaceholder: 'выберите ваш часовой пояс', + email: 'Email', + emailDescription: 'После регистрации Email нельзя изменить.', + currentPassword: 'Текущий пароль', + currentPasswordMessage: 'Пожалуйста, введите ваш пароль!', + newPassword: 'Новый пароль', + changePassword: 'Изменить пароль', + newPasswordMessage: 'Пожалуйста, введите ваш пароль!', + newPasswordDescription: + 'Ваш новый пароль должен быть длиннее 8 символов.', + confirmPassword: 'Подтвердите новый пароль', + confirmPasswordMessage: 'Пожалуйста, подтвердите ваш пароль!', + confirmPasswordNonMatchMessage: + 'Введенные вами новые пароли не совпадают!', + cancel: 'Отмена', + addedModels: 'Добавленные модели', + modelsToBeAdded: 'Модели для добавления', + addTheModel: 'Добавить', + apiKey: 'API-Ключ', + apiKeyMessage: 'Пожалуйста, введите API ключ', + apiKeyTip: + 'API ключ можно получить, зарегистрировавшись у соответствующего поставщика LLM.', + showMoreModels: 'Показать модели', + hideModels: 'Скрыть модели', + baseUrl: 'Базовый-Url', + baseUrlTip: + 'Если ваш API ключ от OpenAI, просто проигнорируйте это. Любые другие промежуточные провайдеры дадут этот базовый url вместе с API ключом.', + tongyiBaseUrlTip: + 'Для китайских пользователей не нужно заполнять или используйте https://dashscope.aliyuncs.com/compatible-mode/v1. Для международных пользователей используйте https://dashscope-intl.aliyuncs.com/compatible-mode/v1', + tongyiBaseUrlPlaceholder: '(Только для международных пользователей, см. подсказку)', + modify: 'Изменить', + systemModelSettings: 'Установить модели по умолчанию', + chatModel: 'LLM', + chatModelTip: 'LLM по умолчанию для каждой новой созданной базы знаний.', + embeddingModel: 'Эмбеддинг', + embeddingModelTip: + 'Модель эмбеддингов по умолчанию для каждой новой созданной базы знаний. Если вы не можете найти модель эмбеддингов в выпадающем списке, проверьте, используете ли вы облегченную версию RAGFlow (которая не включает модели эмбеддингов) или проверьте https://ragflow.io/docs/dev/supported_models, чтобы узнать, поддерживает ли ваш провайдер моделей эту модель.', + img2txtModel: 'VLM', + img2txtModelTip: + 'VLM по умолчанию для каждой новой созданной базы знаний. Она описывает изображение или видео. Если вы не можете найти модель в выпадающем списке, проверьте https://ragflow.io/docs/dev/supported_models, чтобы узнать, поддерживает ли ваш провайдер моделей эту модель.', + sequence2txtModel: 'ASR', + sequence2txtModelTip: + 'Модель ASR по умолчанию для каждой новой созданной базы знаний. Используйте эту модель для преобразования голоса в соответствующий текст.', + rerankModel: 'Rerank', + rerankModelTip: `Модель rerank по умолчанию для переранжирования чанков. Если вы не можете найти модель в выпадающем списке, проверьте https://ragflow.io/docs/dev/supported_models, чтобы узнать, поддерживает ли ваш провайдер моделей эту модель.`, + ttsModel: 'TTS', + ttsModelTip: + 'Модель преобразования текста в речь по умолчанию. Если вы не можете найти модель в выпадающем списке, проверьте https://ragflow.io/docs/dev/supported_models, чтобы узнать, поддерживает ли ваш провайдер моделей эту модель.', + workspace: 'рабочее пространство', + upgrade: 'Обновить', + addLlmTitle: 'Добавить LLM', + editLlmTitle: 'Редактировать модель {{name}}', + editModel: 'Редактировать модель', + modelName: 'Название модели', + modelID: 'ID модели', + modelUid: 'UID модели', + modelNameMessage: 'Пожалуйста, введите название вашей модели!', + modelType: 'Тип модели', + modelTypeMessage: 'Пожалуйста, введите тип вашей модели!', + addLlmBaseUrl: 'Базовый url', + baseUrlNameMessage: 'Пожалуйста, введите ваш базовый url!', + vision: 'Поддерживает ли Vision?', + ollamaLink: 'Как интегрировать {{name}}', + FishAudioLink: 'Как использовать FishAudio', + TencentCloudLink: 'Как использовать TencentCloud ASR', + volcModelNameMessage: 'Пожалуйста, введите название вашей модели!', + addEndpointID: 'EndpointID модели', + endpointIDMessage: 'Пожалуйста, введите EndpointID модели', + addArkApiKey: 'VOLC ARK_API_KEY', + ArkApiKeyMessage: 'Пожалуйста, введите ваш ARK_API_KEY', + bedrockModelNameMessage: 'Пожалуйста, введите название вашей модели!', + addBedrockEngineAK: 'ACCESS KEY', + bedrockAKMessage: 'Пожалуйста, введите ваш ACCESS KEY', + addBedrockSK: 'SECRET KEY', + bedrockSKMessage: 'Пожалуйста, введите ваш SECRET KEY', + bedrockRegion: 'AWS Регион', + bedrockRegionMessage: 'Пожалуйста, выберите!', + 'us-east-2': 'US East (Огайо)', + 'us-east-1': 'US East (Северная Вирджиния)', + 'us-west-1': 'US West (Северная Калифорния)', + 'us-west-2': 'US West (Орегон)', + 'af-south-1': 'Африка (Кейптаун)', + 'ap-east-1': 'Азия-Тихоокеанский регион (Гонконг)', + 'ap-south-2': 'Азия-Тихоокеанский регион (Хайдарабад)', + 'ap-southeast-3': 'Азия-Тихоокеанский регион (Джакарта)', + 'ap-southeast-5': 'Азия-Тихоокеанский регион (Малайзия)', + 'ap-southeast-4': 'Азия-Тихоокеанский регион (Мельбурн)', + 'ap-south-1': 'Азия-Тихоокеанский регион (Мумбаи)', + 'ap-northeast-3': 'Азия-Тихоокеанский регион (Осака)', + 'ap-northeast-2': 'Азия-Тихоокеанский регион (Сеул)', + 'ap-southeast-1': 'Азия-Тихоокеанский регион (Сингапур)', + 'ap-southeast-2': 'Азия-Тихоокеанский регион (Сидней)', + 'ap-east-2': 'Азия-Тихоокеанский регион (Тайбэй)', + 'ap-southeast-7': 'Азия-Тихоокеанский регион (Таиланд)', + 'ap-northeast-1': 'Азия-Тихоокеанский регион (Токио)', + 'ca-central-1': 'Канада (Центральная)', + 'ca-west-1': 'Канада Запад (Калгари)', + 'eu-central-1': 'Европа (Франкфурт)', + 'eu-west-1': 'Европа (Ирландия)', + 'eu-west-2': 'Европа (Лондон)', + 'eu-south-1': 'Европа (Милан)', + 'eu-west-3': 'Европа (Париж)', + 'eu-south-2': 'Европа (Испания)', + 'eu-north-1': 'Европа (Стокгольм)', + 'eu-central-2': 'Европа (Цюрих)', + 'il-central-1': 'Израиль (Тель-Авив)', + 'mx-central-1': 'Мексика (Центральная)', + 'me-south-1': 'Ближний Восток (Бахрейн)', + 'me-central-1': 'Ближний Восток (ОАЭ)', + 'sa-east-1': 'Южная Америка (Сан-Паулу)', + 'us-gov-east-1': 'AWS GovCloud (US-East)', + 'us-gov-west-1': 'AWS GovCloud (US-West)', + addHunyuanSID: 'Hunyuan Secret ID', + HunyuanSIDMessage: 'Пожалуйста, введите ваш Secret ID', + addHunyuanSK: 'Hunyuan Secret Key', + HunyuanSKMessage: 'Пожалуйста, введите ваш Secret Key', + addTencentCloudSID: 'TencentCloud Secret ID', + TencentCloudSIDMessage: 'Пожалуйста, введите ваш Secret ID', + addTencentCloudSK: 'TencentCloud Secret Key', + TencentCloudSKMessage: 'Пожалуйста, введите ваш Secret Key', + SparkModelNameMessage: 'Пожалуйста, выберите модель Spark', + addSparkAPIPassword: 'Spark APIPassword', + SparkAPIPasswordMessage: 'пожалуйста, введите ваш APIPassword', + addSparkAPPID: 'Spark APP ID', + SparkAPPIDMessage: 'пожалуйста, введите ваш APP ID', + addSparkAPISecret: 'Spark APISecret', + SparkAPISecretMessage: 'пожалуйста, введите ваш APISecret', + addSparkAPIKey: 'Spark APIKey', + SparkAPIKeyMessage: 'пожалуйста, введите ваш APIKey', + yiyanModelNameMessage: 'Пожалуйста, введите название модели', + addyiyanAK: 'yiyan API KEY', + yiyanAKMessage: 'Пожалуйста, введите ваш API KEY', + addyiyanSK: 'yiyan Secret KEY', + yiyanSKMessage: 'Пожалуйста, введите ваш Secret KEY', + FishAudioModelNameMessage: + 'Пожалуйста, дайте вашей модели синтеза речи название', + addFishAudioAK: 'Fish Audio API KEY', + addFishAudioAKMessage: 'Пожалуйста, введите ваш API KEY', + addFishAudioRefID: 'FishAudio Reference ID', + addFishAudioRefIDMessage: + 'Пожалуйста, введите Reference ID (оставьте пустым для использования модели по умолчанию).', + GoogleModelIDMessage: 'Пожалуйста, введите ваш ID модели!', + addGoogleProjectID: 'Project ID', + GoogleProjectIDMessage: 'Пожалуйста, введите ваш Project ID', + addGoogleServiceAccountKey: + 'Service Account Key(Оставьте пустым, если используете Application Default Credentials)', + GoogleServiceAccountKeyMessage: + 'Пожалуйста, введите Google Cloud Service Account Key в формате base64', + addGoogleRegion: 'Google Cloud Region', + GoogleRegionMessage: 'Пожалуйста, введите Google Cloud Region', + modelProvidersWarn: `Пожалуйста, сначала добавьте как модель эмбеддингов, так и LLM в Настройки > Провайдеры моделей. Затем установите их в 'Установить модели по умолчанию'.`, + apiVersion: 'API-Версия', + apiVersionMessage: 'Пожалуйста, введите версию API', + add: 'Добавить', + updateDate: 'Дата', + role: 'Статус', + invite: 'Пригласить участника', + agree: 'Принять', + refuse: 'Отклонить', + teamMembers: 'Участники команды', + joinedTeams: 'Присоединенные команды', + sureDelete: 'Вы уверены, что хотите удалить этого участника?', + quit: 'Выйти', + sureQuit: 'Вы уверены, что хотите выйти из команды, к которой присоединились?', + secretKey: 'Секретный ключ', + publicKey: 'Публичный ключ', + secretKeyMessage: 'Пожалуйста, введите секретный ключ', + publicKeyMessage: 'Пожалуйста, введите публичный ключ', + hostMessage: 'Пожалуйста, введите хост', + configuration: 'Конфигурация', + langfuseDescription: + 'Трассировки, оценки, управление промптами и метрики для отладки и улучшения вашего LLM приложения.', + viewLangfuseSDocumentation: "Посмотреть документацию Langfuse", + view: 'Просмотр', + modelsToBeAddedTooltip: + 'Если ваш провайдер моделей не указан, но заявляет о "совместимости с OpenAI-API", выберите карточку OpenAI-API-compatible, чтобы добавить соответствующие модели. ', + mcp: 'MCP', + }, + message: { + registered: 'Зарегистрирован!', + logout: 'выход', + logged: 'вошел в систему!', + pleaseSelectChunk: 'Пожалуйста, выберите чанк!', + registerDisabled: 'Регистрация пользователей отключена', + modified: 'Изменено', + created: 'Создано', + deleted: 'Удалено', + renamed: 'Переименовано', + operated: 'Выполнено', + updated: 'Обновлено', + uploaded: 'Загружено', + 200: 'Сервер успешно возвращает запрошенные данные.', + 201: 'Данные успешно созданы или изменены.', + 202: 'Запрос был поставлен в очередь в фоновом режиме (асинхронная задача).', + 204: 'Данные успешно удалены.', + 400: 'В отправленном запросе была ошибка, и сервер не создал и не изменил данные.', + 401: 'Пожалуйста, войдите снова.', + 403: 'Пользователь авторизован, но доступ запрещен.', + 404: 'Запрос был сделан для несуществующей записи, и сервер не выполнил операцию.', + 406: 'Запрашиваемый формат недоступен.', + 410: 'Запрошенный ресурс был окончательно удален и больше не будет доступен.', + 413: 'Общий размер файлов, загружаемых за один раз, слишком велик.', + 422: 'При создании объекта произошла ошибка валидации.', + 500: 'Произошла ошибка сервера, пожалуйста, проверьте сервер.', + 502: 'Ошибка шлюза.', + 503: 'Сервис недоступен, сервер временно перегружен или находится на техническом обслуживании.', + 504: 'Таймаут шлюза.', + requestError: 'Ошибка запроса', + networkAnomalyDescription: + 'В вашей сети есть аномалия, и вы не можете подключиться к серверу.', + networkAnomaly: 'сетевая аномалия', + hint: 'подсказка', + }, + fileManager: { + files: 'Файлы', + name: 'Название', + uploadDate: 'Дата загрузки', + knowledgeBase: 'Датасет', + size: 'Размер', + action: 'Действие', + addToKnowledge: 'Связать с Базой Знаний', + pleaseSelect: 'Пожалуйста, выберите', + newFolder: 'Новая папка', + file: 'Файл', + uploadFile: 'Загрузить файл', + parseOnCreation: 'Парсить при создании', + directory: 'Директория', + uploadTitle: 'Перетащите ваш файл сюда для загрузки', + uploadDescription: + 'Поддерживает одиночную или пакетную загрузку файлов. Для локально развернутого RAGFlow: общий ограничение размера файлов за одну загрузку составляет 1 ГБ, с ограничением пакетной загрузки в 32 файла. Нет ограничения на общее количество файлов на аккаунт. Для demo.ragflow.io общий ограничение размера файлов за одну загрузку составляет 10 МБ, каждый файл не должен превышать 10 МБ, максимум 128 файлов на аккаунт.', + local: 'Локальные загрузки', + s3: 'S3 загрузки', + preview: 'Предпросмотр', + fileError: 'Ошибка файла', + uploadLimit: + 'Каждый файл не должен превышать 10 МБ, и общее количество файлов не должно превышать 128.', + destinationFolder: 'Целевая папка', + pleaseUploadAtLeastOneFile: 'Пожалуйста, загрузите хотя бы один файл', + }, + flow: { + downloadFileTypeTip: 'Тип файла для скачивания', + downloadFileType: 'Тип скачиваемого файла', + formatTypeError: 'Ошибка формата или типа', + variableNameMessage: + 'Имя переменной может содержать только буквы и подчеркивания', + variableDescription: 'Описание переменной', + defaultValue: 'Значение по умолчанию', + conversationVariable: 'Переменная диалога', + recommended: 'Рекомендуемые', + customerSupport: 'Поддержка клиентов', + marketing: 'Маркетинг', + consumerApp: 'Потребительские приложения', + other: 'Другое', + ingestionPipeline: 'Пайплайн обработки', + agents: 'Агенты', + days: 'Дни', + beginInput: 'Начальный ввод', + ref: 'Переменная', + stockCode: 'Код акции', + apiKeyPlaceholder: + 'YOUR_API_KEY (полученный с https://serpapi.com/manage-api-key)', + flowStart: 'Старт', + flowNum: 'N', + test: 'Тест', + extractDepth: 'Глубина извлечения', + format: 'Формат', + basic: 'базовый', + advanced: 'продвинутый', + general: 'общий', + searchDepth: 'Глубина поиска', + tavilyTopic: 'Тема Tavily', + maxResults: 'Макс. результатов', + includeAnswer: 'Включать ответ', + includeRawContent: 'Включать исходное содержимое', + includeImages: 'Включать изображения', + includeImageDescriptions: 'Включать описания изображений', + includeDomains: 'Включать домены', + ExcludeDomains: 'Исключать домены', + Days: 'Дни', + comma: 'Запятая', + semicolon: 'Точка с запятой', + period: 'Точка', + lineBreak: 'Разрыв строки', + tab: 'Табуляция', + space: 'Пробел', + delimiters: 'Разделители', + merge: 'Объединить', + split: 'Разделить', + script: 'Скрипт', + iterationItemDescription: + 'Представляет текущий элемент в итерации, который может быть использован и обработан на последующих шагах.', + guidingQuestion: 'Направляющий вопрос', + onFailure: 'При неудаче', + userPromptDefaultValue: + 'Это заказ, который вам нужно отправить агенту.', + search: 'Поиск', + communication: 'Коммуникация', + developer: 'Разработчик', + typeCommandOrsearch: 'Введите команду или поиск...', + builtIn: 'Встроенный', + ExceptionDefaultValue: 'Значение по умолчанию при исключении', + exceptionMethod: 'Метод обработки исключений', + maxRounds: 'Макс. раундов рефлексии', + delayEfterError: 'Задержка после ошибки', + maxRetries: 'Макс. попыток повтора', + advancedSettings: 'Расширенные настройки', + addTools: 'Добавить инструменты', + sysPromptDefaultValue: ` ++ Вы собираетесь перезапустить процесс, начиная с шага {{step}}. +
+Это:
В настоящее время вы редактируете результаты этого этапа.
+Если вы переключитесь на более поздний этап, ваши изменения будут потеряны.
+Чтобы сохранить их, пожалуйста, нажмите Перезапустить, чтобы повторно запустить текущий этап.
`, + changeStepModalConfirmText: 'Все равно переключить', + changeStepModalCancelText: 'Отмена', + unlinkPipelineModalTitle: 'Отвязать пайплайн обработки', + unlinkPipelineModalConfirmText: 'Отвязать', + unlinkPipelineModalContent: ` +После отвязки этот Датасет больше не будет подключен к текущему пайплайну обработки.
+Файлы, которые уже парсятся, продолжат до завершения
+Файлы, которые еще не парсились, больше не будут обрабатываться
Вы уверены, что хотите продолжить?
`, + unlinkSourceModalTitle: 'Отвязать источник данных', + unlinkSourceModalContent: ` +Вы уверены, что хотите отвязать этот источник данных?
`, + unlinkSourceModalConfirmText: 'Отвязать', + }, + datasetOverview: { + downloadTip: 'Файлы загружаются из источников данных. ', + processingTip: 'Файлы обрабатываются пайплайном обработки.', + totalFiles: 'Всего файлов', + downloading: 'Загрузка', + downloadSuccessTip: 'Всего успешных загрузок', + downloadFailedTip: 'Всего неудачных загрузок', + processingSuccessTip: 'Всего успешно обработанных файлов', + processingFailedTip: 'Всего неудачных обработок', + processing: 'Обработка', + }, + admin: { + loginTitle: 'Административная консоль', + title: 'RAGFlow', + confirm: 'Подтвердить', + close: 'Закрыть', + yes: 'Да', + no: 'Нет', + delete: 'Удалить', + cancel: 'Отмена', + reset: 'Сбросить', + import: 'Импорт', + description: 'Описание', + noDescription: 'Нет описания', + + resourceType: { + dataset: 'Датасет', + chat: 'Чат', + agent: 'Агент', + search: 'Поиск', + file: 'Файл', + team: 'Команда', + memory: 'Память', + }, + + permissionType: { + enable: 'Включить', + read: 'Чтение', + write: 'Запись', + share: 'Поделиться', + }, + + serviceStatus: 'Статус сервиса', + userManagement: 'Управление пользователями', + registrationWhitelist: 'Белый список регистрации', + roles: 'Роли', + monitoring: 'Мониторинг', + + back: 'Назад', + active: 'Активный', + inactive: 'Неактивный', + enable: 'Включить', + disable: 'Выключить', + all: 'Все', + actions: 'Действия', + newUser: 'Новый пользователь', + email: 'Email', + name: 'Имя', + nickname: 'Никнейм', + status: 'Статус', + id: 'ID', + serviceType: 'Тип сервиса', + host: 'Хост', + port: 'Порт', + + role: 'Роль', + user: 'Пользователь', + superuser: 'Суперпользователь', + + createTime: 'Время создания', + lastLoginTime: 'Время последнего входа', + lastUpdateTime: 'Время последнего обновления', + + isAnonymous: 'Анонимный', + isSuperuser: 'Суперпользователь', + + deleteUser: 'Удалить пользователя', + deleteUserConfirmation: 'Вы уверены, что хотите удалить этого пользователя?', + + createNewUser: 'Создать нового пользователя', + changePassword: 'Изменить пароль', + newPassword: 'Новый пароль', + confirmNewPassword: 'Подтвердите новый пароль', + password: 'Пароль', + confirmPassword: 'Подтвердите пароль', + + invalidEmail: 'Пожалуйста, введите действительный адрес электронной почты!', + passwordRequired: 'Пожалуйста, введите ваш пароль!', + passwordMinLength: 'Пароль должен быть длиннее 8 символов.', + confirmPasswordRequired: 'Пожалуйста, подтвердите ваш пароль!', + confirmPasswordDoNotMatch: 'Введенные вами пароли не совпадают!', + + read: 'Чтение', + write: 'Запись', + share: 'Поделиться', + create: 'Создать', + + extraInfo: 'Дополнительная информация', + serviceDetail: `Детали сервиса {{name}}`, + taskExecutorDetail: 'Детали исполнителя задачи', + + whitelistManagement: 'Управление белым списком', + exportAsExcel: 'Экспорт в Excel', + importFromExcel: 'Импорт из Excel', + createEmail: 'Создать email', + deleteEmail: 'Удалить email', + editEmail: 'Редактировать email', + deleteWhitelistEmailConfirmation: + 'Вы уверены, что хотите удалить этот email из белого списка? Это действие нельзя отменить.', + + importWhitelist: 'Импорт белого списка (Excel)', + importSelectExcelFile: 'Excel файл (.xlsx)', + importOverwriteExistingEmails: 'Перезаписать существующие emails', + importInvalidExcelFile: 'Пожалуйста, выберите действительный Excel файл', + importFileRequired: 'Пожалуйста, выберите файл для импорта', + importFileTips: + 'Файл должен содержать один заголовочный столбец с именемemail.',
+
+ chunkNum: 'Чанки',
+ docNum: 'Документы',
+ tokenNum: 'Использовано токенов',
+ language: 'Язык',
+ createDate: 'Дата создания',
+ updateDate: 'Дата обновления',
+ permission: 'Права доступа',
+
+ agentTitle: 'Название агента',
+ canvasCategory: 'Категория канваса',
+
+ newRole: 'Новая роль',
+ addNewRole: 'Добавить новую роль',
+ roleName: 'Название роли',
+ roleNameRequired: 'Название роли обязательно',
+ resources: 'Ресурсы',
+
+ editRoleDescription: 'Редактировать описание роли',
+ deleteRole: 'Удалить роль',
+ deleteRoleConfirmation:
+ 'Вы уверены, что хотите удалить эту роль? Это действие нельзя отменить.',
+
+ alive: 'Активен',
+ timeout: 'Таймаут',
+ fail: 'Неудача',
+ },
+ },
+};
diff --git a/web/src/locales/vi.ts b/web/src/locales/vi.ts
index 403dfd1a1..173328adb 100644
--- a/web/src/locales/vi.ts
+++ b/web/src/locales/vi.ts
@@ -182,6 +182,13 @@ export default {
documentMetaTips: `Dữ liệu meta ở định dạng Json (không thể tìm kiếm). Nó sẽ được thêm vào prompt cho LLM nếu bất kỳ đoạn nào của tài liệu này được đưa vào prompt.
Ví dụ:
Dữ liệu meta là: { "Author": "Alex Dowson", "Date": "2024-11-12" } Tài liệu: the_name_of_document
Tác giả: Alex Dowson
Ngày: 2024-11-12
Các đoạn liên quan như sau:
Các khối sau đó được đưa vào LLM để trích xuất các thực thể và mối quan hệ cho biểu đồ tri thức và sơ đồ tư duy.
Đảm bảo bạn đã đặt Loại thực thể.
`, useRaptor: 'Sử dụng RAPTOR để cải thiện truy xuất', + raptorStrategy: 'Chiến lược tạo RAPTOR', useRaptorTip: 'Kích hoạt RAPTOR cho các tác vụ hỏi đáp đa bước. Xem chi tiết tại https://ragflow.io/docs/dev/enable_raptor.', prompt: 'Nhắc nhở', diff --git a/web/src/locales/zh-traditional.ts b/web/src/locales/zh-traditional.ts index c946ea9f8..11f1b1068 100644 --- a/web/src/locales/zh-traditional.ts +++ b/web/src/locales/zh-traditional.ts @@ -318,7 +318,8 @@ export default {標籤欄中,標籤之間用英文逗號分隔。
不符合上述規則的文字行將被忽略。 `, - useRaptor: '使用 RAPTOR 文件增強策略', + useRaptor: '召回增強RAPTOR生成資訊', + raptorStrategy: '召回增強RAPTOR生成策略', useRaptorTip: '啟用 RAPTOR 以用於多跳問答任務。詳情請參見:https://ragflow.io/docs/dev/enable_raptor', prompt: '提示詞', @@ -364,7 +365,13 @@ export default { `, tags: '標籤', addTag: '增加標籤', - useGraphRag: '提取知識圖譜', + useGraphRag: '知識圖譜生成資訊', + graphRagStrategy: '知識圖譜生成策略', + strategyManual: '手動', + strategyUpdateAfter: '更新後', + strategyTimed: '定時', + cronExpression: '定時生成 cron 表達式', + cronPlaceholder: '請輸入 cron 表達式', useGraphRagTip: '基於知識庫內所有切好的文本塊構建知識圖譜,用以提升多跳和複雜問題回答的正確率。請注意:構建知識圖譜將消耗大量 token 和時間。詳見 https://ragflow.io/docs/dev/construct_knowledge_graph。', graphRagMethod: '方法', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index 7601cc3c4..37fa270a6 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -439,7 +439,8 @@ export default {在标签列中,标签之间使用英文逗号分隔。
不符合上述规则的文本行将被忽略。 `, - useRaptor: '使用召回增强 RAPTOR 策略', + useRaptor: '召回增强RAPTOR生成信息', + raptorStrategy: '召回增强RAPTOR生成策略', useRaptorTip: 'RAPTOR 常应用于复杂的多跳问答任务。如需打开,请跳转至知识库的文件页面,点击生成 > RAPTOR 开启。详见: https://ragflow.io/docs/dev/enable_raptor。', prompt: '提示词', @@ -485,7 +486,13 @@ export default { `, tags: '标签', addTag: '增加标签', - useGraphRag: '提取知识图谱', + useGraphRag: '知识图谱生成信息', + graphRagStrategy: '知识图谱生成策略', + strategyManual: '手动', + strategyUpdateAfter: '更新后', + strategyTimed: '定时', + cronExpression: '定时生成 cron 表达式', + cronPlaceholder: '请输入 cron 表达式', useGraphRagTip: '基于知识库内所有切好的文本块构建知识图谱,用以提升多跳和复杂问题回答的正确率。请注意:构建知识图谱将消耗大量 token 和时间。详见 https://ragflow.io/docs/dev/construct_knowledge_graph。', graphRagMethod: '方法', diff --git a/web/src/pages/dataset/dataset-setting/form-schema.ts b/web/src/pages/dataset/dataset-setting/form-schema.ts index 51d4afc3d..51bfed756 100644 --- a/web/src/pages/dataset/dataset-setting/form-schema.ts +++ b/web/src/pages/dataset/dataset-setting/form-schema.ts @@ -1,5 +1,15 @@ import { t } from 'i18next'; import { z } from 'zod'; +import cron from 'cron-validate'; + +const isValidCron = (s?: string) => { + if (!s) return false; + const result = cron(s, { + preset: 'default', + override: { useSeconds: false, useYears: false }, + }); + return result.isValid(); +}; export const formSchema = z .object({ @@ -38,6 +48,8 @@ export const formSchema = z max_cluster: z.number().optional(), random_seed: z.number().optional(), scope: z.string().optional(), + strategy: z.string().optional(), + cron: z.string().optional(), }) .refine( (data) => { @@ -50,6 +62,18 @@ export const formSchema = z message: 'Prompt is required', path: ['prompt'], }, + ) + .refine( + (data) => { + if (data.strategy === 'timed') { + return isValidCron(data.cron || ''); + } + return true; + }, + { + message: 'Invalid cron expression', + path: ['cron'], + }, ), graphrag: z .object({ @@ -58,6 +82,8 @@ export const formSchema = z method: z.string().optional(), resolution: z.boolean().optional(), community: z.boolean().optional(), + strategy: z.string().optional(), + cron: z.string().optional(), }) .refine( (data) => { @@ -73,6 +99,18 @@ export const formSchema = z message: 'Please enter Entity types', path: ['entity_types'], }, + ) + .refine( + (data) => { + if (data.strategy === 'timed') { + return isValidCron(data.cron || ''); + } + return true; + }, + { + message: 'Invalid cron expression', + path: ['cron'], + }, ), }) .optional(), diff --git a/web/src/pages/dataset/dataset-setting/index.tsx b/web/src/pages/dataset/dataset-setting/index.tsx index 5a9b5c4bc..1546296f7 100644 --- a/web/src/pages/dataset/dataset-setting/index.tsx +++ b/web/src/pages/dataset/dataset-setting/index.tsx @@ -75,11 +75,15 @@ export default function DatasetSettings() { random_seed: 0, scope: 'file', prompt: t('knowledgeConfiguration.promptText'), + strategy: 'manual', + cron: '', }, graphrag: { use_graphrag: true, entity_types: initialEntityTypes, method: MethodValue.Light, + strategy: 'manual', + cron: '', }, }, pipeline_id: '',