前言

随着大模型的火热,自己也尝试学习了下,顺便搞了一个网络安全垂直行业的AI搜索引擎SECSOSO 安全搜搜,整体看起来效果还不错,特别是一些专用的搜索结果,如安全脑图、安全paper等。

最近也有一些朋友感兴趣我是怎么实现的,可能暂时不准备开源(当然,你财大气粗可以直接买了😂),但是还是把实现的思路给大家讲讲。

AI搜索引擎

整个项目Web框架是Vue3+FastAPI来实现的前后端(UI框架用的Tailwind),容器化部署,直接用Github Action进行部署操作。这部分属于基础的Web开发,就不多展开了。

至于核心的AI搜索引擎部分,其实就是LLM+RAG技术,其中LLM直接调用的API,用的月之暗面的 moonshot-v1-8k(KIMI),为什么没有自己私有化部署个大模型,其实也尝试过用Ollma搭建过,但性能不行,如果堆资源,成本又太高,最终采用性价比较高的国产LLM API调用方式(没有横向测评其他LLM,大家自己可以试试)。

关于RAG技术这里也不做科普,大家可以自行参考网上文章,如https://aws.amazon.com/cn/what-is/retrieval-augmented-generation/,最近有关注到一些新的RAG方法,以及KAG、RAG+COT等,还没来得及去研究和尝试,大家可以自己试试看看效果。

了解完基础知识后,学习搭建AI搜索引擎的最好方式,我觉得是看开源项目,网上有一些开源项目,大家可以直接参考,自己搭建一个AI搜索引擎不是什么问题:

核心模块与实现逻辑

了解完AI搜索引擎,大家应该得出其架构,除了LLM + RAG,应该发现还有个核心的东西是元素数搜索引擎,一般是SearXNG或者你也可以调用Google等搜索引擎的API;它是作为RAG检索增强的内容来源提供给LLM。

而SECSOSO与通用AI搜索引擎不同,你会发现他的内容更针对网络安全,特别是使用技巧中特别说明的几种类别或搜索意图,它是能识别你的搜索意图直接返回更直接的如最新安全漏洞、PoC等结果,所以SECSOSO不是直接使用通用的元数据搜索引擎作为增强内容,有定制了自己的知识库及元数据搜索引擎,增加了意图识别逻辑,针对不同类型内容在Prompt中定制了格式要求等。

所以SECSOSO的核心模块其实是有几部分:
1、LLM 及 LLM Prompt
2、RAG的内容及知识库
3、意图识别及调用逻辑

LLM 及 Prompt

LLM在上面内容已经提及,这种重点说下Prompt。SECSOSO主要包含以下几个核心的Prompt:

  1. 生成更多问题,这与通用AI搜索引擎没有太大区别,可参考开源项目
  2. 意图识别 Prompt,根据用户提问识别问题类型(可参考SECSOSO说明),精简问题和提取关键词(关键词在一些场景需要用到,如搜索某个组件漏洞,提问是一句话,真正查询就是组件名)
  3. 提问Prompt,主prompt,RAG对象,包含对不同类型内容做格式的要求

RAG的内容及知识库

最基本的部分使用的是SearXNG,由于网络问题,需要使用bing的中文引擎(需要修改SearXng的代码,默认可能国内访问不到,或者将SearXng搭建在可以国外机器上),作为通用搜索引擎,提供最基本的RAG内容;不过其实现在一些LLM本身也支持联网搜索,所以这个部分其实不一定需要,但如果前端需要展示引用来源,一般LLM API不会返回这部分引用来源链接,前端如果有展示需要,就还是要做这一步。

到此还是通用的AI搜索引擎,如果作为网络安全垂直行业,就需要独立的内容,这里我采用的方式有两种:

  1. 基于appsearch(可以理解为类似ES)进行通用安全知识库的检索,主要用于存储一些通用的安全知识,如不同漏洞类型的说明和修复方案等,需要手动填充内容
  2. 专用搜索引擎,基于SearXNG自己添加引擎脚本,收集一些行业平台,如Freebuf,封装搜索功能,集成SearXNG,并自定义类别,如我定义了安全漏洞类别,然后封装了sec.cafe和vulmon.com作为这个两个专用搜索引擎并设置权重(这部分怎么基于SearXng封装,大家需要了解下SearXng的原理)

三者的优先级是基于意图识别,如果命中已定义类别,优先取专用搜索引擎结果,其次是安全知识库,都没命中再取通用搜索引擎结果保证问题回答的输出。

意图识别与调用逻辑

整体的调用逻辑分为以下几步:
1、识别用户提问的意图,定义问题类别
2、特殊类型调用特殊处理逻辑,如最新漏洞,直接调用SEC.CAFE的API获取结果
3、其他类型,调用对应分类的专用搜索引擎(不同引擎有权重,需要根据效果微调)与安全知识库,都没命中则调用通用搜索引擎
4、将内容结果组合到提问 Prompt 中,对 LLM 发起调用
5、调用LLM生成更多问题
6、使用服务器推送事件方法将结果实时展示在前端并做markdown渲染

问题及优化方向

  1. 如何优化Prompt和更好的RAG方式,如上文提到的各种RAG方式,让效果更好,这部分还有待进一步研究
  2. Prompt token 压缩,减少LLM API花费,如 LLMLingua 等方法,暂时调用量还没那么大,而且这类方法依赖于算法、模型实现,本身也有机器资源要求,成本较高,暂时不考虑
  3. 内容的持续更新维护,特别是安全知识库,需要花费心思
  4. 搜索的速度问题,由于调用逻辑存在多个API调用,也就是后端网络请求较多,所以速度相对没那么快,当前是前端做了一些提示,后续会再优化逻辑,看看怎么优化结构减少非必要请求