LangChain4j之RAG
RAG (检索增强生成)LLM 的知识仅限于它已经训练过的数据。 如果你想让 LLM 了解特定领域的知识或专有数据,你可以: 使用 RAG,我们将在本节中介绍 用你的数据微调 LLM 结合 RAG 和微调 什么是 RAG?简单来说,RAG 是一种在发送给 LLM 之前,从你的数据中找到并注入相关信息片段到提示中的方法。 这样 LLM 将获得(希望是)相关信息,并能够使用这些信息回复, 这应该会降低产生幻觉的概率。 相关信息片段可以使用各种信息检索方法找到。 最流行的方法有: 全文(关键词)搜索。这种方法使用 TF-IDF 和 BM25 等技术, 通过匹配查询(例如,用户提问的内容)中的关键词与文档数据库进行搜索。 它根据每个文档中这些关键词的频率和相关性对结果进行排名。 向量搜索,也称为”语义搜索”。 文本文档使用嵌入模型转换为数字向量。 然后根据查询向量和文档向量之间的余弦相似度 或其他相似度/距离度量找到并排序文档, 从而捕捉更深层次的语义含义。 混合搜索。结合多种搜索方法(例如,全文 + 向量)通常可以提高搜索的有效性。 目前,本页主要关注向量搜索...
LangChain4j之函数调用
工具(函数调用)一些 LLM 除了生成文本外,还可以触发操作。 有一个被称为”工具”或”函数调用”的概念。 它允许 LLM 在必要时调用一个或多个可用的工具,通常由开发者定义。 工具可以是任何东西:网络搜索、调用外部 API 或执行特定代码片段等。 LLM 实际上不能自己调用工具;相反,它们在响应中表达调用特定工具的意图(而不是以纯文本形式响应)。 作为开发者,我们应该使用提供的参数执行这个工具,并将工具执行的结果反馈回来。 例如,我们知道 LLM 本身在数学计算方面并不擅长。 如果您的用例涉及偶尔的数学计算,您可能希望为 LLM 提供一个”数学工具”。 通过在请求中向 LLM 声明一个或多个工具, 如果它认为合适,它可以决定调用其中一个工具。 给定一个数学问题和一组数学工具,LLM 可能会决定为了正确回答问题, 它应该首先调用提供的数学工具之一。 让我们看看这在实践中是如何工作的(有工具和没有工具的情况): 没有工具的消息交换示例: 12345678请求:- 消息: - UserMessage: - 文本:475695037565 的平方根是多少?响应:...
LangChain4j之高阶api
AI Services到目前为止,我们一直在介绍底层组件,如 ChatLanguageModel、ChatMessage、ChatMemory 等。 在这个层面上工作非常灵活,给予您完全的自由,但也迫使您编写大量的样板代码。 由于 LLM 驱动的应用程序通常不仅需要单个组件,还需要多个组件协同工作 (例如,提示模板、聊天记忆、LLM、输出解析器、RAG 组件:嵌入模型和存储) 并且经常涉及多次交互,协调所有这些组件变得更加繁琐。 我们希望您专注于业务逻辑,而不是低级实现细节。 因此,LangChain4j 中目前有两个高级概念可以帮助您:AI 服务和链。 Chains (legacy)链的概念源自 Python 的 LangChain(在引入 LCEL 之前)。 其思想是为每个常见用例(如聊天机器人、RAG 等)提供一个 Chain。 链组合多个低级组件并协调它们之间的交互。 它们的主要问题是,如果您需要自定义某些内容,它们过于僵化。 LangChain4j 只实现了两个链(ConversationalChain 和 ConversationalRetrievalChain)...
LangChain4j之会话记忆
聊天记忆手动维护和管理ChatMessage是很麻烦的。 因此,LangChain4j提供了ChatMemory抽象以及多种开箱即用的实现。 ChatMemory可以作为独立的低级组件使用, 或者作为高级组件(如AI服务)的一部分。 ChatMemory作为ChatMessage的容器(由List支持),具有以下额外功能: 淘汰策略 持久化 对SystemMessage的特殊处理 对工具消息的特殊处理 记忆与历史请注意,”记忆”和”历史”是不同的概念。 历史保持用户和AI之间的所有消息完整无缺。历史是用户在UI中看到的内容。它代表实际对话内容。 记忆保存一些信息,这些信息呈现给LLM,使其表现得好像”记住”了对话。 记忆与历史有很大不同。根据使用的记忆算法,它可以以各种方式修改历史: 淘汰一些消息,总结多条消息,总结单独的消息,从消息中删除不重要的细节, 向消息中注入额外信息(例如,用于RAG)或指令(例如,用于结构化输出)等等。 LangChain4j目前只提供”记忆”,而不是”历史”。如果您需要保存完整的历史记录,请手动进行。 淘汰策略淘汰策略是必要的,原因如...
LangChain4j入门
1.什么是LangChain4JLangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 具体方式如下: 统一 API: LLM 提供商(如 OpenAI 或 Google Vertex AI)和嵌入(向量)存储(如 Pinecone 或 Milvus) 使用专有 API。LangChain4j 提供统一的 API,避免了学习和实现每个特定 API 的需求。 要尝试不同的 LLM 或嵌入存储,您可以在它们之间轻松切换,无需重写代码。 LangChain4j 目前支持 15+ 个流行的 LLM 提供商 和 20+ 个嵌入存储。 全面的工具箱: 自 2023 年初以来,社区一直在构建众多 LLM 驱动的应用程序, 识别常见的抽象、模式和技术。LangChain4j 将这些提炼成一个即用型包。 我们的工具箱包含从低级提示模板、聊天记忆管理和函数调用 到高级模式如代理和 RAG 的工具。 对于每个抽象,我们提供一个接口以及基于常见技术的多个即用型实现。 无论您是在构建聊天机器人还是开发包含从数据摄取到检索完整管道的 RAG, LangChain4j 都提供多...
Springboot集成ES
Springboot集成ESES的Java客户端1. 早期阶段:Transport Client(基于 TCP) 出现版本:ES 早期版本(1.x ~ 6.x) 工作方式 基于 内部 TCP 协议 与 ES 节点通信 客户端必须与 ES 集群版本完全一致(主版本、次版本、修订版本) 优点 性能较高(长连接,无 HTTP 解析开销) 缺点 版本耦合度高,升级风险大 API 不统一,学习成本高 安全性弱(没有原生 HTTPS 支持) 状态 ES 7.x 标记为 废弃 ES 8.x 完全 移除 2. 中期阶段:High Level REST Client(HLRC) 出现版本:ES 5.0 引入,7.x 成为主力 工作方式 基于 HTTP/REST API 通信 通过封装好的 Java API 构造请求、解析响应 优点 版本兼容性更宽松(主版本一致即可) 支持 HTTPS 和各种认证方式 功能覆盖大部分 ES 操作 缺点 API 设计较老,非类型安全(依赖字符串和 Map) 构建复杂查询时容易出错 对 ES 8.x 新特性支持有限 状态 E...
ElasticSearch基本操作
ElasticSearch基本操作 es对文档的基本RestFul操作汇总 操作类型 请求方式 URL 格式 说明 示例 创建文档 PUT /{index}/_doc/{id} 指定 ID 创建文档,若 ID 已存在则覆盖 PUT /users/_doc/1携带 JSON 文档:{"name":"张三","age":30} 创建文档(自动生成 ID) POST /{index}/_doc 不指定 ID,ES 自动生成唯一 ID POST /users/_doc携带 JSON 文档:{"name":"李四","age":25} 查看文档 GET /{index}/_doc/{id} 通过 ID 查询单个文档 GET /users/_doc/1 更新文档(全量替换) PUT /{index...
ElasticSearch核心概念
ES核心概念 ElasticSearch是面向文档的,与关系型数据库对比如下 关系型数据库 es 数据库(databases) 索引(indices) 表(tables) types 行(rows) documents 字段(columns) fields es(集群)中包含多个索引,每个索引可以包含多个类型,每个类型下又包含多个文档,文档又包含多个字段。 物理设计: es把每个索引划分为多个分片,每个分片可以在集群的不同服务器间迁移,一个es节点就是一个集群。 逻辑设计: 一个索引当中,包含多个文档,可以通过索引->类型->文档ID索引到到某个具体的文档 文档 文档是索引和搜索数据的最小单位,以JSON格式存储,具备天然的灵活性,无需预先严格定义,但是文档中每个字段的类型非常重要,es会保存字段与类型间的映射 类型 类型是文档的逻辑容器,就像关系型数据库的表一样,类型对字段的定义称为映射,类型的概念逐渐被抛弃,高版本的es中一个索引只包含一个类型:_doc 索引 索引是类型的容器,或者说文档的集合,索引存储了映射类型的字...
Linux
Linux基础命令Linux的目录结构 /,根目录是最顶级的目录了 Linux只有一个顶级目录:/ 路径描述的层次关系同样适用/来表示 /home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txt ls命令功能:列出文件夹信息 语法:ls [-l -h -a] [参数] 参数:被查看的文件夹,不提供参数,表示查看当前工作目录 -l,以列表形式查看 -h,配合-l,以更加人性化的方式显示文件大小 -a,显示隐藏文件 隐藏文件、文件夹在Linux中以.开头的,均是隐藏的。 默认不显示出来,需要-a选项才可查看到。 pwd命令功能:展示当前工作目录 语法:pwd cd命令功能:切换工作目录 语法:cd [目标目录] 参数:目标目录,要切换去的地方,不提供默认切换到当前登录用户HOME目录 HOME目录每一个用户在Linux系统中都有自己的专属工作目录,称之为HOME目录。 普通用户的HOME目录,默认在:/home/用户名 root用户的HOME目录,在:/root FinalShell登...
MyBatisPlus扩展功能
3.扩展功能3.1.代码生成在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用,也很麻烦。 这里推荐大家使用一款MybatisPlus的插件,它可以基于图形化界面完成MybatisPlus的代码生成,非常简单。 3.1.1.安装插件在Idea的plugins市场中搜索并安装MyBatisPlus插件, 然后重启你的Idea即可使用。 3.1.2.使用刚好数据库中还有一张address表尚未生成对应的实体和mapper等基础代码。我们利用插件生成一下。 首先需要配置数据库地址,在Idea顶部菜单中,找到other,选择Config Database 在弹出的窗口中填写数据库连接的基本信息 然后再次点击Idea顶部菜单中的other,然后选择Code Generator 在弹出的表单中填写信息 最终,代码自动生成到指定的位置了: 3.2.静态工具有的时候Service...