From 3d64f8d04474beaff979592c692ad1b7eed28803 Mon Sep 17 00:00:00 2001 From: euvre <93761161+euvre@users.noreply.github.com> Date: Wed, 12 Aug 2026 04:11:49 -0700 Subject: [PATCH] fix(ingestion): remove broken built-in Resume pipeline (#18173) --- internal/admin/service.go | 2 +- internal/common/parser_config.go | 1 - internal/entity/dataset.go | 1 - .../pipeline/builtin_registry_test.go | 1 - .../template/ingestion_pipeline_resume.json | 447 ------------------ .../pipeline/template_integration_test.go | 97 ---- .../task/pipeline_executor_defaults_test.go | 6 +- internal/service/user.go | 2 +- 8 files changed, 4 insertions(+), 553 deletions(-) delete mode 100644 internal/ingestion/pipeline/template/ingestion_pipeline_resume.json diff --git a/internal/admin/service.go b/internal/admin/service.go index d948a13955..13699f389d 100644 --- a/internal/admin/service.go +++ b/internal/admin/service.go @@ -252,7 +252,7 @@ func (s *Service) CreateUser(ctx context.Context, username, password, role strin rerankModel := "" var ttsModel *string = nil var ocrModel *string = nil - parserIDs := "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email" + parserIDs := "naive:General,qa:Q&A,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email" if cfg != nil { chatModel = cfg.GetDefaultChatModel().Name diff --git a/internal/common/parser_config.go b/internal/common/parser_config.go index df3c53588f..92f0163e68 100644 --- a/internal/common/parser_config.go +++ b/internal/common/parser_config.go @@ -70,7 +70,6 @@ func GetParserConfig(parserID string, parserConfig map[string]interface{}) map[s "topn_tags": 3, }, "qa": nil, - "resume": nil, "manual": nil, "paper": nil, "book": nil, diff --git a/internal/entity/dataset.go b/internal/entity/dataset.go index 45ce1a2f22..25392cdf9b 100644 --- a/internal/entity/dataset.go +++ b/internal/entity/dataset.go @@ -49,7 +49,6 @@ const ( ParserTypeLaws ParserType = "laws" ParserTypeManual ParserType = "manual" ParserTypePaper ParserType = "paper" - ParserTypeResume ParserType = "resume" ParserTypeBook ParserType = "book" ParserTypeQA ParserType = "qa" ParserTypeTable ParserType = "table" diff --git a/internal/ingestion/pipeline/builtin_registry_test.go b/internal/ingestion/pipeline/builtin_registry_test.go index 32e4299519..09e38d3fea 100644 --- a/internal/ingestion/pipeline/builtin_registry_test.go +++ b/internal/ingestion/pipeline/builtin_registry_test.go @@ -88,7 +88,6 @@ func TestRegistryVsHardcodedList(t *testing.T) { "picture": true, "presentation": true, "qa": true, - "resume": true, "table": true, } for h := range hardcoded { diff --git a/internal/ingestion/pipeline/template/ingestion_pipeline_resume.json b/internal/ingestion/pipeline/template/ingestion_pipeline_resume.json deleted file mode 100644 index 4721777419..0000000000 --- a/internal/ingestion/pipeline/template/ingestion_pipeline_resume.json +++ /dev/null @@ -1,447 +0,0 @@ -{ - "id": 40, - "title": { - "en": "Resume", - "de": "Lebenslauf", - "zh": "简历" - }, - "description": { - "en": "This template segments parsed files into resume-specific sections. Best for career-related documents with clearly defined categories such as experience, education, projects, and skills.", - "de": "Diese Vorlage segmentiert die geparste Datei anhand der Struktur eines Lebenslaufs. Sie eignet sich für Dokumente mit klar definierten Abschnitten wie persönlichen Informationen, Ausbildung, Berufserfahrung, Projekten, Fähigkeiten, Zertifikaten und anderen karrierebezogenen Inhalten.", - "zh": "此模板将解析后的文件按简历结构进行切片,适用于具有清晰分节的文档类型,如个人信息、教育背景、工作经历、项目经历、技能、证书及其他职业相关内容。" - }, - "canvas_type": "Ingestion Pipeline", - "canvas_category": "dataflow_canvas", - "dsl": { - "components": { - "Extractor:ThreeDrinksAct": { - "downstream": [ - "Tokenizer:KindHandsWin" - ], - "obj": { - "component_name": "Extractor", - "params": { - "field_name": "metadata", - "frequencyPenaltyEnabled": true, - "frequency_penalty": 0.7, - "llm_id": "THUDM/GLM-4.1V-9B-Thinking@SILICONFLOW", - "maxTokensEnabled": false, - "max_tokens": 256, - "outputs": { - "chunks": { - "type": "Array", - "value": [] - } - }, - "presencePenaltyEnabled": true, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "Content: {TitleChunker:FlatMiceFix@chunks}", - "role": "user" - } - ], - "sys_prompt": "Act as a precise resume metadata extractor. Extract stable, chunk-supported metadata from the provided resume content.\n\nRules:\n1. Use only information explicitly stated in the content. Do not infer, guess, normalize, or add missing facts.\n2. The input may be only one chunk of a resume. Extract only what this content directly supports.\n3. Use only these field names:\ncandidate_name, gender, phone, email, city, location, nationality, linkedin, github, website, highest_degree, degree_levels, school_names, majors, graduation_years, work_experience_years, current_job_title, job_titles, company_names, job_experience, industries, target_job_titles, target_locations, employment_types, skills, certificates, awards, summary_tags\n4. Ignore detailed responsibilities, project descriptions, achievement narratives, self-evaluation, and other low-value local details.\n5. Keep values in the same language as the source text whenever possible.\n6. Remove duplicates and keep only concise, high-value metadata.\n7. Return only fields that are explicitly supported by the content. Do not return empty or unsupported fields.\n\nField guidance:\n- highest_degree: highest explicit degree level mentioned\n- degree_levels: all explicit degree levels mentioned\n- school_names: explicit school, college, or university names\n- majors: explicit fields of study\n- graduation_years: explicit graduation years only\n- work_experience_years: only if explicitly stated\n- current_job_title: only if explicitly current or most recent\n- job_titles: explicit role titles\n- company_names: explicit employer names\n- job_experience: concise structured work entries explicitly supported by the content, preferably including title, company, and time information when available\n- industries: explicit industry names only\n- target_job_titles: explicit desired roles only\n- target_locations: explicit desired work locations only\n- skills: concise, core, search-useful skills explicitly mentioned\n- certificates: explicit certificate names only\n- awards: explicit award names only\n- summary_tags: short, high-value tags strictly supported by the content\n\nReturn only the extracted metadata. Do not output explanatory text.", - "temperature": 0.1, - "temperatureEnabled": true, - "tenant_llm_id": 29, - "topPEnabled": true, - "top_p": 0.3, - "auto_keywords": 0, - "auto_questions": 0, - "auto_tags": 0, - "tag_file_id": "", - "enable_metadata": 0, - "metadata": [] - } - }, - "upstream": [ - "TitleChunker:FlatMiceFix" - ] - }, - "File": { - "downstream": [ - "Parser:HipSignsRhyme" - ], - "obj": { - "component_name": "File", - "params": {} - }, - "upstream": [] - }, - "Parser:HipSignsRhyme": { - "downstream": [ - "TitleChunker:FlatMiceFix" - ], - "obj": { - "component_name": "Parser", - "params": { - "outputs": { - "html": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - }, - "markdown": { - "type": "string", - "value": "" - }, - "text": { - "type": "string", - "value": "" - } - }, - "docx": { - "flatten_media_to_text": true, - "output_format": "json", - "preprocess": [ - "main_content" - ], - "suffix": [ - "docx" - ], - "vlm": {} - }, - "pdf": { - "flatten_media_to_text": true, - "output_format": "json", - "parse_method": "DeepDOC", - "preprocess": [ - "main_content" - ], - "suffix": [ - "pdf" - ], - "vlm": {} - }, - "text&code": { - "output_format": "json", - "preprocess": [ - "main_content" - ], - "suffix": [ - "txt" - ] - } - } - }, - "upstream": [ - "File" - ] - }, - "TitleChunker:FlatMiceFix": { - "downstream": [ - "Extractor:ThreeDrinksAct" - ], - "obj": { - "component_name": "TitleChunker", - "params": { - "hierarchy": 1, - "include_heading_content": false, - "levels": [ - [ - "^\\s*(?i:(?:\\d+[\\.\\)]\\s*)?(?:EDUCATION|ACADEMIC\\s*BACKGROUND|ACADEMIC\\s*HISTORY|EDUCATIONAL\\s*BACKGROUND|RELEVANT\\s*COURSEWORK|COURSEWORK|EXPERIENCE|WORK\\s*EXPERIENCE|PROFESSIONAL\\s*EXPERIENCE|RELEVANT\\s*EXPERIENCE|EMPLOYMENT\\s*HISTORY|CAREER\\s*HISTORY|INTERNSHIP\\s*EXPERIENCE|PROJECTS|PROJECT\\s*EXPERIENCE|ACADEMIC\\s*PROJECTS|PROFESSIONAL\\s*PROJECTS|SKILLS|TECHNICAL\\s*SKILLS|CORE\\s*COMPETENCIES|COMPETENCIES|QUALIFICATIONS|SUMMARY\\s*OF\\s*QUALIFICATIONS|CERTIFICATIONS|LICENSES|CERTIFICATES|AWARDS|HONORS|HONOURS|ACHIEVEMENTS|PUBLICATIONS|RESEARCH|RESEARCH\\s*EXPERIENCE|LEADERSHIP|LEADERSHIP\\s*EXPERIENCE|ACTIVITIES|EXTRACURRICULAR\\s*ACTIVITIES|ACTIVITIES\\s*(?:&|AND)\\s*SKILLS|INVOLVEMENT|CAMPUS\\s*INVOLVEMENT|VOLUNTEER\\s*EXPERIENCE|VOLUNTEERING|COMMUNITY\\s*SERVICE|LANGUAGES|INTERESTS|HOBBIES|PROFILE|PROFESSIONAL\\s*PROFILE|SUMMARY|PROFESSIONAL\\s*SUMMARY|CAREER\\s*SUMMARY|OBJECTIVE|CAREER\\s*OBJECTIVE|PERSONAL\\s*INFORMATION|CONTACT\\s*INFORMATION|ADDITIONAL\\s*INFORMATION|TRAINING))\\s*[::]?\\s*$" - ], - [ - "^\\s*(?:\\d+[\\.、\\)]\\s*)?(?:教育背景|教育经历|学历背景|学术背景|技术背景|工作经历|工作经验|实习经历|项目经历|项目经验|科研经历|研究经历|校园经历|实践经历|专业经历|职业经历|技能|专业技能|技能特长|核心技能|技术栈|个人技能|工作技能|职业技能|技能与评价|技能与自我评价|工作技能与自我评价|职业技能与自我评价|证书|资格证书|职业资格|资质证书|获奖情况|获奖经历|荣誉|荣誉奖项|奖项|科研成果|论文发表|发表论文|领导经历|学生工作|校园活动|社团经历|活动经历|志愿经历|志愿服务|社会实践|语言能力|语言|自我评价|个人评价|自我总结|个人总结|个人优势|个人简介|个人信息|基本信息|联系方式|求职意向|应聘意向|职业目标|求职目标|兴趣爱好|兴趣特长|培训经历|其他信息|附加信息)\\s*[::]?\\s*$" - ] - ], - "method": "hierarchy" - } - }, - "upstream": [ - "Parser:HipSignsRhyme" - ] - }, - "Tokenizer:KindHandsWin": { - "downstream": [], - "obj": { - "component_name": "Tokenizer", - "params": { - "fields": "text", - "filename_embd_weight": 0.1, - "outputs": {}, - "search_method": [ - "embedding", - "full_text" - ] - } - }, - "upstream": [ - "Extractor:ThreeDrinksAct" - ] - } - }, - "globals": { - "sys.history": [] - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Filestart-Parser:HipSignsRhymeend", - "source": "File", - "sourceHandle": "start", - "target": "Parser:HipSignsRhyme", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Parser:HipSignsRhymestart-TitleChunker:FlatMiceFixend", - "source": "Parser:HipSignsRhyme", - "sourceHandle": "start", - "target": "TitleChunker:FlatMiceFix", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Extractor:ThreeDrinksActstart-Tokenizer:KindHandsWinend", - "markerEnd": "logo", - "source": "Extractor:ThreeDrinksAct", - "sourceHandle": "start", - "target": "Tokenizer:KindHandsWin", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__TitleChunker:FlatMiceFixstart-Extractor:ThreeDrinksActend", - "markerEnd": "logo", - "source": "TitleChunker:FlatMiceFix", - "sourceHandle": "start", - "target": "Extractor:ThreeDrinksAct", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - } - ], - "nodes": [ - { - "data": { - "label": "File", - "name": "File" - }, - "id": "File", - "measured": { - "height": 49, - "width": 200 - }, - "position": { - "x": 50, - "y": 200 - }, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "outputs": { - "html": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - }, - "markdown": { - "type": "string", - "value": "" - }, - "text": { - "type": "string", - "value": "" - } - }, - "setups": [ - { - "fileFormat": "pdf", - "flatten_media_to_text": true, - "output_format": "json", - "parse_method": "DeepDOC", - "preprocess": [ - "main_content" - ] - }, - { - "fileFormat": "text&code", - "output_format": "json", - "preprocess": [ - "main_content" - ] - }, - { - "fileFormat": "docx", - "flatten_media_to_text": true, - "output_format": "json", - "preprocess": [ - "main_content" - ] - } - ] - }, - "label": "Parser", - "name": "Parser_0" - }, - "dragging": false, - "id": "Parser:HipSignsRhyme", - "measured": { - "height": 197, - "width": 200 - }, - "position": { - "x": 307.6583243118047, - "y": 119.87418674572268 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "parserNode" - }, - { - "data": { - "form": { - "fields": "text", - "filename_embd_weight": 0.1, - "outputs": {}, - "search_method": [ - "embedding", - "full_text" - ] - }, - "label": "Tokenizer", - "name": "Indexer_0" - }, - "dragging": false, - "id": "Tokenizer:KindHandsWin", - "measured": { - "height": 113, - "width": 200 - }, - "position": { - "x": 883.0243372012395, - "y": 156.39625132974524 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "tokenizerNode" - }, - { - "data": { - "form": { - "hierarchy": "1", - "include_heading_content": false, - "method": "hierarchy", - "outputs": { - "chunks": { - "type": "Array", - "value": [] - } - }, - "promote_first_heading_to_root": false, - "rules": [ - { - "levels": [ - { - "expression": "^\\s*(?i:(?:\\d+[\\.\\)]\\s*)?(?:EDUCATION|ACADEMIC\\s*BACKGROUND|ACADEMIC\\s*HISTORY|EDUCATIONAL\\s*BACKGROUND|RELEVANT\\s*COURSEWORK|COURSEWORK|EXPERIENCE|WORK\\s*EXPERIENCE|PROFESSIONAL\\s*EXPERIENCE|RELEVANT\\s*EXPERIENCE|EMPLOYMENT\\s*HISTORY|CAREER\\s*HISTORY|INTERNSHIP\\s*EXPERIENCE|PROJECTS|PROJECT\\s*EXPERIENCE|ACADEMIC\\s*PROJECTS|PROFESSIONAL\\s*PROJECTS|SKILLS|TECHNICAL\\s*SKILLS|CORE\\s*COMPETENCIES|COMPETENCIES|QUALIFICATIONS|SUMMARY\\s*OF\\s*QUALIFICATIONS|CERTIFICATIONS|LICENSES|CERTIFICATES|AWARDS|HONORS|HONOURS|ACHIEVEMENTS|PUBLICATIONS|RESEARCH|RESEARCH\\s*EXPERIENCE|LEADERSHIP|LEADERSHIP\\s*EXPERIENCE|ACTIVITIES|EXTRACURRICULAR\\s*ACTIVITIES|ACTIVITIES\\s*(?:&|AND)\\s*SKILLS|INVOLVEMENT|CAMPUS\\s*INVOLVEMENT|VOLUNTEER\\s*EXPERIENCE|VOLUNTEERING|COMMUNITY\\s*SERVICE|LANGUAGES|INTERESTS|HOBBIES|PROFILE|PROFESSIONAL\\s*PROFILE|SUMMARY|PROFESSIONAL\\s*SUMMARY|CAREER\\s*SUMMARY|OBJECTIVE|CAREER\\s*OBJECTIVE|PERSONAL\\s*INFORMATION|CONTACT\\s*INFORMATION|ADDITIONAL\\s*INFORMATION|TRAINING))\\s*[::]?\\s*$" - } - ] - }, - { - "levels": [ - { - "expression": "^\\s*(?:\\d+[\\.、\\)]\\s*)?(?:教育背景|教育经历|学历背景|学术背景|技术背景|工作经历|工作经验|实习经历|项目经历|项目经验|科研经历|研究经历|校园经历|实践经历|专业经历|职业经历|技能|专业技能|技能特长|核心技能|技术栈|个人技能|工作技能|职业技能|技能与评价|技能与自我评价|工作技能与自我评价|职业技能与自我评价|证书|资格证书|职业资格|资质证书|获奖情况|获奖经历|荣誉|荣誉奖项|奖项|科研成果|论文发表|发表论文|领导经历|学生工作|校园活动|社团经历|活动经历|志愿经历|志愿服务|社会实践|语言能力|语言|自我评价|个人评价|自我总结|个人总结|个人优势|个人简介|个人信息|基本信息|联系方式|求职意向|应聘意向|职业目标|求职目标|兴趣爱好|兴趣特长|培训经历|其他信息|附加信息)\\s*[::]?\\s*$" - } - ] - } - ] - }, - "label": "TitleChunker", - "name": "Title Chunker_0" - }, - "dragging": false, - "id": "TitleChunker:FlatMiceFix", - "measured": { - "height": 73, - "width": 200 - }, - "position": { - "x": 572.7908769627791, - "y": 141.55515313482098 - }, - "selected": true, - "sourcePosition": "right", - "targetPosition": "left", - "type": "chunkerNode" - }, - { - "data": { - "form": { - "field_name": "metadata", - "frequencyPenaltyEnabled": true, - "frequency_penalty": 0.7, - "llm_id": "THUDM/GLM-4.1V-9B-Thinking@SILICONFLOW", - "maxTokensEnabled": false, - "max_tokens": 256, - "outputs": { - "chunks": { - "type": "Array", - "value": [] - } - }, - "presencePenaltyEnabled": true, - "presence_penalty": 0.4, - "prompts": "Content: {TitleChunker:FlatMiceFix@chunks}", - "sys_prompt": "Act as a precise resume metadata extractor. Extract stable, chunk-supported metadata from the provided resume content.\n\nRules:\n1. Use only information explicitly stated in the content. Do not infer, guess, normalize, or add missing facts.\n2. The input may be only one chunk of a resume. Extract only what this content directly supports.\n3. Use only these field names:\ncandidate_name, gender, phone, email, city, location, nationality, linkedin, github, website, highest_degree, degree_levels, school_names, majors, graduation_years, work_experience_years, current_job_title, job_titles, company_names, job_experience, industries, target_job_titles, target_locations, employment_types, skills, certificates, awards, summary_tags\n4. Ignore detailed responsibilities, project descriptions, achievement narratives, self-evaluation, and other low-value local details.\n5. Keep values in the same language as the source text whenever possible.\n6. Remove duplicates and keep only concise, high-value metadata.\n7. Return only fields that are explicitly supported by the content. Do not return empty or unsupported fields.\n\nField guidance:\n- highest_degree: highest explicit degree level mentioned\n- degree_levels: all explicit degree levels mentioned\n- school_names: explicit school, college, or university names\n- majors: explicit fields of study\n- graduation_years: explicit graduation years only\n- work_experience_years: only if explicitly stated\n- current_job_title: only if explicitly current or most recent\n- job_titles: explicit role titles\n- company_names: explicit employer names\n- job_experience: concise structured work entries explicitly supported by the content, preferably including title, company, and time information when available\n- industries: explicit industry names only\n- target_job_titles: explicit desired roles only\n- target_locations: explicit desired work locations only\n- skills: concise, core, search-useful skills explicitly mentioned\n- certificates: explicit certificate names only\n- awards: explicit award names only\n- summary_tags: short, high-value tags strictly supported by the content\n\nReturn only the extracted metadata. Do not output explanatory text.", - "temperature": 0.1, - "temperatureEnabled": true, - "tenant_llm_id": 29, - "topPEnabled": true, - "top_p": 0.3 - }, - "label": "Extractor", - "name": "Extractor_0" - }, - "dragging": false, - "id": "Extractor:ThreeDrinksAct", - "measured": { - "height": 89, - "width": 200 - }, - "position": { - "x": 623.8123774842874, - "y": 236.49984938595793 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "contextNode" - } - ] - }, - "history": [], - "messages": [], - "path": [], - "retrieval": [], - "variables": [] - }, - "avatar": "data:image/png;base64,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", - "parser_ids": [ - "resume" - ] -} diff --git a/internal/ingestion/pipeline/template_integration_test.go b/internal/ingestion/pipeline/template_integration_test.go index 7fbdb540a3..aa42b84cf1 100644 --- a/internal/ingestion/pipeline/template_integration_test.go +++ b/internal/ingestion/pipeline/template_integration_test.go @@ -36,7 +36,6 @@ import ( "testing" "ragflow/internal/agent/runtime" - "ragflow/internal/common" componentpkg "ragflow/internal/ingestion/component" _ "ragflow/internal/ingestion/component/chunker" "ragflow/internal/ingestion/testutil" @@ -690,102 +689,6 @@ func TestPipelineRun_TemplateBook_RealComponents(t *testing.T) { } } -func TestPipelineRun_TemplateResume_RealComponents(t *testing.T) { - RequireTokenizerPool(t) - apiKey := common.GetEnv(common.EnvOpenAIAPIKey) - baseURL := common.GetEnv(common.EnvOpenAIBaseURL) - model := common.GetEnv(common.EnvOpenAIModel) - if apiKey == "" || baseURL == "" || model == "" { - t.Skip("missing required env (OPENAI_API_KEY/OPENAI_BASE_URL/OPENAI_MODEL); skipping real resume extractor integration test") - } - - templatePath := filepath.Join(repoRootFromPipelineTest(t), "internal", "ingestion", "pipeline", "template", "ingestion_pipeline_resume.json") - templateBytes, err := os.ReadFile(templatePath) - if err != nil { - t.Fatalf("read template: %v", err) - } - terminalIDs := terminalComponentIDsFromTemplate(t, templateBytes) - if len(terminalIDs) != 1 || terminalIDs[0] != "Tokenizer:KindHandsWin" { - t.Fatalf("terminal ids = %v, want [Tokenizer:KindHandsWin]", terminalIDs) - } - - mem := withRealTemplateDeps(t) - componentpkg.SetExtractorChatTargetResolverOverride(func(llmID string) (driver, modelName, apiKeyOut, baseURLOut string, ok bool) { - return "openai", model, apiKey, baseURL, true - }) - t.Cleanup(func() { componentpkg.SetExtractorChatTargetResolverOverride(nil) }) - - const ( - bucket = "test-bucket" - path = "fixtures/template-resume.txt" - filename = "template-resume.txt" - ) - content := strings.Join([]string{ - "PERSONAL INFORMATION", - "", - "John Example", - "Email: john.example@resume.test", - "Phone: +1 555 000 1234", - "City: Seattle", - "", - "EDUCATION", - "", - "Bachelor of Science in Computer Science", - "Example University", - "Graduation Year: 2024", - "", - "WORK EXPERIENCE", - "", - "Software Engineer", - "Example Corp", - "2024 - Present", - "", - "SKILLS", - "", - "Go", - "Python", - "Kubernetes", - }, "\n") - docID := seedTemplateDocument(t, mem, filename, bucket, path, content) - - pipe, err := NewPipelineFromDSL(templateBytes, "template-resume-real") - if err != nil { - t.Fatalf("NewPipelineFromDSL: %v", err) - } - attachFixedEmbedderFactory(t, pipe) - out, err := pipe.Run(context.Background(), map[string]any{ - "doc_id": docID, - "llm_id": model + "@openai", - }, nil) - if err != nil { - t.Fatalf("Run: %v", err) - } - payload := terminalPayloadFromRunOutput(t, out, terminalIDs[0]) - if got := payload["output_format"]; got != "chunks" { - t.Fatalf("output_format = %v, want chunks", got) - } - chunks, ok := payload["chunks"].([]map[string]any) - if !ok || len(chunks) == 0 { - t.Fatalf("chunks = %T/%v, want non-empty []map[string]any", payload["chunks"], payload["chunks"]) - } - - assertExtractedMetadataContains(t, chunks[0]["metadata"], "candidate_name", "John Example") - assertExtractedMetadataContains(t, chunks[0]["metadata"], "email", "john.example@resume.test") - assertExtractedMetadataContains(t, chunks[0]["metadata"], "phone", "+1 555 000 1234") - - state := stateFromRunOutput(t, out) - extractorState, ok := state["Extractor:ThreeDrinksAct"] - if !ok { - t.Fatal("missing Extractor:ThreeDrinksAct state") - } - extractorChunks, ok := extractorState["chunks"].([]map[string]any) - if !ok || len(extractorChunks) == 0 { - t.Fatalf("extractor chunks = %T/%v, want non-empty []map[string]any", extractorState["chunks"], extractorState["chunks"]) - } - assertExtractedMetadataContains(t, extractorChunks[0]["metadata"], "candidate_name", "John Example") - assertExtractedMetadataContains(t, extractorChunks[0]["metadata"], "email", "john.example@resume.test") -} - func TestPipelineRun_AllIngestionTemplates_RealComponentsSmoke(t *testing.T) { RequireTokenizerPool(t) diff --git a/internal/ingestion/task/pipeline_executor_defaults_test.go b/internal/ingestion/task/pipeline_executor_defaults_test.go index 0f2268c4b7..17459f27d4 100644 --- a/internal/ingestion/task/pipeline_executor_defaults_test.go +++ b/internal/ingestion/task/pipeline_executor_defaults_test.go @@ -49,7 +49,6 @@ var builtinComponentParamsGolden = map[string]string{ "picture": "{\"File\": {}, \"Parser:ViewsCaptureLight\": {\"image\": {\"output_format\": \"json\", \"parse_method\": \"ocr\", \"preprocess\": [\"main_content\"], \"suffix\": [\"bmp\", \"gif\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"tif\", \"tiff\", \"webp\"]}, \"video\": {\"output_format\": \"text\", \"preprocess\": [\"main_content\"], \"suffix\": [\"3gp\", \"3gpp\", \"avi\", \"flv\", \"mkv\", \"mov\", \"mp4\", \"mpeg\", \"mpg\", \"webm\", \"wmv\"]}}, \"TokenChunker:BrightColorsGlow\": {}, \"Tokenizer:SharpLensFocus\": {\"fields\": \"text\", \"filename_embd_weight\": 0.1, \"search_method\": [\"embedding\", \"full_text\"]}, \"Extractor:AutoExtractDefault\": {\"field_name\": \"\", \"auto_keywords\": 0, \"auto_questions\": 0, \"llm_id\": \"\", \"auto_tags\": 0, \"enable_metadata\": 0, \"metadata\": [], \"tag_file_id\": \"\"}}", "presentation": "{\"File\": {}, \"Parser:HipSignsRhyme\": {\"pdf\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"pdf\"], \"vlm\": {}}, \"slides\": {\"output_format\": \"json\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"pptx\", \"ppt\"]}}, \"Tokenizer:TallTreesDance\": {\"fields\": \"text\", \"filename_embd_weight\": 0.1, \"search_method\": [\"embedding\", \"full_text\"]}, \"PresentationChunker:HappyHillsGlow\": {}, \"Extractor:AutoExtractDefault\": {\"field_name\": \"\", \"auto_keywords\": 0, \"auto_questions\": 0, \"llm_id\": \"\", \"auto_tags\": 0, \"enable_metadata\": 0, \"metadata\": [], \"tag_file_id\": \"\"}}", "qa": "{\"File\": {}, \"Parser:HipSignsRhyme\": {\"docx\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"docx\"], \"vlm\": {}}, \"markdown\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"md\", \"markdown\", \"mdx\"], \"vlm\": {}}, \"pdf\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"pdf\"], \"vlm\": {}}, \"spreadsheet\": {\"flatten_media_to_text\": false, \"output_format\": \"html\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"xls\", \"xlsx\", \"csv\"], \"vlm\": {}}, \"text&code\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"txt\"]}}, \"Tokenizer:ColdCloudsDream\": {\"fields\": \"text\", \"filename_embd_weight\": 0.1, \"search_method\": [\"embedding\", \"full_text\"]}, \"QAChunker:TidyCloudsThink\": {}}", - "resume": "{\"Extractor:ThreeDrinksAct\": {\"field_name\": \"metadata\", \"frequencyPenaltyEnabled\": true, \"frequency_penalty\": 0.7, \"llm_id\": \"THUDM/GLM-4.1V-9B-Thinking@SILICONFLOW\", \"maxTokensEnabled\": false, \"max_tokens\": 256, \"presencePenaltyEnabled\": true, \"presence_penalty\": 0.4, \"prompts\": [{\"content\": \"Content: {TitleChunker:FlatMiceFix@chunks}\", \"role\": \"user\"}], \"sys_prompt\": \"Act as a precise resume metadata extractor. Extract stable, chunk-supported metadata from the provided resume content.\\n\\nRules:\\n1. Use only information explicitly stated in the content. Do not infer, guess, normalize, or add missing facts.\\n2. The input may be only one chunk of a resume. Extract only what this content directly supports.\\n3. Use only these field names:\\ncandidate_name, gender, phone, email, city, location, nationality, linkedin, github, website, highest_degree, degree_levels, school_names, majors, graduation_years, work_experience_years, current_job_title, job_titles, company_names, job_experience, industries, target_job_titles, target_locations, employment_types, skills, certificates, awards, summary_tags\\n4. Ignore detailed responsibilities, project descriptions, achievement narratives, self-evaluation, and other low-value local details.\\n5. Keep values in the same language as the source text whenever possible.\\n6. Remove duplicates and keep only concise, high-value metadata.\\n7. Return only fields that are explicitly supported by the content. Do not return empty or unsupported fields.\\n\\nField guidance:\\n- highest_degree: highest explicit degree level mentioned\\n- degree_levels: all explicit degree levels mentioned\\n- school_names: explicit school, college, or university names\\n- majors: explicit fields of study\\n- graduation_years: explicit graduation years only\\n- work_experience_years: only if explicitly stated\\n- current_job_title: only if explicitly current or most recent\\n- job_titles: explicit role titles\\n- company_names: explicit employer names\\n- job_experience: concise structured work entries explicitly supported by the content, preferably including title, company, and time information when available\\n- industries: explicit industry names only\\n- target_job_titles: explicit desired roles only\\n- target_locations: explicit desired work locations only\\n- skills: concise, core, search-useful skills explicitly mentioned\\n- certificates: explicit certificate names only\\n- awards: explicit award names only\\n- summary_tags: short, high-value tags strictly supported by the content\\n\\nReturn only the extracted metadata. Do not output explanatory text.\", \"temperature\": 0.1, \"temperatureEnabled\": true, \"tenant_llm_id\": 29, \"topPEnabled\": true, \"top_p\": 0.3, \"auto_keywords\": 0, \"auto_questions\": 0, \"auto_tags\": 0, \"enable_metadata\": 0, \"metadata\": [], \"tag_file_id\": \"\"}, \"File\": {}, \"Parser:HipSignsRhyme\": {\"docx\": {\"flatten_media_to_text\": true, \"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"docx\"], \"vlm\": {}}, \"pdf\": {\"flatten_media_to_text\": true, \"output_format\": \"json\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"pdf\"], \"vlm\": {}}, \"text&code\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"txt\"]}}, \"TitleChunker:FlatMiceFix\": {\"hierarchy\": 1, \"include_heading_content\": false, \"levels\": [[\"^\\\\s*(?i:(?:\\\\d+[\\\\.\\\\)]\\\\s*)?(?:EDUCATION|ACADEMIC\\\\s*BACKGROUND|ACADEMIC\\\\s*HISTORY|EDUCATIONAL\\\\s*BACKGROUND|RELEVANT\\\\s*COURSEWORK|COURSEWORK|EXPERIENCE|WORK\\\\s*EXPERIENCE|PROFESSIONAL\\\\s*EXPERIENCE|RELEVANT\\\\s*EXPERIENCE|EMPLOYMENT\\\\s*HISTORY|CAREER\\\\s*HISTORY|INTERNSHIP\\\\s*EXPERIENCE|PROJECTS|PROJECT\\\\s*EXPERIENCE|ACADEMIC\\\\s*PROJECTS|PROFESSIONAL\\\\s*PROJECTS|SKILLS|TECHNICAL\\\\s*SKILLS|CORE\\\\s*COMPETENCIES|COMPETENCIES|QUALIFICATIONS|SUMMARY\\\\s*OF\\\\s*QUALIFICATIONS|CERTIFICATIONS|LICENSES|CERTIFICATES|AWARDS|HONORS|HONOURS|ACHIEVEMENTS|PUBLICATIONS|RESEARCH|RESEARCH\\\\s*EXPERIENCE|LEADERSHIP|LEADERSHIP\\\\s*EXPERIENCE|ACTIVITIES|EXTRACURRICULAR\\\\s*ACTIVITIES|ACTIVITIES\\\\s*(?:&|AND)\\\\s*SKILLS|INVOLVEMENT|CAMPUS\\\\s*INVOLVEMENT|VOLUNTEER\\\\s*EXPERIENCE|VOLUNTEERING|COMMUNITY\\\\s*SERVICE|LANGUAGES|INTERESTS|HOBBIES|PROFILE|PROFESSIONAL\\\\s*PROFILE|SUMMARY|PROFESSIONAL\\\\s*SUMMARY|CAREER\\\\s*SUMMARY|OBJECTIVE|CAREER\\\\s*OBJECTIVE|PERSONAL\\\\s*INFORMATION|CONTACT\\\\s*INFORMATION|ADDITIONAL\\\\s*INFORMATION|TRAINING))\\\\s*[::]?\\\\s*$\"], [\"^\\\\s*(?:\\\\d+[\\\\.、\\\\)]\\\\s*)?(?:教育背景|教育经历|学历背景|学术背景|技术背景|工作经历|工作经验|实习经历|项目经历|项目经验|科研经历|研究经历|校园经历|实践经历|专业经历|职业经历|技能|专业技能|技能特长|核心技能|技术栈|个人技能|工作技能|职业技能|技能与评价|技能与自我评价|工作技能与自我评价|职业技能与自我评价|证书|资格证书|职业资格|资质证书|获奖情况|获奖经历|荣誉|荣誉奖项|奖项|科研成果|论文发表|发表论文|领导经历|学生工作|校园活动|社团经历|活动经历|志愿经历|志愿服务|社会实践|语言能力|语言|自我评价|个人评价|自我总结|个人总结|个人优势|个人简介|个人信息|基本信息|联系方式|求职意向|应聘意向|职业目标|求职目标|兴趣爱好|兴趣特长|培训经历|其他信息|附加信息)\\\\s*[::]?\\\\s*$\"]], \"method\": \"hierarchy\"}, \"Tokenizer:KindHandsWin\": {\"fields\": \"text\", \"filename_embd_weight\": 0.1, \"search_method\": [\"embedding\", \"full_text\"]}}", "table": "{\"File\": {}, \"Parser:HipSignsRhyme\": {\"spreadsheet\": {\"flatten_media_to_text\": false, \"output_format\": \"html\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"xls\", \"xlsx\", \"csv\"], \"vlm\": {}, \"column_mode\": \"auto\", \"column_roles\": {}, \"column_names\": []}, \"text&code\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"txt\"]}}, \"TableChunker:FastFoxesJump\": {}, \"Tokenizer:DeepLakesShine\": {\"fields\": \"text\", \"filename_embd_weight\": 0.1, \"search_method\": [\"embedding\", \"full_text\"]}}", "knowledge_compiler": "{\"File\": {}, \"Compiler:KnownSwiftLions\": {\"compilation_template_group_id\": \"\", \"llm_id\": \"\", \"plan\": false}, \"Parser:HipSignsRhyme\": {\"setups\": {\"doc\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"doc\"]}, \"docx\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"docx\"], \"vlm\": {}}, \"html\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"htm\", \"html\"]}, \"markdown\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"md\", \"markdown\", \"mdx\"], \"vlm\": {}}, \"pdf\": {\"flatten_media_to_text\": false, \"output_format\": \"json\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"pdf\"], \"vlm\": {}}, \"spreadsheet\": {\"flatten_media_to_text\": false, \"output_format\": \"html\", \"parse_method\": \"DeepDOC\", \"preprocess\": [\"main_content\"], \"suffix\": [\"xls\", \"xlsx\", \"csv\"], \"vlm\": {}}, \"text&code\": {\"output_format\": \"json\", \"preprocess\": [\"main_content\"], \"suffix\": [\"txt\", \"py\", \"js\", \"java\", \"c\", \"cpp\", \"h\", \"php\", \"go\", \"ts\", \"sh\", \"cs\", \"kt\", \"sql\"]}}}, \"TokenChunker:SixApplesFall\": {\"children_delimiters\": [], \"chunk_token_size\": 512, \"delimiter_mode\": \"delimiter\", \"delimiters\": [\"\\n\", \"!\", \"?\", \"。\", \";\", \"!\", \"?\"], \"image_context_size\": 0, \"overlapped_percent\": 0, \"table_context_size\": 0}}", } @@ -72,9 +71,8 @@ func TestBuildComponentParams_Picture(t *testing.T) { assertTemplateComponentPar func TestBuildComponentParams_Presentation(t *testing.T) { assertTemplateComponentParams(t, "presentation") } -func TestBuildComponentParams_Qa(t *testing.T) { assertTemplateComponentParams(t, "qa") } -func TestBuildComponentParams_Resume(t *testing.T) { assertTemplateComponentParams(t, "resume") } -func TestBuildComponentParams_Table(t *testing.T) { assertTemplateComponentParams(t, "table") } +func TestBuildComponentParams_Qa(t *testing.T) { assertTemplateComponentParams(t, "qa") } +func TestBuildComponentParams_Table(t *testing.T) { assertTemplateComponentParams(t, "table") } // assertTemplateComponentParams resolves the default component params for the // given built-in template and verifies two layers per-component: diff --git a/internal/service/user.go b/internal/service/user.go index b23139547c..a312c9e6c4 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -203,7 +203,7 @@ func (s *UserService) Register(ctx context.Context, req *RegisterRequest) (*enti RerankID: rerankID, TTSID: &ttsID, OCRID: &ocrID, - ParserIDs: "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Research Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email,tag:Tag", + ParserIDs: "naive:General,qa:Q&A,manual:Manual,table:Table,paper:Research Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email,tag:Tag", Status: &status, } userTenantID := utility.GenerateToken()