在前几章中,我们介绍了 Haystack 和基于 Python 的智能应用。虽然 Python 是数据科学家首选的语言框架,但在某些场景下,我们可能需要其他框架来构建解决方案。另一个广泛使用的语言框架是 Java。Java 比 Python 更快,能够无缝集成各种数据源,并且是构建基于 Web 应用(结合 Spring 框架)的最常用语言。基于此,接下来的几章我们将探讨如何基于大语言模型(LLMs)和 Neo4j 构建智能应用。
此外,我们一直专注于利用 LLM 的能力构建智能搜索应用,但这只是 LLM 的一方面;LLM 同样是构建和利用知识图谱以提升推荐系统的重要工具。本章将帮助你理解推荐系统及个性化推荐的重要性。我们将简要介绍传统的基于规则的推荐方法及其不足之处,随后介绍 LangChain4j 和 Spring AI 框架,以及它们如何助力构建智能推荐系统。
本章主要内容包括:
- 理解 Neo4j 扩展能力以构建智能应用
- 个性化推荐
- 介绍 Neo4j 的 LangChain4j 和 Spring AI 框架
- Neo4j GenAI 生态中智能推荐系统概览
技术要求
本章聚焦个性化推荐并介绍 LangChain4j 与 Spring AI 框架,暂无特定技术要求。
不过,如果你对 Spring 应用不熟悉,可以参阅官方文档 spring.io/guides/gs/s…,熟悉Spring Boot。接下来几章我们将使用内置 Web 框架的 Spring Boot 应用。此外,你需要在系统中安装 Java,推荐使用 Java 17 或 19 版本。
理解 Neo4j 的扩展能力以构建智能应用
在前几章中,我们探讨了如何使用大语言模型(LLMs)和 Neo4j 构建优秀的搜索应用。虽然知识图谱为构建智能搜索应用提供了良好的上下文,但它们同样是构建个性化推荐应用的坚实基础。
为了从数据中提取智能,构建超越基础流程分析的更智能应用,我们需要的不仅仅是图数据库的功能。这时,Neo4j 作为数据库的多种能力可以帮助我们构建更出色的应用。
以下是 Neo4j 部分能力的介绍:
- 可扩展性:Neo4j 支持构建大规模图谱,利用分片技术构建联合图,以处理大数据集。它能够随数据增长和业务需求扩展,同时尽可能降低成本。详情见:neo4j.com/docs/operat…
- 安全性:Neo4j 通过角色机制保障数据安全。角色控制数据库的读写权限,还可实现基于角色的更细粒度数据访问控制。这样不同用户根据分配的角色,能查看图的不同部分。详情见:neo4j.com/docs/operat…
- 灵活的部署架构:Neo4j 的集群架构提供多种选项,可横向扩展以处理更大读写量,并将读取请求本地化到不同服务器,最大限度降低拥有成本。详情见:neo4j.com/docs/operat…
- 图数据科学算法:Neo4j 图数据科学算法能从连接数据中挖掘隐藏洞见。算法涵盖路径查找、节点相似度、中心性分析、社区检测以及机器学习相关任务如链路预测和节点分类。详情见:neo4j.com/docs/graph-…
- 向量索引:Neo4j 提供向量索引功能,可以对向量嵌入建立索引,以便查找相似节点,并结合图遍历获得更精准结果。详情见:neo4j.com/docs/cypher…
作为图数据库,Neo4j 让我们轻松操作连接数据,而上述能力则超越了简单连接数据,助力构建可扩展且复杂的智能应用。
注意
如果你想了解搜索系统和推荐系统的区别,以下文章或许有帮助:
- 搜索与推荐的区别:medium.com/understandi…
- 搜索和推荐的相同点与不同点:gist.github.com/veekaybee/2…
在接下来的章节中,我们将利用 Neo4j 的能力构建智能推荐系统。在此之前,让我们先讨论推荐引擎是什么,以及个性化如何帮助打造智能推荐系统。
个性化推荐
推荐系统是一种基于用户购买和搜索偏好向用户推荐产品的应用。这种应用不仅限于产品展示,也被用于医疗诊断和治疗中。例如,推荐系统可以帮助了解患者对药物的反应以及哪种治疗方案更有效。
随着数据量和可选产品数量的增长,理解用户行为并提供最个性化推荐的能力变得越来越重要。
以下是一些构建个性化体验的策略:
- 构建用户画像:通过理解用户行为构建定制的用户画像。行为模式可以包括用户在一定时间内的交易顺序或事件结果,以及年龄、种族、性别等其他属性。我们可以利用这些信息将用户细分为不同群体,并为每个群体创建画像。
- 提供上下文支持:在获得用户画像后,应能为用户提供更有意义和上下文相关的支持。例如,基于用户最近购买的产品推荐下一件商品,或根据当前治疗阶段和症状推荐下一步用药。这些推荐不仅考虑最近发生的事件,还能结合其他用户属性,提供更精准的支持。
- 提供自助体验:除了按需的上下文支持,还可以利用推荐系统提供更满意的自助服务体验。用户应能更改推荐时考虑的特征,使系统能够根据用户的变化灵活调整响应。
- 纳入反馈:结合上述策略,可以集成正面和负面反馈,使系统能根据个体用户的需求动态调整。
个性化推荐有诸多优势,包括基于当前浏览内容推荐下一产品、基于用户行为提供激励、提升品牌声誉、优化患者治疗方案、提高新药营销效率、改善供应链流程以及优化配送路线。这些定制化建议使企业能为客户提供更相关、更有影响力的体验。
这些仅是推荐系统的部分应用。其他有趣的用例包括提升销售(neo4j.com/developer-b…)、供应链管理(neo4j.com/developer-b…)以及患者旅程绘制(www.graphable.ai/blog/patien…)。
接下来,我们来看传统基于规则的推荐系统,以及为何这种方法难以满足智能和个性化推荐的需求。
传统方法的局限性
传统推荐系统多采用基于规则的方式。规则系统通过执行一系列基于输入数据的规则来做决策,规则可简单也可复杂。例如,在某些地区,信用卡交易金额超过1000美元时会自动拒绝;更复杂的规则可能是当一次小额交易成功后,尝试更大金额交易时拒绝。
基于规则的系统通常有两类规则:
- 静态规则:规则由人工配置,一旦设置生效,系统可高效执行。适合需要快速响应且资源消耗低的场景,规则形式可简单如基于输入返回固定值的条件判断。
- 动态规则:更复杂的规则引擎,决策可能依赖当前决策树状态和下一步输入。
基于规则系统的优点包括:
- 一致性:对于相同输入,输出始终一致。
- 可扩展性:能够很好地应对数据和复杂度的增长。
- 高效性:资源消耗低,系统成本较小。
- 易维护:构建和维护相对简单,便于管理。
典型应用场景包括反欺诈和网络安全。
但这些系统存在不足:
- 复杂性:随着业务需求增加,规则系统可能变得非常复杂,若无良好管理,优势会逐渐丧失。
- 僵化性:系统难以适应新数据类型和场景,即使识别出新场景,编码和配置也可能耗时过长,难以快速响应。
- 业务需求适应难:系统调整以满足不断增长的业务需求往往代价高昂。
由此可见,随着业务发展,依赖规则系统面临选择受限的问题。构建能适应新数据点和复杂性的智能应用,提供更好的上下文支持和个性化推荐变得尤为重要。这样的系统应能快速适应环境、数据及新需求的变化。
这正是 Neo4j 作为图数据库及其相关技术栈帮助我们构建智能推荐系统的优势所在。接下来让我们了解具体方法。
介绍 Neo4j 的 LangChain4j 和 Spring AI 框架
为了构建智能应用,我们可以利用围绕 Neo4j 提供的多个框架。针对智能推荐系统这一具体用例,我们将重点介绍 Java 语言的 Spring AI 和 LangChain4j 框架。
LangChain4j
LangChain4j(github.com/langchain4j…)是一个受流行的 Python LangChain 框架启发的 Java 框架,用于在 Java 中构建大语言模型(LLM)应用。它的目标是简化将 LLM API 集成到 Java 应用中的流程。为此,LangChain4j 构建了一个融合了 LangChain、Haystack、LlamaIndex 等概念的统一 API,并加入了自己的特色,方便构建复杂应用。
以下是它实现目标的几个关键点:
- 统一 API:各大 LLM 提供商(如 OpenAI、Google Gemini)拥有自己的专有 API,向量存储如 Neo4j、Pinecone、Milvus 也有各自的存储与检索接口。LangChain4j 提供统一 API,隐藏复杂性,使开发更便捷。
- 丰富工具箱:LangChain 社区总结了各种构建 LLM 应用的模式、抽象和技术,并将大量现成示例封装成工具包,包括低阶提示模板、聊天记忆管理、AI 服务和检索增强生成(RAG)。大部分示例可直接集成到其他应用。
LangChain4j 具备以下特性,有助于构建智能应用:
- 超过 15 个 LLM 提供商:提供简单 API 轻松集成各种语言模型。详情见:docs.langchain4j.dev/category/la…。
- 超过 20 个向量存储:支持存储和查询向量嵌入。向量存储 API 见:docs.langchain4j.dev/tutorials/e…。
- AI 服务:提供低阶 API 直接调用 LLM 和向量存储,也提供更高阶的流程式 API,将 LLM、向量存储、嵌入模型和 RAG 组成管道,简化使用。AI 服务文档:docs.langchain4j.dev/tutorials/a…。我们将在后续章节使用 AI 服务。
- RAG 支持:提供索引和检索阶段的 RAG 功能,内置简易 RAG 功能便于快速入门。详情见:docs.langchain4j.dev/tutorials/r…。
LangChain4j 与 Spring 框架集成良好,但 Apache Spring 也开发了类似 LangChain4j 的独立 AI 集成框架——Spring AI,下面我们来了解它。
Spring AI
Spring AI 受 LangChain4j 和 LlamaIndex 启发。LangChain4j 支持简单的 Java 和 Spring 应用,而 Spring AI 针对 Spring 框架进行了优化。这意味着熟悉 Spring 的开发者可以更快速轻松地开发 LLM 应用。
由于 Spring 框架提供了多个连接各种数据库的模块和标准化编码模式,被广泛使用,Spring AI 使开发者能更容易采用和快速构建 AI 应用。Spring AI 的一些关键功能包括:
- LLM 提示模板:提供简单 API,轻松集成 LLM。
- 嵌入模型:通过配置集成多种嵌入模型引擎,生成向量嵌入。
- 向量存储:提供简单 API 存储和查询向量数据,支持基于配置快速连接 Neo4j、Pinecone、Milvus 等向量存储。
- RAG 功能:可将 LLM 提示模板、嵌入模型和向量存储串联,构建高效的 RAG 应用。
LangChain4j 和 Spring AI 框架均提供与 LLM 聊天模型、提示模板、嵌入模型及向量存储集成的核心 API。它们不仅提供底层系统通信的接口,还通过高阶 API(如 RAG 框架 API)简化构建更复杂应用的过程。
为什么选择基于 Java 的框架?
Python 中有许多可以与 Neo4j 配合使用的框架,但许多应用程序仍然采用 Java 框架。这些框架提供了连接各种数据源的手段,并利用丰富的软件包构建复杂应用。
这些框架支持多种向量存储,如 Neo4j,也支持多个大语言模型(LLM)提供商,如 Amazon Bedrock、Azure OpenAI、Google Gemini、Hugging Face 和 OpenAI。它们提供从简单任务(如格式化输入和解析 LLM 输出)到复杂功能(如聊天记忆、工具和检索增强生成 RAG)的高级 AI 能力。
结合 Neo4j,这些框架使构建更复杂的应用更为容易,例如使用 LLM 为图特征(路径等)生成向量嵌入,进而通过相似度和社区检测算法增强图结构,将节点分群。这种分群可为更高级的推荐系统及其他功能提供基础。你可以在 neo4j.com/labs/genai-… 了解更多关于 Neo4j GenAI 生态系统的信息。
Neo4j GenAI 生态系统中智能推荐系统概览
下面我们来看基于 LLM/RAG 原则构建的推荐系统在 Neo4j GenAI 生态系统中的工作原理(见图 7.1)。
我们可以利用这些框架的特性来构建基于知识图谱支持的 RAG 应用。在该架构中,我们利用 Spring AI 应用来增强图谱,以提供更个性化的推荐。
此外,对于 RAG,架构可以同时利用向量索引和图遍历来增强响应,实现两者优势的结合,从而获得更准确的结果。这一概念称为图 RAG(Graph RAG)。知识图谱能够为 AI 模型交互带来更准确的响应、更丰富的上下文和更强的可解释性。Neo4j 可以集成到 LangChain4j 和 Spring AI 中,既作为向量存储,也作为图数据库,用于增强 LLM 的响应。
总结
本章我们探讨了 Neo4j 的能力如何帮助构建智能应用,为什么这些应用提供的个性化推荐很有价值,以及它们与传统基于规则的应用有何不同。我们还介绍了 Spring AI 和 LangChain4j 以及它们构建智能应用的能力。
在下一章(第8章),我们将基于 H&M 数据集构建图数据模型,以支持智能和个性化推荐,并了解如何将这些数据加载到图数据模型中以实现推荐目标。本书第9章将指导你如何将该智能推荐系统与 Spring AI 和 LangChain4j 框架集成。