Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化

admin 2025年3月3日11:26:22评论43 views字数 7928阅读26分25秒阅读模式

在上一个示例中,我们学习了如何构建 Kali 渗透智能体。本示例将进一步演示如何为智能体引入多个不同来源的知识,以增强其对特定领域的理解和回答能力。

这个例子主要的教学演示:

  • 如何导入外部知识( HTML、PDF、MARKDOWN、TEXT 等格式)?

  • 如何将外部知识向量化、存储,并编排进入智能体?

另外我们还将学习: Arize Phoenix 观测平台,追踪(Trace)观测智能体的思维过程。

本篇例子知识库包含的数据:

  1. CVE 数据
  2. 软件数据

当用户向智能体查询 CVE 或软件信息时,智能体将基于知识库中的信息生成回答。

此外,智能体支持多次关联查询,例如:

★ 

用户提问“CVE-2025-27554 是什么漏洞?这个漏洞将影响哪些产品?请详细介绍相关产品。”

智能体的查询过程:

  1. 先从 CVE 知识库 查找 CVE-2025-27554 的信息。
  2. 若 CVE 信息中提到了受影响的软件,则继续查询 产品数据知识库,获取相关软件的详细信息。
  3. 综合 CVE 信息和软件数据,生成最终的完整回答。

知识库是什么?

知识库是给大模型使用的外部数据源,用户使用大模型时,从知识库获取与用户提问相关的数据,llm 根据收到的知识库片段和用户提问回答问题。这种方式可以有效提升 LLM 在特定领域的准确性,避免模型依赖仅有的训练数据进行推理。

知识库能缓解什么问题

  1. 幻觉问题:LLM 可能会凭空捏造信息,特别是在处理专有领域资料、内部资料或者实时性强的资料时,知识库可以提供可靠的外部数据支撑,减少错误回答的概率。
  2. 基座模型训练资料过时问题:LLM 训练数据通常有时间滞后性,无法获取最新信息,而知识库可以持续更新,确保回答的时效性。
  3. 上下文窗口限制问题:LLM 的输入长度有限,无法一次性提供大量背景信息,而知识库可以按需检索相关内容,减少冗余输入,提高交互效率。
  4. .......

知识库建立与召回流程

建立知识库:(1)预处理 -> (2)向量化与存储

召回知识库:(1)向量化 -> (2)向量查询 -> (3)答案合成

这一套方案称为 RAG(Retrieval-Augmented Generation)全称是 检索增强生成

👉 RAG 是个 AI 小助手的外挂 🎮

1️⃣ 先去知识库里找答案 📚🔍(检索 Retrieval)

2️⃣ 再用大模型自己编话 🤖✍️(生成 Generation)

3️⃣ 合二为一,回答更智能 🏆🎯

简单来说,RAG 让 AI 又能查资料又能编答案,比单纯靠大模型胡编乱造要 更准、更可靠!  🚀💡

什么是向量化

简单来说,向量化就是把文本变成一串数字(向量),然后用它来衡量不同文本之间的相似度。这个过程通常用嵌入模型来完成。

想象一下,你有一句话:“苹果手机好用吗?”—— 经过向量化,它可能变成一组数字,比如:

📌  [0.12, -0.45, 0.78, 1.02, -0.66, ...] (维度可能有几百或几千)这串数字就代表了这句话的“语义信息”。

如果另一句话 “iPhone 体验怎么样?”也经过向量化,它的向量可能会和前面那个很接近。我们可以通过计算这两组向量的“距离”来判断它们语义上是不是相似的。

为什么要向量化

你可能会想:“我直接用关键词搜索(比如用 Ctrl+F 搜索)不就行了吗?”

确实,关键词搜索也能找到一些匹配的内容,但有几个问题:

❌ 关键词匹配太死板:比如你搜“手机”,但文档里只写了“iPhone”,你可能就搜不到。 

❌ 找不到“意思相近”的内容:比如你搜“手机好用吗”,但文档里写的是“这款 iPhone 用户体验很好”,关键词搜索可能找不到,但向量化可以判断它们语义接近。 

❌ 不同表达方式的问题:有的人说“手机”,有的人说“移动设备”,向量化可以把这些相似的概念联系起来。

所以,向量化的好处就是—— 它不是简单匹配词,而是理解文本的意思,这样召回的内容会更准确,能更好地帮助 LLM 找到有用的信息!

智能体与聊天对话知识库的区别

💬 聊天机器人(Chat Bot)无脑查库,每次提问都去向量知识库翻找 📖🔍,即使是“你好👋”这种简单对话,也可能查到奇怪的东西,答非所问 🤯。

智能体(Agent):按需查询,只有确定需要信息时才去查数据库 🔎✅,基于工具调用实现,更智能、更精准,避免答非所问 🎯。并且还可以将不同维度的知识库分别建库,创建不同的工具,智能体理解用户提问背景后只使用对应维度的知识库查询工具,避免不同领域同义词的歧义。

代码学习

安装依赖

%pip install llama-index%pip install llama-index-llms-openai%pip install llama-index-callbacks-arize-phoenix%pip install tqdm

设置 API Key

使用 OPENAI_API 的接口,或者使用 DeepSeek 接口。

# API Key 设置import osos.environ["OPENAI_API_KEY"] = "sk-******"os.environ["OPENAI_API_BASE"] = "https://api.*****"

导入观测平台插件

观测平台可以 Trace 追踪 llm 调用,方便调试。

from llama_index.core.settings import Settingsfrom llama_index.core.callbacks import CallbackManagercallback_manager = CallbackManager()Settings.callback_manager = callback_manager# setup Arize Phoenix for logging/observabilityimport phoenix as pximport llama_index.corepx.launch_app()llama_index.core.set_global_handler("arize_phoenix")

后面会继续介绍这个观测平台。

非结构化数据解析

数据收集(爬虫等)阶段,将收集的数据保存成 txt、html、pdf、doc 等格式,使用 llama-index 封装的 UnstructuredReader 来解析

UnstructuredReader 可以解析常见的非结构化数据。

教程已经提前准备了测试数据集,后台回复"智能体"下载。

from llama_index.readers.file import UnstructuredReaderdata_dir = 'data/cve-agent'reader = UnstructuredReader()all_cve_docs = []all_product_docs = []for file_name in os.listdir(data_dir):ifnot file_name.endswith('.txt'):continue    file_path = os.path.join(data_dir, file_name)    documents = reader.load_data(file=file_path)if file_name.startswith('CVE-'):        all_cve_docs.extend(documents)elif file_name.startswith('product-'):        all_product_docs.extend(documents)

这段代码将 CVE 文件导入 all_cve_docs,将软件产品信息导入 all_product_docs 数组。

知识库创建向量化

为了方便,我们使用OpenAI接口的嵌入模型,ollma本地也有很多嵌入模型可以用。

配置llm模型,嵌入模型,以及知识库分片大小为 512,分片之间的重叠大小64

from llama_index.core import VectorStoreIndex, StorageContextfrom llama_index.embeddings.openai import OpenAIEmbeddingfrom llama_index.llms.openai import OpenAIfrom llama_index.core import SettingsSettings.chunk_size = 512Settings.chunk_overlap = 64Settings.llm = OpenAI(model="gpt-4o")Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

向量化知识库,并本地化存储向量化结果。

分别向量化 cve 和 product 信息。

# 创建存储器cve_storage_context = StorageContext.from_defaults()product_storage_context = StorageContext.from_defaults()# 向量化cve_index = VectorStoreIndex.from_documents(all_cve_docs, storage_context=cve_storage_context, show_progress=True)product_index = VectorStoreIndex.from_documents(all_product_docs, storage_context=product_storage_context, show_progress=True)# 本地存储cve_storage_context.persist(persist_dir='data/cve-agent/storage/cve')product_storage_context.persist(persist_dir='data/cve-agent/storage/product')# 创建查询引擎【llama-index】cve_query_engine = cve_index.as_query_engine()product_query_engine = product_index.as_query_engine()

llama-index 整个知识库流程是 text -> index -> engine -> tool -> agent 。

从本地加载向量数据

from llama_index.core import load_index_from_storagecve_index_storage_context = StorageContext.from_defaults(persist_dir='data/cve-agent/storage/cve')product_index_storage_context = StorageContext.from_defaults(persist_dir='data/cve-agent/storage/product')cve_index = load_index_from_storage(cve_index_storage_context)product_index = load_index_from_storage(product_index_storage_context)cve_query_engine = cve_index.as_query_engine()product_query_engine = product_index.as_query_engine()

无论是创建还是加载,最后得到 cve_query_engine 和 product_query_engine 两个查询引擎,分别对应 CVE 查询和产品信息查询。

查询引擎可以直接 query 并生成自然语言回答的,使用 Settings.llm 合成回答。

response = cve_query_engine.query("Cursor 有哪些漏洞?CVE 编号是什么?")response

将得到如下输出

Response(response='Cursor 软件中存在一个漏洞,其 CVE 编号是 CVE-2025-27554。这个漏洞允许远程攻击者通过在 package.json 中使用 postinstall 脚本在构建服务器上执行任意命令,并因此可以部署更新到任何应用程序。', .........

编排 Agent 查询工具

智能体能够自主决策使用什么工具,我们将构造的查询引擎转换成工具给智能体使用。

from llama_index.core.tools import QueryEngineTool, ToolMetadatacve_query_engine_tool = QueryEngineTool(    query_engine=cve_query_engine,    metadata=ToolMetadata(        name="cve_query",        description="查询 CVE 漏洞信息"    ))product_query_engine_tool = QueryEngineTool(    query_engine=product_query_engine,    metadata=ToolMetadata(        name="product_query",        description="查询产品信息"    ))

上面这段代码构造 cve_query_engine_tool 和 product_query_engine_tool 两个工具。

构建 Agent 并测试

from llama_index.agent.openai import OpenAIAgenttools = [cve_query_engine_tool, product_query_engine_tool]agent = OpenAIAgent.from_tools(tools, verbose=True)response = agent.query("CVE-2025-27554 是什么漏洞?这个漏洞将影响到哪些产品?对于影响到的产品需要简介,并提供修复方案。输出报告格式为 markdown 格式。")

运行过程中输出日志如下

Added user message to memory: CVE-2025-27554 是什么漏洞?这个漏洞将影响到哪些产品?对于影响到的产品需要简介,并提供修复方案。输出报告格式为 markdown 格式。=== Calling Function ===Calling function: cve_query with args: {"input":"CVE-2025-27554"}Got output: CVE-2025-27554 describes a vulnerability in ToDesktop before October 32024, which is used by Cursor and other applications. This vulnerability allows remote attackers to execute arbitrary commands on the build server, such as reading secrets from the desktopify config.prod.json file, and subsequently deploying updates to any app via a postinstall script in package.json. It is noted that no exploitation of this vulnerability has occurred.=========================== Calling Function ===Calling function: product_query with args: {"input""ToDesktop"}Got output: ToDesktop is a platform that allows you to transform your web app codebase into a cross-platform desktop application with native functionality. It supports integration with various web stacks and frameworks, enabling the creation of desktop apps for Mac, Windows, and Linux. Using ToDesktop Builder, you can quickly turn a web app into a desktop app, add native features, and customize the app using system-level APIs.=========================== Calling Function ===Calling function: product_query with args: {"input""Cursor"}Got output: Cursor is an AI-powered code editor built on VS Code, designed to enhance your development workflow. It offers features like intelligent code completion, chat for code queries, and an agent for assistance with complex development tasks. You can easily download and install Cursor from its website, and it supports importing all your VS Code extensions and settings with one click. Cursor provides a 14-day free trial of its Pro plan without requiring a credit card. The editor is customizable, allowing adjustments to both AI features and standard editor settings.========================

从日志可以看出,为了回答问题,智能体调用了三次工具。

(1)查询 CVE-2025-27554 的信息,从信息中得知软件 ToDesktop 和 Cursor

(2)查询 ToDesktop 软件信息

(3)查询 Cursor 软件信息

回答内容如下

Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化

观测平台

默认情况下,执行前面的观测平台启动代码后,观测平台地址是 http://localhost:6006

在观测平台中可以看到智能体每一步执行的追踪信息。

Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化

包括 llm chat、嵌入、以及 llama index 关键函数调用的输入与输出信息。

Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化

代码下载

后台回复 "智能体"

学习资源

立即关注【二进制磨剑】公众号

👉👉👉【IDA 技巧合集】👈👈👈
👉👉👉【Github 安全项目合集】👈👈👈
【课程完结!内容揭秘!】7 天打造 IDA 9.0 大师:从零基础到逆向精英
【课程完结!内容揭秘】第 2 期-Android 逆向内核攻防
【硬核来袭!】程序分析与反混淆【已完结】

原文始发于微信公众号(二进制磨剑):Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月3日11:26:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化https://cn-sec.com/archives/3788237.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息