当前位置:首页>python>2python之本地模型分科及部署

2python之本地模型分科及部署

  • 2026-10-11 08:24:43
2python之本地模型分科及部署

写在前面的话

不白忙活。这次天津蓟州之行,总体还算不错,不完美的是大宝一直牙疼,买的套票没怎么玩。这次开车去,让我有点挠头,因为拐进山里,有七八公里盘山道,无数个陡弯,开的手心冒汗。我们9点从北京出发,到景点12点半,景区人员热情的说,里面项目比较多,现在进去也可以,但建议明天再来,一个项目要排一个多小时,5点半关门,最多玩两三个项目,不划算。能设身处地的为游客着想,还是挺感动的,第二天进去之后,排队时,工作人员端着盘子送水,送遮阳伞,感觉挺好。尤其,晚上十点多在旅店睡,大宝牙疼,房东大哥开车带着我跑了七八个药店买药,虽说都关门了没买到,但给我的体验特别好。本来想给房东买盒烟,想想算了,下次来了还住他这里就好了,让他不白忙活。我相信,没有白忙活的事,这里得不到回报,会在未来某个节点以回馈,我真的这么认为。

[240+100]--------底部有张生活照(我现在做头条号运营:大家想全托管挂号的联系我哦,每天让你得个汉堡包钱,wx: qhz198607)

【关键词】python、ragflow、本地模型、分科

一、本地模型分科(三级)

描述:现在本地模型分科,基本做出来了,需要把它引入到问询程序中,并且和之前的分科对齐。

开工:

第一步:取出最可能分科(四级)

20250328周五时间段:11:58-12:00

现在跑测试用例,效果如下:

图2a-1

注:两个问题,一是怎么取出数据【消化道科】,二是能不能把科室的embedding向量存起来,不要每次都计算,因为数据是不变的。

第二步:保存向量(四级)

20250328周五时间段:12:11-13:00

对embedding向量实行预计算,程序如下:

    # 类变量,所有实例共享
    _precomputed_departments  = None
    _precomputed_descriptions = None
    _precomputed_embeddings = None

    def __init__(self):
        self.model = SentenceTransformer('all-MiniLM-L6-v2')

        if self.__class__._precomputed_departments is None or \
           self.__class__._precomputed_descriptions is None or \
           self.__class__._precomputed_embeddings is None:
            self._precompute_embeddings()
        else:
            # 直接使用已计算的结果
            self.departments = self.__class__._precomputed_departments
            self.department_descriptions = self.__class__._precomputed_descriptions
            self.department_embeddings = self.__class__._precomputed_embeddings

注:这个进行事先计算,如果不存在重新计算,并保存到类变量中,_precompute_embeddings函数如下:

    def _precompute_embeddings(self):

        # 定义科室及其典型症状描述
        self.departments = {"消化道科": ["腹泻", "呕吐", "拉稀", "食欲不振", "消化不良", "便秘", "便血"],
                            "呼吸科": ["咳嗽", "打喷嚏", "呼吸困难", "喘息", "流鼻涕", "呼吸急促"],
                            "五官科": ["眼睛发红", "耳朵流脓", "耳螨", "眼屎多", "牙龈出血", "口腔溃疡"],
                            "皮肤科": ["皮肤瘙痒", "掉毛", "皮疹", "皮肤红肿", "皮屑", "皮肤溃烂"],
                            "泌尿科": ["尿频", "尿血", "排尿困难", "尿失禁", "尿量异常"],
                            "骨科": ["跛行", "关节肿胀", "不愿走动", "骨折", "关节疼痛"]
                            }

        # 为每个科室生成描述语句
        self.department_descriptions = {
            dept: f"宠物{dept}相关问题,包括但不限于:{', '.join(symptoms)}"
            for dept, symptoms in self.departments.items()
        } 

        # 预先计算所有科室描述的嵌入向量(保持为2D张量)
        self.department_embeddings = {
            dept: self.model.encode(desc, convert_to_tensor=True).unsqueeze(0)
            for dept, desc in self.department_descriptions.items()
        }

        # 保存到类变量
        self.__class__._precomputed_departments = self.departments
        self.__class__._precomputed_descriptions = self.department_descriptions
        self.__class__._precomputed_embeddings = self.department_embeddings

注:接下来,看下怎么取值。

第三步:从数据中取值(四级)

20250328周五时间段:15:18-16:00

返回的值,很奇怪,像集合似的,看下怎么取,数据如下:

[('消化道科', 0.7293846011161804)]

修改程序如下:

图2a-2

注:接下来,就是把数据与分科对齐。

第四步:数据与分科对齐(四级)

20250328周五时间段:15:29-16:00

对齐数据修改如下:

图2a-3

注:接下来,这个数据是分科的,要再来一个意图识别的。通过参数作区分。

第五步:加意图识别数据(四级)

20250328周五时间段:15:37-16:00

这个主要是选关键词,看下大模型能不能生成。需要生成关键词的如下:

    res_res = [    
            '疾病问诊',
            '疫苗接种',
            '用药咨询',
            '在线复诊',
            '驱虫选药',
            '科学养宠',
            '行为异常',
            '检测报告',
            "其它"
    ]

注:问下大模型,结果如下:

图2a-4

注:把这个搞到程序里,后期不准确再优化。速度是第一位的,别墨迹。

接下来,就是根据传的参数不同,把数据进行分开。

第六步:参数分开(四级)

20250328周五时间段:16:33-17:00

根据接口传参是意图识别还是分科,把向量数据分开,修改程序如下:

图2a-5

注:先设两个变量,再根据参数传参数,来决定用哪一个,如下:

    def predict_department(self, user_query, top_k=3,ask_type=1):

        # 编码用户查询(确保是2D张量)
        query_embedding = self.model.encode(user_query, convert_to_tensor=True).unsqueeze(0)

        similarities = {}
        
#1:科室 2:意图
        if ask_type==1:
            for dept, dept_embedding in self.department_embeddings.items():
                # 计算相似度矩阵
                sim_matrix = util.pytorch_cos_sim(query_embedding, dept_embedding)
                # 提取标量相似度值
                similarities[dept] = sim_matrix[0][0].item()
        elif ask_type==2:
            for dept, dept_embedding in self.intention_embeddings.items():
                # 计算相似度矩阵
                sim_matrix = util.pytorch_cos_sim(query_embedding, dept_embedding)
                # 提取标量相似度值
                similarities[dept] = sim_matrix[0][0].item()

        result =  sorted(similarities.items(), key=lambda x: x[1], reverse=True)[:top_k]

        return result[0][0]

注:这样一来就可以兼容分科和意图识别了,意图识别结果如下:

图2a-6

注:接下来,把这个搞到程序里,代替deepseek问询。

二、本地模型部署(三级)

描述:把已经写好的deepseek方法,放到程序里,代替deepseek,实现意图识别与分科。

开工:

第一步:代替deepseek(四级)

20250328周五时间段:19:54-20:00

先代替意图识别,如下:

图2a-7

注:把这个方法替换一下就可以了,针对意图识别。修改程序如下:

def user_intension_congnition(conversation_id,dialog,messages,question):
    """

    用户意图识别
    返回:不要给出解释性话语,只给出以下分类的一种
        疾病问诊
        疫苗接种
        用药咨询
        在线复诊
        驱虫选药
        科学养宠
        行为异常
        检测报告
        其它
    """
    # question_prompt = user_intension_reconition_prompt.format(input_text=question)
    # specify_type = 100 ##指定类型,这个类型表示意图识别,主要为了前端不显示
    # res_chat = chat_direct(dialog,question_prompt,messages,specify_type)

    #本地模型
    res_chat = classifier.predict_department(question, top_k=1,ask_type=2)

    if '其它' not in res_chat:
        ConversationService.update_by_id(conversation_id, {"intention":res_chat})    
    return res_chat

注:接下来,就是做替换分科。

第二步:本地模型替换分科(四级)

20250328周五时间段:20:14-21:00

修改程序如下:

图2a-8

注:接下来,就是进行测试了,看看效果怎么样。

三、头条号战果汇报

昨日总播放:528.6万,总收入:228.28,累计收入:3850.85块,可提现:1806.66,软件截图如下:

图2c-1

注:想要全脱管运营头条号的联系我,你出账号,我来运营,收益四六分成(你六我四),你当甩手掌柜,每天都能得几块零花钱,财富wx: 17701328814

三、生活照片(三级)

拍摄于‎2025‎年‎9‎月‎14‎日,‏‎17:04:20,带大宝去买文具,当时大宝七岁九个月。很多事,事在人为,就比如这次蓟州之行,我的体验虽说开车挺劲费,到处都是山路,堵车也很严重,800米的小道能堵半个多小时,但人家服务好,我下次有机会了还会去。很多事都是不自觉的,房东带我买药了,虽说我没给他买烟,但我使用房间物品时,都是轻拿轻放,走时房间收拾干净,不留垃圾,减少他的劳动也算是一种报偿,下次来了首选是他家,长远来看,他是有收益的。所以,多做好事,将来必有好事发生,加油!

图2d-1

《本文完》

最新文章

随机文章