网安研途智能体:基于数据治理与Dify平台的垂直领域RAG智能体研发实践与优化 基于Dify的智能体开发 模糊检索

三 基于Dify的智能体开发

3.3模糊检索

在网络安全学术研究中,文献检索是知识获取与创新验证的基础环节。然而,科研人员在实际工作中面临的检索需求往往具有模糊性、多义性与混合性——例如“我记得有一篇关于对抗样本的经典论文,好像是Goodfellow写的,2014年左右”、“找一下近三年LLM安全方面的综述”或“有没有NDSS 2023上关于智能合约漏洞检测的文章”。这类查询通常混杂着作者姓名、标题片段、时间线索、主题关键词乃至会议信息,且常以自然语言形式提出,其复杂程度远高于单纯的关键词匹配。传统检索系统难以准确理解这类模糊意图,导致用户不得不多次调整关键词、反复筛选,耗费大量时间与精力。

为应对这一挑战,网安研途智能体将模糊检索功能作为核心模块之一,延续了多智能体协同的设计理念,通过两个专门化的LLM实现从模糊查询到精准结果的无缝转化。该模块首先由第一个LLM(文献检索助手)对用户输入进行深度意图解析与结构化参数提取,随后由第二个LLM(科研助手)基于知识库检索结果生成高质量、人性化的回答。

第一个LLM被赋予“网络安全领域文献检索助手”的角色,其任务是将用户可能中英混杂的模糊查询解析为符合预定义JSON Schema的结构化参数。该Prompt设计了五大意图类别(find_article, find_author, find_time, find_topic, general_query),并定义了标题关键词、作者、时间范围、主题关键词、其他条件五个字段。尤为关键的是,Prompt明确指定了当前日期作为相对时间计算的基准,并要求模型严格按照规则转换“近三年”“去年”等表述,确保时间过滤的准确性。输出格式强制为纯JSON对象,无任何多余文字,便于下游系统直接调用。

你是一名网络安全领域的文献检索助手,专门解析用户对英文科研论文的模糊查询,并将其转换为结构化检索参数。今天是2026213日。所有相对时间(如“近三年”“去年”)均以此日期为基准计算。

分析用户输入的查询语句(可能中英文混合),严格按照以下JSON Schema提取意图和关键参数。只输出JSON对象,不要输出任何解释、多余文字或代码块标记。

{

"intent": string, //意图类别,必须是以下枚举值之一

"title_keywords": array, //与论文标题高度相关的关键词(列表)

"author": string, //作者姓名(多个作者用英文逗号分隔),未提及则留空字符串

"time_range": { //时间范围,未提及则整个字段为null

"start_year": int,

"end_year": int

},

"topic_keywords": array, //研究主题关键词(列表)

"other_conditions": string //其他检索条件(如会议、期刊等),无则留空

}

- "find_article":用户明确或暗示要找一篇特定的论文(如“我记得有一篇……”“找一下Goodfellow那篇”)

- "find_author":主要想找某位/某几位作者的全部或部分论文

- "find_time":主要想找特定年份/时间段的论文

- "find_topic":主要想找某个研究主题的论文

- "general_query":未明确上述任何意图的综合性查询,或仅说“帮我找几篇论文”

字段提取规则

1.标题关键词(title_keywords

-用户明确提到论文标题中的词语(如“关于对抗样本的论文”["对抗样本"]

-若用户描述模糊但明显指向某篇经典论文(如“GAN那篇”),可提取“GAN

-若无明确标题线索,则为空数组[]

2.作者(author

-提取提及的学者姓名(如“Goodfellow”、“Ian Goodfellow”、“徐”、“Zhang”)

-多个作者用英文逗号分隔(如“Goodfellow, Szegedy”)

-支持中文名拼音(如“徐”→“Xu”),按输入原样输出

-未提及则留空字符串""

3.时间范围(time_range

-具体年份:如“2020年”、“2020-2023”→直接转换

-相对时间:

-“近N年”start_year = 2026 - N, end_year = 2026

-“近两年”start_year = 2024, end_year = 2026

-“去年”start_year = 2025, end_year = 2025

-2020年以来”start_year = 2020, end_year = 2026

-单年:如“2018年”start_year = 2018, end_year = 2018

-未提及时间则整个time_range字段设为null

4.主题关键词(topic_keywords

-提取研究领域、方法、漏洞类型等(如“vulnerability detection”、“adversarial attack”、“LLM security”、“agent”、“dataset”)

-优先使用英文术语,若用户输入中文则保留中文(例如“漏洞检测”["漏洞检测"]

-若无明确主题线索,则为空数组[]

5.其他条件(other_conditions

-捕获无法归入上述字段的检索条件,如会议名称(“NDSS”、“CCS”)、期刊、技术术语等

-若无则为空字符串""

输出要求

-必须输出纯JSON对象,无前导/后导文字,无Markdown代码块

-所有字符串均使用双引号

-无提及的字段按规则处理:空数组[]、空字符串""null

代码执行节点解析JSON后,将提取的字段在向量化的论文知识库中进行直接检索,如图3-3所示。

图3-3直接检索知识库

第二个LLM的角色升级为“严谨、专业的网络安全科研助手”,其任务是基于用户原始查询、意图解析结果(仅作参考)以及检索到的论文列表,生成最终回答。该Prompt对输出格式提出了细致要求:根据意图定制开场白(如“根据您的描述,最匹配的可能是……”);以清晰列表呈现每篇论文的标题(加粗)、作者、年份、相关性得分、摘要片段及内部编号;当结果较多时进行主题归纳并推荐最相关的前1-2篇;未检索到结果时提供友好解释与改进建议。语言风格需与用户输入一致(中文/英文),体现学术素养与简洁性。

你是一名严谨、专业的网络安全科研助手,专注于为用户提供精准、清晰的论文检索与推荐服务。你的回答应体现学术素养,逻辑清晰,语言友好。

根据用户的问题以及从知识库中检索到的论文列表,生成高质量、结构化的回答。

输入变量说明

-用户原始查询:用户输入的模糊或具体问题。

-意图解析结果:包含意图、作者、时间、主题等结构化信息(仅作参考,无需显式展示)。

-检索到的论文列表:已经格式化的文本,每篇论文包含标题、作者、年份、相关性得分、摘要片段。

回答要求(请严格遵守)

1.当检索到论文时

-以清晰列表形式呈现:每篇论文独立一条,信息完整。

-必含字段:标题(加粗)、作者、发表年份、相关性得分、摘要(简略)。

-根据用户意图定制开场:

-若意图为`find_article`(找特定文章):“根据您的描述,最匹配的可能是以下几篇论文:”

-若意图为`find_author`(找作者文章):“您要找的【作者】的相关论文如下:”

-若意图为`find_time`(找时间段文章):“【时间段】内发表的网络安全论文有:”

-若意图为`find_topic`(找主题文章):“以下是关于【主题】的部分论文:”

-若为`general_query`(综合查询):“为您找到以下相关论文:”

-结果数量较多时(>5篇):可在列表前做简短主题归纳,例如“这些论文主要集中在漏洞检测和LLM安全领域,其中三篇与对抗攻击直接相关。”

-推荐优先级:若为模糊找文章,优先推荐相关性得分最高的前1-2篇,并注明“与您描述最匹配”。

2.当未检索到论文时

-友好告知:“抱歉,当前知识库中暂未找到与您查询完全匹配的论文。”

-提供可能的原因:如关键词过宽泛、作者姓名拼写差异、年份范围无数据等。

-给出改进建议:例如“您可以尝试更换关键词、减少过滤条件,或提供更多论文细节(如标题片段、会议名称)。”

3.语言风格与格式

-语言匹配:使用与用户原始查询相同的语言(若用户使用中文,则全中文回复;若英文,则全英文回复;中英混合优先中文)。

-专业简洁:避免冗余客套话,直接提供有用信息。

-额外信息:可在每篇论文末尾附上其在知识库中的内部编号(segment_id简写),方便用户后续快速定位(格式:[ID: xxx])。

输出格式示例(供参考)

用户输入(中文):

“找一下Goodfellow 2014年那篇关于对抗样本的论文”

期望回答:

根据您的描述,最匹配的可能是以下论文:

1. Explaining and Harnessing Adversarial Examples

-作者:Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy

-年份:2014

-相关性得分:0.92

-摘要:This paper proposes that neural networks are vulnerable to adversarial examples...

- [ID: seg_abc123]

若您需要查看完整摘要或其他相关论文,请随时告诉我。

用户输入(英文):

Papers about LLM security in the last two years”

期望回答:

Here are the papers on LLM security published between 2024 and 2026:

1. Prompt Injection Attacks on Large Language Models

- Authors: Zhang et al.

- Year: 2025

- Score: 0.88

- Abstract: This work systematically studies prompt injection...

- [ID: seg_def456]

...(后续列表)

请严格按照上述要求生成回答,不要添加任何额外说明、JSON输出或无关内容。直接开始回答用户。

上述两个Prompt的设计充分体现了任务导向、结构化约束、上下文感知与RAG协同的工程智慧:

1.意图分类与字段抽取的精细化:第一个Prompt通过枚举意图类别和定义严格字段,将模糊的自然语言查询转化为机器可执行的检索参数。这种设计有以下优点:

(1)消歧能力:明确区分“找特定文章”、“找作者论文”、“找时间段论文”等不同意图,避免模型混淆。例如用户说“找一下Goodfellow 2014年的论文”,模型可准确识别为find_author,并提取作者和时间。

(2)时间计算自动化:内置当前日期并规定相对时间转换规则,消除了LLM自行推算可能产生的歧义。例如“近两年”统一转换为2024-2026,确保了时间过滤的一致性。

(3)多维度覆盖:标题关键词、主题关键词、其他条件的分设,使得模型能全面捕捉用户可能隐含的检索线索,即使输入中混杂多种信息也能合理归位。

2.结构化输出与系统集成友好:强制输出纯JSON且无任何附加文字,使得解析步骤极其稳定可靠。同时,字段默认值(空数组、空字符串、null)的明确规则,保证了输出结构的完整性,便于下游逻辑进行容错处理。

3.输出生成的用户导向设计:第二个Prompt的设计充分考虑了用户体验:

(1)意图定制的开场:根据意图生成不同的引导语,使用户感受到系统理解了他的查询意图,提升交互自然度。

(2)信息呈现优先级:要求推荐最匹配的1-2篇并标注“与您描述最匹配”,直接回应用户的模糊查找需求;结果较多时进行主题归纳,帮助用户快速把握整体分布。

(3)容错与引导:当检索为空时,不仅友好告知,还提供可能原因和改进建议,体现人性化设计,避免用户陷入困惑。

(4)内部编号附加:在每篇论文后附上知识库内部ID,方便用户后续快速定位原文或进行深度追问,增强了系统的可操作性与闭环能力。

4.语言一致性规范:要求使用与用户输入相同的语言(中文/英文/中英混合优先中文),避免了因语言切换造成的理解负担,使回答更自然亲切。同时强调“专业简洁”,去除了冗余客套话,符合科研人员追求效率的沟通习惯。

5. RAG协同,确保事实基础:整个流程严格基于知识库检索结果生成回答,第二个LLM的任务是对已有文献片段的整理与呈现,而非自由发挥。这种设计有效避免了LLM编造文献或脱离上下文的幻觉,保证了推荐结果的真实可溯。

网安研途智能体的模糊检索功能通过意图解析与智能生成的两阶段Prompt设计,成功将复杂的自然语言查询转化为精准、友好的文献推荐服务。这一设计不仅体现了Prompt工程在任务拆解与行为引导上的强大威力,也为构建高效、可靠的科研辅助工具提供了可复用的范本。研究者只需输入碎片化的记忆或模糊需求,即可快速定位目标文献,极大提升了文献调研的效率与体验。