RAG检索策略及划分策略

文档分割策略和混合检索

文档分隔

在将文档向量化的这一步骤中,在我们稀疏稠密混合检索之前,我们常常需要将各式各样的文档一起做好划分存储到向量数据库中,这些知识库可以是pdf,或text,docx,也可以是一个json文件,在处理相应的文档上就需要使用不同的处理办法才能读取这些文件,在文件内容的划分上,我们还划分为有结构和无结构的,有结构的比如,QA结构,按QA结构的方式我们就可以直接将Q当作一块,存到向量数据库里, A当作元数据,如果是文章的形式,像是产品手册,我们可以按段落划分,对于没有QA结构也不是文章形式的,就是一大段文字,这个时候降级按字符串数字划分,这里还要配合滑动窗口去覆盖一部分的相同字符保证语义不乱。 我们接下来看代码怎么用代码处理这些问题

按段落划分

像是这样的结果,我们首先要明确丢掉图片,按段落划分,

可以认为当遇到一串标题时,就是上一个段落结束下一个段落开始

python 复制代码
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
from docx import Document
import re
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()



# 按段落分割
def split_text_from_pdf(pathname, range = None, min_length = 10):
    pages = extract_pages(pathname)
    paragraphy = [] 
    buffer = ""
    full_text = ""
    for i, page in enumerate(pages):
        if (range is not None and i + 1 not in range):
            continue
        for element in page:
            if not isinstance(element, LTTextContainer): 
                continue
            full_text += element.get_text() + "\n"
    
    #到这里,我们就拿完了
    lines = full_text.split("\n")
    for line in lines:
        if len(line) >= min_length:
            if not line.endswith("-"):
                buffer += " " + line
            else:
                buffer += line.strip("-") #因为有-的化你可以认为这是一段
        elif buffer:
            paragraphy.append(re.sub(r'\s+', ' ', buffer.strip(" ")))
            buffer = ""
    if buffer:
        paragraphy.append(buffer)
    return paragraphy

texts = split_text_from_pdf("人事管理流程.pdf", min_length=10, range=[1, 2, 5])


def split_text_from_docx(pathname, min_length = 10): 
    documents = Document(pathname)
    full_text = ""
    for paragraph in documents.paragraphs:
        full_text += paragraph.text + "\n"
    
    buffer = ""
    paragraph = []

    full_text = full_text.split("\n")
    for text in full_text:
        if len(text) >= min_length:
            if not text.endswith("-"):
                # 如果是-结束,这里我们需要联合的,
                buffer += text
            else:
                buffer += text.rstrip("-") + "\n"
        elif buffer:
            paragraph.append(re.sub(r'\s+', ' ', buffer.strip(" ")))
            buffer = ""
    if buffer:
        paragraph.append(buffer)            
    return paragraph

texts = split_text_from_docx("人事管理流程.docx")



def split_text_from_text(pathname, min_length = 10):
    paragraphy = []
    with open(pathname, encoding="utf-8") as f:
        texts = f.readlines()
        texts = list(dict.fromkeys(texts))
        texts.remove("\n")

    buffer = ""
    for text in texts:
        text = text.strip("\n").strip(" ")
        if len(text) >= min_length: 
            if not text.endswith("-"):
                buffer += text
            else:
                buffer += text + "\n"
        elif buffer:
            paragraphy.append(re.sub(r'\s+', ' ', buffer.strip(" ")))
            buffer = ""
    if buffer:
        paragraphy.append(buffer.strip(" "))
    return paragraphy

text = split_text_from_text("人事管理流程.txt")

有QA结构的

请看以下代码

python 复制代码
with open("train_zh.json", encoding="utf-8") as f:
    texts = [json.loads(i) for i in islice(f.readlines(), 2, 20)]

questions = [ item["instruction"] for item in texts]
answers = [item["output"] for item in texts]

字符串和滑动窗口字数划分

python 复制代码
text = ("自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。"
        "在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。"
        "从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,"
        "NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,"
        "如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。")

def split_text(text:str, count: int, stride:int):
  return [text[i:i + count] for i in range(0, len(text), count - stride)]

print(split_text(text, 30, 10))

混合检索

混合检索分为稀疏检索部分和稠密检索部分, 我们通过这两种检索办法得出文档排名,然后混合加权计算,得到最终的排名,为什么要使用混合检索呢,因为稠密检索是将文本整体向量化,在数据库中进行语义检索,这使得这种检索办法得到的文档下可能会丢失一些重要的关键字, 而这个是稀疏检索擅长的, 但是稀疏检索没法理解语义,我们可以查看下面两个示例感受一下,

稀疏检索

我们先查看bm2的稀疏检索方式

python 复制代码
from rank_bm25 import BM25Okapi 
from pdfminer.layout import LTTextContainer
import jieba
from pdfminer.high_level import extract_pages
import re
from docx import Document
# from 

def split_text_from_docx(pathname, min_length = 10): 
    documents = Document(pathname)
    full_text = ""
    for paragraph in documents.paragraphs:
        full_text += paragraph.text + "\n"
    
    buffer = ""
    paragraph = []

    full_text = full_text.split("\n")
    for text in full_text:
        text = text.strip(" ")
        if not text:
            continue
        
        if len(text) >= min_length:
            if not text.endswith("-"):
                # 如果是-结束,这里我们需要联合的,
                buffer += text
            else:
                buffer += text.rstrip("-") + "\n"
        elif buffer:
            paragraph.append(re.sub(r'\s+', ' ', buffer.strip(" ")))
            buffer = ""
    if buffer:
        paragraph.append(buffer)            
    return paragraph

corpus = split_text_from_docx("人事管理流程.docx", min_length=8)




tokenized_corpus = [ jieba.lcut(doc.strip(" ")) for doc in corpus]

bm25 = BM25Okapi(tokenized_corpus)

query = "体检不合格的可以来吗?"

tokenized_query = jieba.lcut(query.strip(" "))

top3 = bm25.get_top_n(tokenized_query, tokenized_corpus, n=3)
print(["".join(doc) for doc in top3 ])

我们这里得到的打印结果为

css 复制代码
[    '1、员工的晋升必须符合公司的需要,实行德能与业绩并重的原则;2、能升能降原则:根据绩效考核与综合能力考核,员工职位能者居之;3、晋升的流程:同试用与转正流程4. 人品不合格的的话,则晋升不合格',     '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。',     '(1)所有资产谁使用谁保管:若出现丢失,则由保管人进行赔偿;由于自然损坏导致的维修费则由公司承担;因人为损坏导致的维修费,则由保管人进行赔偿;(2)资产遗失惩罚固定资产:按照资产的价值进行赔偿,新采买遗失的按照原价赔偿,使用一段时间遗失的则按时间折价赔偿。虚拟资产:手机卡按照100元一张进行赔偿,其他账号按照粉丝量来进行赔偿,一个粉丝1元进行计价。']

可以发现,我在docx中,仅仅是加了一条, "如果人品不合格的话,则晋升不合格", 这就说明了bm25完全不理解语义,它只是做关键字匹配,更糟糕的事情是,"体检不合格的可以来吗?"有很多表达,少几个关键字的话就偏离了,完全没有语义

稠密检索

python 复制代码
from rank_bm25 import BM25Okapi 
from pdfminer.layout import LTTextContainer
from pdfminer.high_level import extract_pages
import re
from docx import Document
import chromadb
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
# from 

def split_text_from_docx(pathname, min_length = 10): 
    documents = Document(pathname)
    full_text = ""
    for paragraph in documents.paragraphs:
        full_text += paragraph.text + "\n"
    
    buffer = ""
    paragraph = []

    full_text = full_text.split("\n")
    for text in full_text:
        text = text.strip(" ")
        if not text:
            continue
        
        if len(text) >= min_length:
            if not text.endswith("-"):
                # 如果是-结束,这里我们需要联合的,
                buffer += text
            else:
                buffer += text.rstrip("-") + "\n"
        elif buffer:
            paragraph.append(re.sub(r'\s+', ' ', buffer.strip(" ")))
            buffer = ""
    if buffer:
        paragraph.append(buffer)            
    return paragraph

corpus = split_text_from_docx("人事管理流程.docx", min_length=8)


# model = chromadb.Client()
# model.get_or_create_collection("test")


client = OpenAI(
    api_key= os.environ.get("DASHSCOPE_API_KEY"),
    base_url= os.environ.get("BASEURLEMBED")
)

def embed(input:str):
    return client.embeddings.create(
    model="text-embedding-v4",
    dimensions=1024,
    input=input,
    encoding_format="float")


chroma_client = chromadb.PersistentClient(path="./chroma_db")
# chroma_client.delete_collection(name="test")


collection = chroma_client.get_or_create_collection("test")
if collection.count() == 0:
    embeds = [ [embed(str).data[0].embedding, str] for str in corpus]
    for index, item in enumerate(embeds):
        print("还走啊")
        collection.add(
            ids=[f"{index}"],
            embeddings=item[0],
            documents=item[1]
        )

query = "体检不合格的可以来吗?"
embed_query = embed(query)
results = collection.query(query_embeddings=embed_query.data[0].embedding, n_results=3)
print(results["documents"], "看看reuslts")
# print(embeds[0])

我们运行得到打印结果

lua 复制代码
[[
1: '1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天)', 
2: '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位', 
3: '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件: 2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。'
]]

可以看到现在的检索是基于语义的,最后一项看上去是最正确的,但是排名不高在这里是因为被稀释了语义,而且它不保证你能检索到关键词, 第一条就证明了,它没有体检相关含义的内容,所以我们才说使用混合检索,用稀疏去限制包含精确术语,用向量模型保证语义

混合检索

混合检索也有说法,问题在于该怎么把两种结果集结合呢,一种是把这两种归一化然后把结果排名按权重融合, 可以灵活的调整权重,但是手动调参没有办法适应用户复杂多变的需求,最好的还是再加入一个打分模型,对候选集进行精细排序,这样我们既补充了语义上的不足,又可以保证有关键词的参与, 前面我们使用向量模型向量文档然后存入向量数据库做相似度检索,如果考虑把打分模型合前面一步稠密检索融合的话,那么打分模型就需要面对海量的文档了对吧,所以我们需要把海量的文档做一遍粗筛, 两步走是必要的,我们可以使用阿里的qwen3-rerank 这个模型进行后续的打分

css 复制代码
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

sparse_doc = [    '1、员工的晋升必须符合公司的需要,实行德能与业绩并重的原则;2、能升能降原则:根据绩效考核与综合能力考核,员工职位能者居之;3、晋升的流程:同试用与转正流程4. 人品不合格的的话,则晋升不合格',     '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。',     '(1)所有资产谁使用谁保管:若出现丢失,则由保管人进行赔偿;由于自然损坏导致的维修费则由公司承担;因人为损坏导致的维修费,则由保管人进行赔偿;(2)资产遗失惩罚固定资产:按照资产的价值进行赔偿,新采买遗失的按照原价赔偿,使用一段时间遗失的则按时间折价赔偿。虚拟资产:手机卡按照100元一张进行赔偿,其他账号按照粉丝量来进行赔偿,一个粉丝1元进行计价。']

dense_doc = ['1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天)', '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位', '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。']

docs = list(dict.fromkeys(sparse_doc + dense_doc))



client = OpenAI(
  api_key= os.environ["DASHSCOPE_API_KEY"],
  base_url=os.environ["RERANKBASEURL"]
)

results = client.post(
  "/reranks",
  body={
    "model": "qwen3-rerank",
    "query": "体检不合格的可以来吗?",
    "documents": docs
  },
  cast_to=object
)


results = [docs[item["index"]] for item in results["results"]]

print(results, "results")

# { 
#   'object': 'list', 
#   'results': 
#   [
#     {'index': 1, 'relevance_score': 0.5706994855586653}, 
#     {'index': 0, 'relevance_score': 0.4263778047393028}, 
#     {'index': 4, 'relevance_score': 0.39692874344800344}, 
#     {'index': 3, 'relevance_score': 0.3840332271874931}, 
#     {'index': 2, 'relevance_score': 0.16943439237855434}
#   ], 
#     'model': 'qwen3-rerank', 
#     'id': '3038de52-3f6f-9eb5-9934-6325a070e656', 
#     'usage': {'total_tokens': 802}
# }

[  '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。',   '1、员工的晋升必须符合公司的需要,实行德能与业绩并重的原则;2、能升能降原则:根据绩效考核与综合能力考核,员工职位能者居之;3、晋升的流程:同试用与转正流程4. 人品不合格的的话,则晋升不合格',   '1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天)',   '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位',   '(1)所有资产谁使用谁保管:若出现丢失,则由保管人进行赔偿;由于自然损坏导致的维修费则由公司承担;因人为损坏导致的维修费,则由保管人进行赔偿;(2)资产遗失惩罚固定资产:按照资产的价值进行赔偿,新采买遗失的按照原价赔偿,使用一段时间遗失的则按时间折价赔偿。虚拟资产:手机卡按照100元一张进行赔偿,其他账号按照粉丝量来进行赔偿,一个粉丝1元进行计价。']

可以看到,我们最终这段关于使用与转正的描述被放到了第一位,这是符合我们想要的,因为这个文档中对于我们这个问题其实就只有一处描述,其它的描述都不太符合,我们可以在第三行中加入一行,"如果体检不合格,不允许入职",这几乎是最直接的描述了,

css 复制代码
['1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天),如果体检不合格,不允许入职', '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。', '1、员工的晋升必须符合公司的需要,实行德能与业绩并重的原则;2、能升能降原则:根据绩效考核与综合能力考核,员工职位能者居之;3、晋升的流程:同试用与转正流程4. 人品不合格的的话,则晋升不合格', '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位', '(1)所有资产谁使用谁保管:若出现丢失,则由保管人进行赔偿;由于自然损坏导致的维修费则由公司承担;因人为损坏导致的维修费,则由保管人进行赔偿;(2)资产遗失惩罚固定资产:按照资产的价值进行赔偿,新采买遗失的按照原价赔偿,使用一段时间遗失的则按时间折价赔偿。虚拟资产:手机卡按照100元一张进行赔偿,其他账号按照粉丝量来进行赔偿,一个粉丝1元进行计价。']

可以看到,排名也迅速上升,关于使用与转正条例也被排到了第二

题外

在上面介绍的RAG检索中,可以看到,向量模型是最忙的,用量也是最大的,但是向量

模型做的是大意上的向量化,不需要特别厉害的模型干活,而且本地能部署的模型也很强,再加上现在可以很容易地本地部署一个向量大模型,所以好像没有什么理由阻止我们使用本地向量大模型, 示例中使用qwen3-embedding:latest

ini 复制代码
import ollama
import chromadb

single = ollama.embed(
  model="qwen3-embedding:latest",
  input="体检不合格的可以来吗?",
  dimensions=1024
)



chroma_client = chromadb.PersistentClient(path="./chroma_db")
# chroma_client.delete_collection(name="test")


collection = chroma_client.get_or_create_collection("test")

results = collection.query(query_embeddings=single["embeddings"])

print(results["documents"])


[[
1: '1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天)', 
2: '因入职、离职或资产公司内部调拨,保管人需在公司后台(资产管理)进行资产转让审批,经行政专员审核后接收人完成资产确认方为交接成功。因个人原因未及时办理转让审批,导致资产遗失的,由上一任保管人承担赔偿责任。', 
3: '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位']]

我们丢了比较重要的试用与转正这条,在上述远程大模型中,它的排名就比较靠后了,在这里没有了,像我们这里比较差的模型(不是模型差,是模型营养不良), 我们暂时的一个解决办法是多给出几条,这样覆盖得广一点,反正最后是给打分模型判断的,给个10-20的文档也没什么,但是语义上能覆盖得多, 我们调到10

scss 复制代码
[[1: '1、人员入职,人事行政部为新员工办理如下手续:1.1 入职人员提交资料:身份证、银行卡、毕业证、职业资格证、与原单位解除或终止劳动合同证明(此项没有填写无法提供离职证明承诺书)原件审核、体检报告。1.2 资料审核无误 入职面谈及安排工位 签订培训告知书发放入职指引 办理意外保险 进入培训期(7天)', 2: '因入职、离职或资产公司内部调拨,保管人需在公司后台(资产管理)进行资产转让审批,经行政专员审核后接收人完成资产确认方为交接成功。因个人原因未及时办理转让审批,导致资产遗失的,由上一任保管人承担赔偿责任。', 3: '1.1基础岗位人员经过体检任用,由部门主管面试确定。1.2管理岗位人员任用,由总经理最终面试确定。注:基层岗位:主管岗位以下人员均属于基础岗位', 4: '3.1法定假节日:元旦1天、春节3天、清明节1天、劳动节1天、端午节1天、中秋节1天、国庆节3天注:如遇国家对法定节假日的休假有最新的调整,按照最新国家规定执行。3.2事假:无薪3.2.1 员工遇有个人事务可在不妨碍正常工作的前提下申请事假;3.2.2 事假全年累计一般不得超过 15天,一次不得超过3天,特殊情况请假一般不得大于5天;2.2.3 试用期员工请事假,原则上不允许超过3个工作日,用人部门可酌情考虑是否继续留用;', 5: '3.3.1病假单次2天以内提供医院门诊证明,单次2天以上提供三级甲等医院门诊及相关检查证明材料,住院的需提供住院及出院相关证明材料,同时通过钉钉系统办理请假手续;若无相关证明或证明不符合要求的按照事假计算;3.3.2 工资支付标准:病假期间按长沙市最低工资标准的80%计发;3.3.3 3个月≤入职≤1年,全年累计病假计薪天数不超过15天,入职满1年以上,全年累计病假计薪天数不超过30天,超过部分按事假计算。', 6: '1、试用与转正流程试用期1-3个月 试用期合格与否用人部门提前7天告知人事行政部 员工填写转正申请走审批流程 人事行政部备案员工填写离职申请走审批流程 人事行政部办理离职员工申请 主管审批 人事招聘主管审批 抄送人事经理/人事主管员工申请(主管岗) 人事经理审批 总经理审批 抄送人事招聘/行政主管2、凡有以下情形者,均被视为不符合录用条件:2.1不符合招录条件:提供的学历、个人简历、工作经历、技能证明、体检证明等材料或者填写的《员工登记表》等内容与事实不符或有虚假的或者不按入职要求提供资料的;2.2 与原用人单位未依法解除、终止劳动合同或劳动关系的;或与原用人单位存在竞业限制约定且在限制范围之内的;2.3体检不合格者或患有职业病、传染病、精神疾病、其他身体健康条件不符合工作岗位要求的;2.4被发现在外兼职对本职工作造成影响,经书面通知后仍不纠正的;2.5未完成工作内容、工作指标或工作任务,或者未能通过相关的工作考核的;2.6严重失职、营私舞弊,给用人单位利益造损失达1000元以上的;2.7寻衅滋事、工作态度有严重问题、或给团队造成恶劣影响的;2.8如无特别约定的,合同签约后5天内未能上岗的;2.9月度连续旷工3天者,或年度累计旷工2次;2.10法律法规或公司规章制度规定的其他情形。', 7: '公司除总经理及以上人员均实行上下班打卡制度(含外勤人员),每天打两次卡,人事行政部依据打卡记录核算考勤;每人每月3次免费补卡机会,不补卡或超过次数负激励 50元/次。', 8: '1、员工的晋升必须符合公司的需要,实行德能与业绩并重的原则;2、能升能降原则:根据绩效考核与综合能力考核,员工职位能者居之;3、晋升的流程:同试用与转正流程4. 人品不合格的的话,则晋升不合格', 9: '1、降级条件:经考核不能胜任工作2、降级流程:部门负责人与相关人员谈话 相关人员填写《员工降级审批表》 同试用与转正流程', 10: '为提高公司资产管理水平,了解资产使用状况,分清资产保管权责,特制订本细则。']]
(.venv) PS D:\BaiduNetdiskDownload\DAWEI\大模型全栈班-L2阶段\test> 

可以看到我们,关于试用于转正这一条被排到了第六条, 其实没有关系的,多给几条检索结果总能覆盖上的,还有一个在我们上述中是将文档按段落划分的,段落过程确实可能稀疏了原本的语义,所以我们可以在实际切分的时候结合字符切割,判断段落长度,过长的话我们切分为两段。

相关推荐
小盼江1 小时前
Uniapp小程序鲜花商城推荐系统 买家卖家双端(web+uniapp)
前端·小程序·uni-app
lihaozecq1 小时前
Agent 工具系统搭建:4 个内置工具让 Agent 学会写代码
前端
问心无愧05131 小时前
ctf show web入门48
android·前端·笔记
guchen661 小时前
WPF的启动机制
前端·后端
盈建云系统1 小时前
小程序表单提交、input 双向绑定,最简洁写法
前端·小程序·apache
XiYang-DING2 小时前
【Java EE】Cookie
服务器·前端·java-ee
问心无愧05132 小时前
CTF show web入门45
android·前端·笔记
廖松洋(Alina)2 小时前
03主入口页面与导航结构-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙
廖松洋(Alina)2 小时前
09词根分解与水印展示-鸿蒙PC端Electron开发
前端·javascript·华为·electron·开源·harmonyos·鸿蒙