From 4c851735a443c72aea5cc439402c31fcc1cf0808 Mon Sep 17 00:00:00 2001 From: Abirdcfly Date: Tue, 16 Jan 2024 16:10:03 +0800 Subject: [PATCH] fix: update qa.csv col Signed-off-by: Abirdcfly --- apiserver/docs/docs.go | 23 +++- apiserver/docs/swagger.json | 23 +++- apiserver/docs/swagger.yaml | 20 +++- controllers/base/knowledgebase_controller.go | 2 +- .../retriever/knowledgebaseretriever.go | 74 ++++++++++--- pkg/documentloaders/qa_csv.go | 100 +++++++++++++----- pkg/documentloaders/qa_csv_test.go | 27 +++-- pkg/documentloaders/testdata/qa.csv | 36 ++----- pkg/evaluation/evaluation.go | 2 +- pkg/vectorstore/pgvector.go | 5 - tests/example-test.sh | 2 +- 11 files changed, 217 insertions(+), 97 deletions(-) diff --git a/apiserver/docs/docs.go b/apiserver/docs/docs.go index cb3966277..84c965d45 100644 --- a/apiserver/docs/docs.go +++ b/apiserver/docs/docs.go @@ -1173,13 +1173,28 @@ const docTemplate = `{ "type": "string", "example": "旷工最小计算单位为 0.5 天。" }, - "file_path": { - "description": "file fullpath", + "content": { + "description": "related content in the source file", + "type": "string", + "example": "旷工最小计算单位为0.5天,不足0.5天以0.5天计算,超过0.5天不满1天以1天计算,以此类推。" + }, + "file_name": { + "description": "source file name, only file name, not full path", + "type": "string", + "example": "员工考勤管理制度-2023.pdf" + }, + "page_number": { + "description": "page number in the source file", + "type": "integer", + "example": 1 + }, + "qa_file_path": { + "description": "the qa file fullpath", "type": "string", "example": "dataset/dataset-playground/v1/qa.csv" }, - "line_number": { - "description": "line number in the file", + "qa_line_number": { + "description": "line number in the qa file", "type": "integer", "example": 7 }, diff --git a/apiserver/docs/swagger.json b/apiserver/docs/swagger.json index 7cd1cf385..83ee95fc0 100644 --- a/apiserver/docs/swagger.json +++ b/apiserver/docs/swagger.json @@ -1162,13 +1162,28 @@ "type": "string", "example": "旷工最小计算单位为 0.5 天。" }, - "file_path": { - "description": "file fullpath", + "content": { + "description": "related content in the source file", + "type": "string", + "example": "旷工最小计算单位为0.5天,不足0.5天以0.5天计算,超过0.5天不满1天以1天计算,以此类推。" + }, + "file_name": { + "description": "source file name, only file name, not full path", + "type": "string", + "example": "员工考勤管理制度-2023.pdf" + }, + "page_number": { + "description": "page number in the source file", + "type": "integer", + "example": 1 + }, + "qa_file_path": { + "description": "the qa file fullpath", "type": "string", "example": "dataset/dataset-playground/v1/qa.csv" }, - "line_number": { - "description": "line number in the file", + "qa_line_number": { + "description": "line number in the qa file", "type": "integer", "example": 7 }, diff --git a/apiserver/docs/swagger.yaml b/apiserver/docs/swagger.yaml index 222c827c3..de9d73469 100644 --- a/apiserver/docs/swagger.yaml +++ b/apiserver/docs/swagger.yaml @@ -182,12 +182,24 @@ definitions: description: Answer row example: 旷工最小计算单位为 0.5 天。 type: string - file_path: - description: file fullpath + content: + description: related content in the source file + example: 旷工最小计算单位为0.5天,不足0.5天以0.5天计算,超过0.5天不满1天以1天计算,以此类推。 + type: string + file_name: + description: source file name, only file name, not full path + example: 员工考勤管理制度-2023.pdf + type: string + page_number: + description: page number in the source file + example: 1 + type: integer + qa_file_path: + description: the qa file fullpath example: dataset/dataset-playground/v1/qa.csv type: string - line_number: - description: line number in the file + qa_line_number: + description: line number in the qa file example: 7 type: integer question: diff --git a/controllers/base/knowledgebase_controller.go b/controllers/base/knowledgebase_controller.go index f2152d1f9..a374480e4 100644 --- a/controllers/base/knowledgebase_controller.go +++ b/controllers/base/knowledgebase_controller.go @@ -457,7 +457,7 @@ func (r *KnowledgeBaseReconciler) handleFile(ctx context.Context, log logr.Logge loader = documentloaders.NewText(dataReader) case ".csv": if v == arcadiav1alpha1.ObjectTypeQA { - loader = pkgdocumentloaders.NewQACSV(dataReader, fileName, "q", "a") + loader = pkgdocumentloaders.NewQACSV(dataReader, fileName) documents, err = loader.Load(ctx) if err != nil { return err diff --git a/pkg/appruntime/retriever/knowledgebaseretriever.go b/pkg/appruntime/retriever/knowledgebaseretriever.go index da244e32d..ab58fe252 100644 --- a/pkg/appruntime/retriever/knowledgebaseretriever.go +++ b/pkg/appruntime/retriever/knowledgebaseretriever.go @@ -36,6 +36,7 @@ import ( apiretriever "github.com/kubeagi/arcadia/api/app-node/retriever/v1alpha1" "github.com/kubeagi/arcadia/api/base/v1alpha1" "github.com/kubeagi/arcadia/pkg/appruntime/base" + "github.com/kubeagi/arcadia/pkg/documentloaders" "github.com/kubeagi/arcadia/pkg/langchainwrap" pkgvectorstore "github.com/kubeagi/arcadia/pkg/vectorstore" ) @@ -47,10 +48,16 @@ type Reference struct { Answer string `json:"answer" example:"旷工最小计算单位为 0.5 天。"` // vector search score Score float32 `json:"score" example:"0.34"` - // file fullpath - FilePath string `json:"file_path" example:"dataset/dataset-playground/v1/qa.csv"` - // line number in the file - LineNumber int `json:"line_number" example:"7"` + // the qa file fullpath + QAFilePath string `json:"qa_file_path" example:"dataset/dataset-playground/v1/qa.csv"` + // line number in the qa file + QALineNumber int `json:"qa_line_number" example:"7"` + // source file name, only file name, not full path + FileName string `json:"file_name" example:"员工考勤管理制度-2023.pdf"` + // page number in the source file + PageNumber int `json:"page_number" example:"1"` + // related content in the source file + Content string `json:"content" example:"旷工最小计算单位为0.5天,不足0.5天以0.5天计算,超过0.5天不满1天以1天计算,以此类推。"` } func (reference Reference) String() string { @@ -177,23 +184,62 @@ func (c *KnowledgeBaseStuffDocuments) joinDocuments(ctx context.Context, docs [] logger.V(3).Info(fmt.Sprintf("KnowledgeBaseRetriever: related doc[%d] metadata[%s]: %#v\n", k, key, v)) } } - answer, _ := doc.Metadata["a"].([]byte) + // chroma will get []byte, pgvector will get string... + answer, ok := doc.Metadata[documentloaders.AnswerCol].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.AnswerCol].([]byte); ok { + answer = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } + text += doc.PageContent if len(answer) != 0 { - text = text + "\na: " + strings.TrimPrefix(strings.TrimSuffix(string(answer), "\""), "\"") + text = text + "\na: " + answer } if k != docLen-1 { text += c.Separator } - filepath, _ := doc.Metadata["fileName"].([]byte) - lineNumber, _ := doc.Metadata["lineNumber"].([]byte) - line, _ := strconv.Atoi(string(lineNumber)) + qafilepath, ok := doc.Metadata[documentloaders.QAFileName].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.QAFileName].([]byte); ok { + qafilepath = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } + lineNumber, ok := doc.Metadata[documentloaders.LineNumber].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.LineNumber].([]byte); ok { + lineNumber = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } + line, _ := strconv.Atoi(lineNumber) + filename, ok := doc.Metadata[documentloaders.FileNameCol].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.FileNameCol].([]byte); ok { + filename = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } + pageNumber, ok := doc.Metadata[documentloaders.PageNumberCol].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.PageNumberCol].([]byte); ok { + pageNumber = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } + page, _ := strconv.Atoi(pageNumber) + content, ok := doc.Metadata[documentloaders.ChunkContentCol].(string) + if !ok { + if a, ok := doc.Metadata[documentloaders.ChunkContentCol].([]byte); ok { + content = strings.TrimPrefix(strings.TrimSuffix(string(a), "\""), "\"") + } + } c.References = append(c.References, Reference{ - Question: doc.PageContent, - Answer: strings.TrimPrefix(strings.TrimSuffix(string(answer), "\""), "\""), - Score: doc.Score, - FilePath: strings.TrimPrefix(strings.TrimSuffix(string(filepath), "\""), "\""), - LineNumber: line, + Question: doc.PageContent, + Answer: answer, + Score: doc.Score, + QAFilePath: qafilepath, + QALineNumber: line, + FileName: filename, + PageNumber: page, + Content: content, }) } logger.V(3).Info(fmt.Sprintf("KnowledgeBaseRetriever: finally get related text: %s\n", text)) diff --git a/pkg/documentloaders/qa_csv.go b/pkg/documentloaders/qa_csv.go index 872af964f..9db66ab97 100644 --- a/pkg/documentloaders/qa_csv.go +++ b/pkg/documentloaders/qa_csv.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io" + "strconv" "strings" "github.com/tmc/langchaingo/documentloaders" @@ -13,30 +14,73 @@ import ( "github.com/tmc/langchaingo/textsplitter" ) +const ( + QuestionCol = "q" + AnswerCol = "a" + FileNameCol = "file_name" + PageNumberCol = "page_number" + ChunkContentCol = "chunk_content" + LineNumber = "line_number" + QAFileName = "qafile_name" +) + // QACSV represents a QA CSV document loader. type QACSV struct { - r io.Reader - fileName string - questionColumn string - answerColumn string + r io.Reader + fileName string + questionColumn string + answerColumn string + fileNameColumn string + pageNumberColumn string + chunkContentColumn string } var _ documentloaders.Loader = QACSV{} -// NewQACSV creates a new qa csv loader with an io.Reader and optional column names for filtering. -func NewQACSV(r io.Reader, fileName string, questionColumn string, answerColumn string) QACSV { - if questionColumn == "" { - questionColumn = "q" +// Option is a function type that can be used to modify the client. +type Option func(p *QACSV) + +func WithQuestionColumn(s string) Option { + return func(p *QACSV) { + p.questionColumn = s + } +} +func WithAnswerColumn(s string) Option { + return func(p *QACSV) { + p.answerColumn = s + } +} +func WithFileNameColumn(s string) Option { + return func(p *QACSV) { + p.fileNameColumn = s + } +} +func WithPageNumberColumn(s string) Option { + return func(p *QACSV) { + p.pageNumberColumn = s } - if answerColumn == "" { - answerColumn = "a" +} +func WithChunkContentColumn(s string) Option { + return func(p *QACSV) { + p.chunkContentColumn = s } - return QACSV{ - r: r, - fileName: fileName, - questionColumn: questionColumn, - answerColumn: answerColumn, +} + +// NewQACSV creates a new qa csv loader with an io.Reader and optional column names for filtering. +func NewQACSV(r io.Reader, fileName string, opts ...Option) QACSV { + q := QACSV{ + r: r, + fileName: fileName, + questionColumn: QuestionCol, + answerColumn: AnswerCol, + fileNameColumn: FileNameCol, + pageNumberColumn: PageNumberCol, + chunkContentColumn: ChunkContentCol, } + for _, opt := range opts { + opt(&q) + } + return q } // Load reads from the io.Reader and returns a single document with the data. @@ -44,6 +88,7 @@ func (c QACSV) Load(_ context.Context) ([]schema.Document, error) { var header []string var docs []schema.Document var rown int + cols := []string{c.questionColumn, c.answerColumn, c.fileNameColumn, c.pageNumberColumn, c.chunkContentColumn} rd := csv.NewReader(c.r) for { @@ -58,22 +103,23 @@ func (c QACSV) Load(_ context.Context) ([]schema.Document, error) { header = append(header, row...) continue } - doc := schema.Document{} + doc.Metadata = make(map[string]any, len(cols)-1) for i, value := range row { - if c.questionColumn != "" && header[i] != c.questionColumn && header[i] != c.answerColumn { - continue - } value = strings.TrimSpace(value) - if header[i] == c.questionColumn { + switch header[i] { + case c.questionColumn: doc.PageContent = fmt.Sprintf("%s: %s", header[i], value) - } - if header[i] == c.answerColumn { - doc.Metadata = map[string]any{ - c.answerColumn: value, - "fileName": c.fileName, - "lineNumber": rown, - } + case c.answerColumn: + doc.Metadata[AnswerCol] = value + doc.Metadata[QAFileName] = c.fileName + doc.Metadata[LineNumber] = strconv.Itoa(rown) + case c.pageNumberColumn: + doc.Metadata[PageNumberCol] = value + case c.fileNameColumn: + doc.Metadata[FileNameCol] = value + case c.chunkContentColumn: + doc.Metadata[ChunkContentCol] = value } } rown++ diff --git a/pkg/documentloaders/qa_csv_test.go b/pkg/documentloaders/qa_csv_test.go index 28ead8a2b..81d796478 100644 --- a/pkg/documentloaders/qa_csv_test.go +++ b/pkg/documentloaders/qa_csv_test.go @@ -15,29 +15,36 @@ func TestCSVLoader(t *testing.T) { file, err := os.Open(fileName) assert.NoError(t, err) - loader := NewQACSV(file, fileName, "q", "a") + loader := NewQACSV(file, fileName) docs, err := loader.Load(context.Background()) require.NoError(t, err) - require.Len(t, docs, 25) + require.Len(t, docs, 9) - expected1PageContent := "q: 什么是员工考勤管理制度?" + expectedFileName := "员工考勤管理制度-2023.pdf" + expected1PageContent := "q: 员工在病假期间,是否有额外的假期?" assert.Equal(t, docs[0].PageContent, expected1PageContent) expected1Metadata := map[string]any{ - "a": "该制度旨在严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据。", - "fileName": fileName, - "lineNumber": 0, + AnswerCol: "无法确定,题目未提及。", + QAFileName: fileName, + LineNumber: "0", + FileNameCol: expectedFileName, + ChunkContentCol: "3员工请假时间小于等于2天,由直接上级、部门负责人审批,人力资源部备案;员工请假时间大于等于3天,依次由直接上级、部门负责人、公司管理层审批,人力资源部备案。二.事假1、申请事假须至少提前1天在钉钉上发起请假申请,经直属领导逐级审批通过后,抄送人力资源部备案。事假最小计算单位为0.5天,不足0.5天以0.5天计算,以此类推。2、如遇特殊情况未能事前申请,须于当日10:00前电话或其他有效方式告知直属上级和人力资源部,且在事后1日内在钉钉补充完成事假申请审批手续。3、事假理由不充分或有碍工作进度,公司可不予准假。一年内累计不能超过20天。事假扣除事假相应天数工资,期间无其他奖金、福利和补助。三.病假1、因病不能正常上班,需病假者。病假申请(急诊、门诊)审批要求和流程同事假审批,2天以上(含2天)病假需提供医院有效的病假证明。2、一年享有3天带薪病假。若3<正常病假天数≤60,日工资按合同工资50%计算;正常病假累计天数>", + PageNumberCol: "3", } assert.Equal(t, docs[0].Metadata, expected1Metadata) - expected2PageContent := "q: 该制度适用于哪些员工?" + expected2PageContent := "q: 公司的考勤管理制度适用于哪些人员?" assert.Equal(t, docs[1].PageContent, expected2PageContent) expected2Metadata := map[string]any{ - "a": "适用于公司全体正式员工及实习生。", - "fileName": fileName, - "lineNumber": 1, + AnswerCol: "公司全体正式员工及实习生。", + QAFileName: fileName, + LineNumber: "1", + FileNameCol: expectedFileName, + ChunkContentCol: "1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。", + PageNumberCol: "1", } assert.Equal(t, docs[1].Metadata, expected2Metadata) } diff --git a/pkg/documentloaders/testdata/qa.csv b/pkg/documentloaders/testdata/qa.csv index 7cba9ad49..da8a56f76 100644 --- a/pkg/documentloaders/testdata/qa.csv +++ b/pkg/documentloaders/testdata/qa.csv @@ -1,26 +1,10 @@ -q,a -什么是员工考勤管理制度?,该制度旨在严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据。 -该制度适用于哪些员工?,适用于公司全体正式员工及实习生。 -该制度的目的是什么?,为了规范公司考勤管理,提高工作效率,严格工作纪律,并为公司考勤管理提供明确依据。 -该制度使用范围包括哪些员工?,1、公司全体正式员工及实习生;2、员工应严格遵守工作律及考勤规章制度;3、各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行;4、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。 -考勤时间是如何规定的?,1)公司执行五天弹性工作制,上班时间为 9:00-9:30,下班时间为 18:00-18:30,中午 12:00-13:00 为午休时间,不计入工作时间;每天工作时间不少于 8 小时;2)公司考虑交通通勤情况,每天上班给予 10 分钟延迟;9:40 后为迟到打卡,每月最多迟到 3 次(不晚于 10:00),超出则视为旷工;晚于 10:00 打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走 2 小时,第二天打卡时间不晚于上午 10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 -员工因工作需要外出的需如何申请?,需在钉钉提交《外出申请》审批。 -员工因工作需要出差的需如何申请?,需在互联 ERP 系统提交《出差申请》审批。 -什么是旷工?,旷工指未请假或请假未批准而擅自不上班或离岗者,不服从调动和工作分配,未按时到岗报到者;请假期限已满未续假或续假未批准而逾期不归者;有证据证明请假原因不属实、伪造或骗取请假、休假证件者;未按离职规定程序履行离职申请、审批,经要求仍拒不履行离职规定程序而擅自离岗者;因打架、斗殴致伤而不能上班者,且对无故被打伤的员工,其养伤期间的工资和医疗费用,经公安部门或保安部门裁决,由肇事者负责;在事假期间进行非法活动或进行有损公司利益、名誉的行为者;未经部门直接领导批准而擅自不按时到岗或离岗超过 2 小时的(包括但不限于上班时离岗、做与工作无关的活儿、拒绝工作及公司相关制度规定的其他情形),将视为旷工,未在岗位达 2 小时以上,4 小时以内的,按照旷工 0.5 天计算,达 4 小时及以上的,按照旷工一天计算;未按照考勤时间和制度打卡及上下班考勤漏打卡逾期未补者。 -旷工有哪些处罚措施?,1)扣除旷工相应天数工资的 100%,直接影响其所有考核成绩;2)连续旷工 2 天(含)或任意一年(非自然年)跨度期间内累计旷工达 3 天(含)以上,视为重大违纪行为,公司有权即时解除劳动关系,不给予任何经济补偿。 -旷工最小计算单位为多少天?,旷工最小计算单位为 0.5 天。 -审批权限、请假类别及处理办法一共有多少个主题内容?,10 个主题内容。 -审批权限的具体内容是什么?,员工请假时间小于等于 2 天,由直接上级、部门负责人审批,人力资源部备案;员工请假时间大于等于 3 天,依次由直接上级、部门负责人、公司管理层审批,人力资源部备案。 -请假类别包括哪些?,事假、病假、婚假、产假、陪产假、流产假、男女员工节育假期。 -事假申请需要满足什么条件?,申请事假须至少提前 1 天在钉钉上发起请假申请,经直属领导逐级审批通过后,抄送人力资源部备案。事假最小计算单位为 0.5 天,不足 0.5 天以 0.5 天计算,以此类推。 -什么情况下公司不会准假病假?,病假理由不充分或有碍工作进度,公司可不予准假。一年内累计不能超过 20 天。病假扣除事假相应天数工资,期间无其他奖金、福利和补助。 -婚假的具体内容是什么?,员工通过试用期考核,转正后可享受 10 天婚假,婚假按国家规定必须为连续不间断计算,一次休完,包括法定节假日和双休日。员工婚假必须是进入本公司后注册结婚且在注册日起 1 年内申请,逾期视为放弃婚假权利。注:如国家政策有变,按最新政策执行,不再另行约定。 -产假的具体内容是什么?,符合国家计划生育条例规定的女员工依法享受相应产假,在产前 15 天开始计入产假。配偶生育的给予男员工相应陪产假。2、孕期女员工在工作时间内进行产前检查必须提供政府计生部门出具的准生证明原件及当地区级或二级以上医院开具的产检证明,则视同出勤,产检假期如下:怀孕第 1-6 个月,每个月可享受 1 天假期;怀孕第 7-8 个月,每月可享受 2 天假期;怀孕 9 个月以上,每月可享受 4 天假期,但其中 2 天已包括在预产假中。产检假提前至少 1 天在钉钉申请。3、女员工申请产假前须提供准生证明原件,提前至少 3 天在钉钉申请产假,人力资源部审核确认并存档。在产后 90 天内将婴儿出生证明原件及其他证明原件交至人力资源部,以便核实具体产假时间及办理相关生育费用报销手续。4、女员工在婴儿 1 周岁以前,公司给予其每天 1 小时的哺乳时间,对于生育多胞胎的,每多 1 个婴儿每天增加 1 小时哺乳时间。具体时间须提前与直属上级和部门负责人协商,报人力资源部审核确认并存档。5、男员工申请陪产假必须提供婴儿出生证明原件和结婚证原件,自婴儿出生后 2 个月内休完,逾期视其自动放弃休假,且公司不予任何形式补偿。试用期男员工陪产假需转正后方可申请。6、产假、产检假、陪产假、流产、男女员工节育假期按国家规定必须为连续不间断计算,均包括法定节假日和双休日。产假及相关衍生假期间按照不低于当地最低工资标准发放工资,待生育津贴报销后补齐差额,不计发其他奖金福利补助。7、违反国家计划生育条例规定的女员工不享受产假与产检假期间的工资待遇及其他奖金福利补助,期间按事假规定处理,且自行承担生育等费用。 -丧假的具体内容是什么?,员工直系亲属(父母、配偶、子女、配偶父母)丧亡,可申请丧假 3 天。非直系亲属(祖父母、外祖父母、兄弟姐妹)丧亡,可申请丧假 1 天。丧假必须为连续不间断计算。员工申请丧假在钉钉流程申请丧假,丧假期间全额发放工资,不计发其他奖金福利补助。 -年假的具体内容是什么?,员工转正后享有 5 天及以上带薪年假(具体年假基数见下表)。此后司龄每增加一年,年假增加一天,最多 10 天。新入职员工,当年度(均指公历自然年度)年假天数按照员工在本公司已服务日历天数折算确定,计算方法为:(本公司工作日历天数÷365 天)×应享受的年假天 -什么是人力资源部对于申请的带薪假期的最终审核权?,人力资源部对于申请的所有带薪假期(调休、年假、法定节假日、婚假、产假、产检假、陪产假、丧假)具有最终审核权,根据所有带薪假期提供的相应证明原件审核带薪假期资格,审核未通过将做普通事假处理。 -如果在审核带薪假期资格时,发现相关证明原件可能为伪造虚报,公司会有什么处理?,一经查证,作旷工处理,情节严重者给予内部严重警告,将全公司发通告,将视情节恶劣程度,最高给予开除处理,且不承担任何经济补偿。 -试用期员工在试用期间需要达到多少出勤率?,试用期员工在试用期间出勤率必须达到 95% 及以上,否则视为不符合岗位录用条件,公司有权即时解除劳动关系,终止劳动合同。 -如果试用期员工因特殊情况请假累计超过 5 天,需要提出什么申请?,员工须提出书面情况说明,申请获批后与公司协商变更试用期周期及出勤率方可请假。 -本制度从什么时间开始生效执行?,本制度从 2023 年 5 月 1 日起生效执行。 -本制度由哪个部门负责解释及修订?,本制度由人力资源部负责解释及修订,未尽事宜另行通知说明。 +q,a,file_name,page_number,chunk_content +员工在病假期间,是否有额外的假期?,无法确定,题目未提及。,员工考勤管理制度-2023.pdf,3,3员工请假时间小于等于2天,由直接上级、部门负责人审批,人力资源部备案;员工请假时间大于等于3天,依次由直接上级、部门负责人、公司管理层审批,人力资源部备案。二.事假1、申请事假须至少提前1天在钉钉上发起请假申请,经直属领导逐级审批通过后,抄送人力资源部备案。事假最小计算单位为0.5天,不足0.5天以0.5天计算,以此类推。2、如遇特殊情况未能事前申请,须于当日10:00前电话或其他有效方式告知直属上级和人力资源部,且在事后1日内在钉钉补充完成事假申请审批手续。3、事假理由不充分或有碍工作进度,公司可不予准假。一年内累计不能超过20天。事假扣除事假相应天数工资,期间无其他奖金、福利和补助。三.病假1、因病不能正常上班,需病假者。病假申请(急诊、门诊)审批要求和流程同事假审批,2天以上(含2天)病假需提供医院有效的病假证明。2、一年享有3天带薪病假。若3<正常病假天数≤60,日工资按合同工资50%计算;正常病假累计天数> +公司的考勤管理制度适用于哪些人员?,公司全体正式员工及实习生。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +员工应该遵守哪些考勤规章制度?,严格遵守工作律及考勤规章制度。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +各部门负责人在考勤管理方面有哪些权利和义务?,审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +公司的考勤时间是如何规定的?,执行五天弹性工作制,上班时间为 9:00-9:30,下班时间为 18:00-18:30,中午 12:00-13:00 为午休时间,不计入工作时间;每天工作时间不少于 8 小时。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +公司对考勤的延迟是如何规定的?,公司考虑交通通勤情况,每天上班给予 10 分钟延迟;9:40 后为迟到打卡,每月最多迟到 3 次(不晚于 10:00),超出则视为旷工;晚于 10:00 打卡且无正当理由,视为旷工半天。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +如果员工因工作原因下班晚走,会对考勤产生什么影响?,第二天打卡时间不晚于上午 10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +公司的考勤管理制度是否有相关法律法规的依据?,是的,根据国家及当地地区相关法律法规制定的。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 +考勤管理制度适用于公司的实习生吗?,是的,适用于公司全体正式员工及实习生。,员工考勤管理制度-2023.pdf,1,1第一章总则一、目的为了严格工作纪律、提高工作效率,规范公司考勤管理,为公司考勤管理提供明确依据,现根据国家及当地地区相关法律法规,特制定本制度。二、使用范围1、本制度适用公司全体正式员工及实习生。2、员工应严格遵守工作律及考勤规章制度。各部门负责人在权限范围内有审批部门员工考勤记录的权利和严肃考勤纪律的义务,并以身作则,规范执行。3、人力资源部负责考勤信息的记录、汇总,监督考勤制度的执行。第二章工时制度及考勤方式1、考勤时间:1)公司执行五天弹性工作制,上班时间为9:00-9:30,下班时间为18:00-18:30,中午12:00-13:00为午休时间,不计入工作时间;每天工作时间不少于8小时。2)公司考虑交通通勤情况,每天上班给予10分钟延迟;9:40后为迟到打卡,每月最多迟到3次(不晚于10:00),超出则视为旷工;晚于10:00打卡且无正当理由,视为旷工半天;3)因工作原因下班晚走2小时,第二天打卡时间不晚于上午10:00,考勤打卡数据将作为员工日常管理和薪资核算的重要依据。 diff --git a/pkg/evaluation/evaluation.go b/pkg/evaluation/evaluation.go index 0e7a9d977..f526dbf04 100644 --- a/pkg/evaluation/evaluation.go +++ b/pkg/evaluation/evaluation.go @@ -119,7 +119,7 @@ func (eval *RagasDatasetGenerator) Generate(ctx context.Context, csvData io.Read } // load csv to langchain documents - loader := pkgdocumentloaders.NewQACSV(csvData, "", eval.options.questionColumn, eval.options.groundTruthsColumn) + loader := pkgdocumentloaders.NewQACSV(csvData, "", pkgdocumentloaders.WithQuestionColumn(eval.options.questionColumn), pkgdocumentloaders.WithAnswerColumn(eval.options.groundTruthsColumn)) langchainDocuments, err := loader.Load(ctx) if err != nil { return err diff --git a/pkg/vectorstore/pgvector.go b/pkg/vectorstore/pgvector.go index 2c3600f6d..4cba3d175 100644 --- a/pkg/vectorstore/pgvector.go +++ b/pkg/vectorstore/pgvector.go @@ -173,11 +173,6 @@ func (s *PGVectorStore) RemoveExist(ctx context.Context, log logr.Logger, docume for _, d := range document { has, ok := res[d.PageContent] if ok { - // The value returned from the database is of type float64, - // but the original document is of type int - if v, ok := has.Metadata["lineNumber"]; ok { - has.Metadata["lineNumber"] = int(v.(float64)) - } if reflect.DeepEqual(has.Metadata, d.Metadata) { continue } diff --git a/tests/example-test.sh b/tests/example-test.sh index b0391b670..f4c6c1526 100755 --- a/tests/example-test.sh +++ b/tests/example-test.sh @@ -322,7 +322,7 @@ if [[ -z $pgdata ]]; then fi info "7.6 update qa.csv to make sure it can be embedding" -echo "newquestion,newanswer" >>pkg/documentloaders/testdata/qa.csv +echo "newquestion,newanswer,,," >>pkg/documentloaders/testdata/qa.csv mc cp pkg/documentloaders/testdata/qa.csv arcadiatest/${bucket}/dataset/dataset-playground/v1/qa.csv mc tag set arcadiatest/${bucket}/dataset/dataset-playground/v1/qa.csv "object_type=QA" sleep 3