在上一个示例中,我们学习了如何构建 Kali 渗透智能体。本示例将进一步演示如何为智能体引入多个不同来源的知识,以增强其对特定领域的理解和回答能力。
这个例子主要的教学演示:
-
如何导入外部知识( HTML、PDF、MARKDOWN、TEXT 等格式)?
-
如何将外部知识向量化、存储,并编排进入智能体?
另外我们还将学习: Arize Phoenix 观测平台,追踪(Trace)观测智能体的思维过程。
本篇例子知识库包含的数据:
-
CVE 数据 -
软件数据
当用户向智能体查询 CVE 或软件信息时,智能体将基于知识库中的信息生成回答。
此外,智能体支持多次关联查询,例如:
★
用户提问:“CVE-2025-27554 是什么漏洞?这个漏洞将影响哪些产品?请详细介绍相关产品。”
”
智能体的查询过程:
-
先从 CVE 知识库 查找 CVE-2025-27554 的信息。 -
若 CVE 信息中提到了受影响的软件,则继续查询 产品数据知识库,获取相关软件的详细信息。 -
综合 CVE 信息和软件数据,生成最终的完整回答。
知识库是什么?
知识库是给大模型使用的外部数据源,用户使用大模型时,从知识库获取与用户提问相关的数据,llm 根据收到的知识库片段和用户提问回答问题。这种方式可以有效提升 LLM 在特定领域的准确性,避免模型依赖仅有的训练数据进行推理。
知识库能缓解什么问题
-
幻觉问题:LLM 可能会凭空捏造信息,特别是在处理专有领域资料、内部资料或者实时性强的资料时,知识库可以提供可靠的外部数据支撑,减少错误回答的概率。 -
基座模型训练资料过时问题:LLM 训练数据通常有时间滞后性,无法获取最新信息,而知识库可以持续更新,确保回答的时效性。 -
上下文窗口限制问题:LLM 的输入长度有限,无法一次性提供大量背景信息,而知识库可以按需检索相关内容,减少冗余输入,提高交互效率。 -
.......
知识库建立与召回流程
建立知识库:(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 3, 2024, 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 软件信息
回答内容如下
观测平台
默认情况下,执行前面的观测平台启动代码后,观测平台地址是 http://localhost:6006
在观测平台中可以看到智能体每一步执行的追踪信息。
包括 llm chat、嵌入、以及 llama index 关键函数调用的输入与输出信息。
代码下载
后台回复 "智能体"
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):Deepseek 动手开发安全智能体——(2) CVE 分析智能体 | 知识库 | 向量化
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论