结合ollama gemma2:2b大模型来实现数据分析系统的智能交互

news2024/9/22 13:46:16

在最近的人员风险行为分析系统开发过程中,需要解决一个问题:在缺乏GPU资源的情况下,如何提升智能交互能力。​我们探索并研究了集成gemma2:2b模型的可行性,这一举措旨在在有限的硬件条件下,为我们的系统注入更高级别的智能性,从而增强用户体验并提高数据分析效率。
具体可分为如下几个步骤:

  1. 定义用户可能提出的问题类型
  2. 结合大模型设计接口,以便根据用户的问题提取实体信息
  3. 实现数据检索机制以提取相关信息返回给用户

如下,是系统页面原型,
在这里插入图片描述
交互时,用户输入自己的问题,我们无法预测用户输入什么,但是我们可以定义系统能处理什么类型的问题。在本功能里,我们定义如下系统可以交互的问题分类:

  1. 人员的基本信息
  2. 联网设备(应用系统、数据库资产、终端设备资产、服务器资产等)的基本信息
  3. 人员日常操作风险(从告警列表里读取)
  4. 和知识图谱的交互线索,例如共用终端风险线索(从知识图谱里查到用户使用两个以上终端设备的图数据)

接着我们要用大模型把用户问题里的实体抽取出来,这就需要我们定义prompt,并利用提示词让大模型帮我们把用户的问题解读成我们可继续执行的实体行为。代码如下:

@app.route('/chat', methods=['POST'])
def chat():
    data = request.json
    prompt = data.get('prompt', '')
    
    payload = {
        "model": "gemma2:2b",
        "prompt": BASE_PROMPT + prompt
    }
    
    response = requests.post(f"{OLLAMA_API_BASE}/generate", json=payload)
    response.headers['Content-Type'] = 'application/json; charset=utf-8'
    
    if response.status_code == 200:
        try:
            result = response.content.decode('utf-8')
            # 尝试解析每一行
            responses = [json.loads(line) for line in result.strip().split('\n')]
            # 提取所有响应中的 'response' 字段
            combined_response = ''.join(r.get('response', '') for r in responses if 'response' in r)
            # 使用正则表达式提取括号内的内容
            pattern = r'\((.*?)\)'
            matches = re.findall(pattern, combined_response)

            result_list = []

            for match in matches:
                # 使用defaultdict来处理重复键
                result_dict = defaultdict(list)
                
                # 使用逗号分割键值对,允许逗号前后有空格
                pairs = re.split(r'\s*,\s*', match)
                
                # 遍历每个键值对
                for pair in pairs:
                    # 使用冒号分割键和值,允许冒号前后有空格
                    key_value = re.split(r'\s*:\s*', pair, maxsplit=1)
                    if len(key_value) == 2:
                        key, value = key_value
                        # 去除键和值两端的空格,并将值添加到对应的键的列表中
                        result_dict[key.strip()].append(value.strip())
                
                # 将defaultdict转换为普通字典,对于只有一个值的键,直接使用该值而不是列表
                final_dict = {k: v[0] if len(v) == 1 else v for k, v in result_dict.items()}
                result_list.append(final_dict)
            return jsonify({"response": result_list})
        except json.JSONDecodeError as e:
            return jsonify({"error": f"Failed to parse JSON response: {str(e)}"}), 500
    else:
        return jsonify({"error": "Failed to get response from Ollama"}), 500

代码里的关键部分是BASE_PROMPT,我找了GPT帮我润色,如下,感觉可以写的更好一些。

BASE_PROMPT = """
        您的任务是仔细分析用户提供的文本,并从中提取关键实体信息。请特别关注以下四类实体:

        1. 用户相关信息:
        - 姓名
        - 身份证号码
        - 所在公司
        - 其他相关的个人识别信息

        2. 设备相关信息:
        - IP地址
        - MAC地址
        - 操作系统
        - 机器名称
        - 其他可识别的设备特征

        3. 事件相关信息:
        - 网络事件
        - 风险事件
        - 其他值得注意的事件

        4. 时间相关信息:
        - 时间段
        - 开始时间
        - 结束时间
        - 其他时间

        请仔细阅读文本,识别并提取上述实体信息。将提取的信息以(key:value)的格式整理,多个实体之间用逗号分隔。key只能从IP、姓名、身份证、电话号码、操作系统、事件、时间这几个词里选择。例如:

        (姓名: 张三, 身份证: 310123199001011234, IP: 192.168.1.100, 操作系统: Windows 10, 事件: 异常登录, 时间: 前天)

        如果某类实体在文本中未提及,则无需包含在结果中。请确保提取的信息准确且与原文相符。如果文本中包含其他重要的实体信息,也请一并提取。

        请现在开始分析下面用户提供的文本,并按上述格式返回提取的实体信息:

        """

可以看看测试结果如下,
在这里插入图片描述
这样我们就可以根据response进行进一步的拆解,按姓名、按事件、按时间来整理数据并最终返回给用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解进程

一、进程的概念 进程:顾名思义,就是一个完整执行程序的过程。没错,就是这么简单,但是在程序执行的过程之中,系统会为这个执行的程序分配内存资源,这些过程也包含在进程当中。 进程是动态的,是程…

css-50 Projects in 50 Days(2)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>步骤条</title><link rel"style…

基于混沌麻雀搜索算法的光伏MPPT控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型主要研究光伏系统MPPT控制&#xff0c;通过将麻雀搜索算法引入至MPPT控制策略中&#xff0c;在模型中通过改变光照强度&#xff0c;来验证算法引入的有效性。模型中包含麻雀搜索算法MPPT与混…

单链表——随机链表的复制

深拷贝&#xff0c;就是将原链表彻底的拷贝&#xff0c;当我们观察这个链表时我们会发现&#xff0c;val与next都比较好拷贝&#xff0c;难点就是在random的拷贝&#xff0c;因为我们需要知被拷贝的节点的random指向的是哪个&#xff0c;所以我们很容易想到的方法就是从头遍历链…

从开题到答辩:ChatGPT超全提示词分享!(上)【建议收藏】

在浩瀚的知识领域中&#xff0c;提问的艺术是探索真理的钥匙。在这个信息爆炸的时代&#xff0c;深入探索知识的海洋&#xff0c;不仅需要热情和毅力&#xff0c;更需要正确的方法和工具。学术研究是一个复杂而严谨的过程&#xff0c;涉及从选题、文献综述到研究设计、数据收集…

网络层,数据链路层和应用层

1.网络层 网络层最主要的协议就是IP协议。 下图是IP协议的格式&#xff1a; 1.1 IP协议解析 &#xff08;1&#xff09;4位版本&#xff1a; 有两种&#xff1a;IPV4&#xff08;IP地址4个字节大小&#xff09;和IPV6&#xff08;IP地址16个字节大小&#xff09; &#xf…

推荐系统实战(八)-冷启动(上)

一、冷启动基本描述 &#xff08;一&#xff09;冷启动与新用户新物料 冷启动针对的是对缺少消费记录的新用户、新物料的推荐。 新用户不仅包含初次使用应用的用户&#xff0c;还包含安装很久但是处于低活跃状态的用户。 &#xff08;二&#xff09;部分经典算法无法支持新…

2024年【安全员-C证】新版试题及安全员-C证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【安全员-C证】新版试题及安全员-C证复审模拟考试&#xff0c;包含安全员-C证新版试题答案和解析及安全员-C证复审模拟考试练习。安全生产模拟考试一点通结合国家安全员-C证考试最新大纲及安全员-C证考试真题汇…

二叉搜索树进阶之红黑树

前言&#xff1a; 在上文我们已经学习了AVL树的相关知识以及涉及的四种旋转的内容&#xff0c;但是AVL树追求平衡导致旋转操作过多&#xff0c;一些情况下影响性能&#xff0c;由此我们就来了解一下二叉搜索树的另外一个分支&#xff0c;红黑树。 &#xff08;倘若对旋转知识…

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特:“这太恶心了”

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特&#xff1a;“这太恶心了” 2024-08-25 23:07 发布于&#xff1a;河北省 21 岁的奥尔特加承认她仍在学习如何保护自己&#xff0c;一种有帮助的方法是“尽可能避免使用手机”。 这位女演员表示&#xff0c;看到“剪…

算法: 双指针

题目&#xff1a;环形链表 题目讲解&#xff1a; 判断环 要判断链表是否有环&#xff0c;可以使用快慢指针的方法。快指针每次走两步&#xff0c;慢指针每次走一步。如果链表有环&#xff0c;快慢指针最终会相遇&#xff1b;如果没有环&#xff0c;快指针会先到达链表末尾。 …

该部署公钥无权限拉代码

从阿里云云效的代码库中执行git pull时报错如下&#xff1a; git pull该部署公钥无权限拉代码 fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.原因是该代码库在云效上未启用密钥&#xff0c;…

【Material-UI】Select 组件中的 `Auto width`、`Small Size` 和 `Other Props` 详解

文章目录 一、Select 组件概述1. 组件介绍2. Select 组件的基本结构 二、Auto width 属性详解1. Auto width 的作用2. Auto width 属性的基本用法3. Auto width 的实际应用场景 三、Small Size 属性详解1. Small Size 的作用2. Small Size 属性的基本用法3. Small Size 的实际应…

三分钟总结开源流程表单的优势特点

实现流程化办公&#xff0c;可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品&#xff0c;低代码技术平台凭借够灵活、好操作、可视化界面的优势特点&#xff0c;得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

vue2.0纯前端预览附件方法汇总

vue2.0纯前端预览附件方法汇总 一、使用iframe预览1.使用 Office 在线查看器2.XDOC文档预览服务XDOC官网地址:[https://view.xdocin.com/](https://view.xdocin.com/) 二、vue-office具体效果可以参考: [https://501351981.github.io/vue-office/examples/dist/#/docx](https:/…

linux下使用xargs批量操作

1、创建测试文件&#xff1a; for i in {1..4}; do touch $i.gz; done;2、将所有gz文件重命名为.gz.log2文件 ls | xargs -I {} sh -c mv {} {}.log2 3、将所有.log2文件改回为.gz文件 ls | xargs -I {} sh -c mv {} $(echo {} | sed "s/\.log2//g" ) 4、将所有的…

优先级队列面试题详解

题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/smallest-k-lcci/description/ 解题思路&#x…

新华三H3C HCL配置IS-IS基本配置

实验目标 完成本实验,应该能够达到以下目标。 ●掌握如何在路由器进行单区域IS-IS的基本配置 ●掌握如何在路由器上查看IS-IS路由表、邻居信息 ●掌握如何在路由器上查看IS-IS的LSDB信息 实验拓扑 IP地址表 实验任务 单区域配置&#xff1a; 在本实验任务中,需要在路由器上…

STM32标准库HAL库——MPU6050原理(卡尔曼滤波和DMP库处理数据)和代码

目录 陀螺仪相关基础知识&#xff1a; 陀螺仪数据处理的三种方式&#xff1a; 加速度计&#xff0c;陀螺仪的工作原理&#xff1a; 陀螺仪在智能车中的应用&#xff1a; MPU6050原理图和封装图&#xff1a; ​编辑 硬件IIC和软件IIC的区别&#xff1a; 相同点 不同点 …

MagiskBoot编译解包打包boot.img

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 编译环境准备 1. Windows下启用开发者模式&#xff0c;因为需要 symbolic link 支持 2. 安装 python3.8&#xff0c;并配置PATH环境变量 # 查看python版本信…