From f149127292b8e126739a8abc11fcef01220f0b1d Mon Sep 17 00:00:00 2001 From: "yuanjs@qutke.com" Date: Wed, 14 May 2025 18:57:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1375 ++++++++++++----------------------------------------- 1 file changed, 297 insertions(+), 1078 deletions(-) diff --git a/README.md b/README.md index d13ba4f..008c18b 100644 --- a/README.md +++ b/README.md @@ -3706,7 +3706,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 大模型IO交互链路概览 -![image-20250301152117731](D:/学习/笔记/img/image-20250301152117731.png) +![image-20250301152117731](/img/image-20250301152117731.png) * LangChain模块对比大家熟知的Java Spring生态 @@ -3817,7 +3817,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 大模型使用开发的Model IO链路核心三要素 - ![1](D:/学习/笔记/img/1.png) + ![1](/img/1.png) | 组件 | 作用 | 典型类/方法 | | :---------: | :------------------------: | :-------------------------------------------: | @@ -3825,7 +3825,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ | **Models** | 对接不同LLM服务的统一接口 | `ChatOpenAI` | | **Parsers** | 将模型输出转换为结构化数据 | `StrOutputParser`, `JsonOutputParser` | - ![image-20250301152117731](D:/学习/笔记/img/image-20250301152117731.png) + ![image-20250301152117731](/img/image-20250301152117731.png) * LangChain支持的模型类型说明 @@ -3843,11 +3843,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 典型模型:GPT-4V、Qwen-omni-turbo * 其他更多.... - - * LangChain开发LLM聊天模型快速编码实战 - ``` + ```python from langchain_openai import ChatOpenAI # 调用Chat Completion API @@ -3859,21 +3857,12 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(response) ``` - - - - - - - -#### 第6集 类型增强模块Typing应用和案例实战《上》 - -**简介: 类型增强模块Typing应用和案例实战《上》** +#### 类型增强模块Typing应用和案例》 * Python的动态类型痛点 - ``` + ```python # 传统动态类型代码示例 def calculate(a, b): return a + b # 无法直观看出参数类型和返回值类型 @@ -3910,8 +3899,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ data: bytes = b"binary" # 字节类型 ``` - - * 容器类型 * 有多种内置的类型别名,比如`List`、`Tuple`、`Dict`等,可用于注解变量和函数的预期类型 @@ -3920,76 +3907,65 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * `Dict[str, int]`表示键是字符串类型,值是整数类型的字典 * `Set[int]`表示整数类型的集合 - + * `List`同质元素的序列容器 * 适用场景:列表类型数据,元素类型相同 - ``` + ```python from typing import List - scores: List[int] = [90, 85, 95] # 整型列表 matrix: List[List[float]] = [[1.1, 2.2], [3.3]] # 嵌套列表 ``` - + * `Dict` 键值对映射容器 - + * 适用场景:字典类型数据,需指定键值类型 - - ``` + + ```python from typing import Dict - person: Dict[str, str] = {"name": "Bob", "job": "dev"} # 字符串字典 config: Dict[str, Union[int, str]] = {"timeout": 30} # 混合值类型 - ``` - + * `Tuple`固定长度、类型的不可变序列 - - * 适用场景:坐标、数据库记录等固定结构 - * 变长声明:`Tuple[T, ...]`:元素类型相同但长度不限 , ():空元组 - - - ``` - from typing import Tuple + + - 适用场景:坐标、数据库记录等固定结构 + - 变长声明:`Tuple[T, ...]`:元素类型相同但长度不限 , ():空元组 + ```python + from typing import Tuple point: Tuple[float, float] = (3.14, 2.71) # 二元坐标 rgb: Tuple[int, int, int] = (255, 0, 128) # 颜色值 flexible: Tuple[str, ...] = ("a", "b", "c") # 任意长度元组 ``` - + * `Set` 无序不重复元素的集合 - * 适用场景:去重数据、集合运算 + - 适用场景:去重数据、集合运算 - ``` + ```python from typing import Set - unique_ids: Set[int] = {1, 2, 3} # 整型集合 tags: Set[Union[str, int]] = {"urgent", 1001} # 混合类型集合 ``` - - -​ - - * 任意类型 `Any` - - * 动态类型占位符,放弃类型检查, 应尽量避免过度使用 - * 适用场景:兼容无类型代码或动态行为 - - ``` - from typing import Any - def debug_log(obj: Any) -> None: - print(repr(obj)) + * 任意类型 `Any` - ``` + - 动态类型占位符,放弃类型检查, 应尽量避免过度使用 + - 适用场景:兼容无类型代码或动态行为 + + ```python + from typing import Any + def debug_log(obj: Any) -> None: + print(repr(obj)) + ``` * 函数类型注解 * 为函数添加typing模块的注解后,函数使用者就能清晰的了解函数的参数以及返回值类型 - ``` + ```python def greet(name: str) -> str: # 参数类型 -> 返回值类型 return f"Hello, {name}" @@ -4006,7 +3982,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 精确值类型约束, 替代简单字符串枚举 * 适用场景:枚举值的类型安全 - ``` + ```python from typing import Literal # 限定特定值 @@ -4019,32 +3995,12 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ send_request("PATCH", "/api") # ❌ mypy报错 ``` - - - - - - - - - - - - - - - - -#### 第7集 类型增强模块Typing应用和案例实战《下》 - -**简介: 类型增强模块Typing应用和案例实战《下》** - * `Union`联合类型 * Union允许参数接受多种不同类型的数据。 * 例如 `Union[int, float]`表示变量可以是int类型或float类型 - ``` + ```python from typing import Union def process_input(value: Union[int, str]) -> None: @@ -4068,7 +4024,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * `= None`可省略,它表示默认参数。 * 从 Python 3.10 开始,Optional[Type] 可以直接用 `Type | None` 替代,写法更清晰 - ``` + ```python from typing import Optional def greet1(name: Optional[str] = None) -> str: @@ -4095,7 +4051,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 自定义类型别名提高代码可读性。 - ``` + ```python from typing import Tuple # 基本别名 @@ -4115,7 +4071,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 创建具有类型检查的语义化新类型 * 适合 区分相同基础类型的不同用途 - ``` + ```python from typing import NewType # 创建强类型 @@ -4135,7 +4091,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 创建通用类型参数 * 适用场景:泛型函数/类的类型参数化;比如创建一个函数,无论是处理整数、字符串还是自定义对象 - ``` + ```python from typing import TypeVar, Sequence T = TypeVar('T') # 无约束类型 @@ -4148,7 +4104,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ return sum(values) ``` - ``` + ```python from typing import TypeVar # 定义一个泛型变量T @@ -4169,34 +4125,12 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(get_first_item(words)) # 输出: apple ``` - - - - - - - - - - - +### Prompt提示词工程和案例最佳实践 - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十一章 Prompt提示词工程和案例最佳实践 - - - -#### 第1集 大模型必备Prompt提示词工程 - -**简介: 大模型必备Prompt提示词工程讲解** +#### 大模型必备Prompt提示词工程 * 什么是Prompt Engineering提示词工程 @@ -4211,12 +4145,12 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 大模型就是你的员工,你可以有多个助手,OpenAI、DeepSeek、千问等 * 作为老板的你,需要正确的下达任务,描述合理和交付目标等 - ``` + ```python 传统编程:写代码→计算机执行 Prompt工程:写自然语言指令→大模型生成结果 ``` - ![image-20250304142514844](D:/学习/笔记/img/image-20250304142514844.png) + ![image-20250304142514844](/img/image-20250304142514844.png) * Prompt设计四要素 @@ -4224,7 +4158,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 作用:限定模型回答视角 - ``` + ```python [差] 写一首关于春天的诗 [优] 你是一位擅长写现代诗的诗人,请用比喻手法创作一首8行的春天主题短诗 ``` @@ -4233,7 +4167,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * STAR原则:Situation 场景、Task 任务、Action 行动、Result 结果 - ``` + ```python (场景)用户提交了一个技术问题 (任务)需要给出准确且易懂的解答 (行动)分步骤说明解决方案 @@ -4244,7 +4178,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 常用格式指令:分点列表、指定段落数、表格呈现、代码格式 - ``` + ```python 用JSON格式输出包含以下字段: { "summary": "不超过50字的摘要", @@ -4274,7 +4208,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 模板结构设计(黄金公式) - ``` + ```python # 标准三段式结构 prompt_template = """ [角色设定] @@ -4300,29 +4234,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ | 生成结果过于笼统 | 缺少具体步骤要求 | 添加"分步骤详细说明"指令 | | 格式不符合要求 | 未提供明确格式示例 | 添加XML/JSON标记示例 | - - - - - - - - - - - - - - - - - - - - -#### 第2集 Prompt提示词工程多案例最佳实践 - -**简介: Prompt提示词工程多案例最佳实践** +#### Prompt提示词工程多案例最佳实践 * 需求 @@ -4343,7 +4255,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 好prompt - ``` + ```python 你是一位科技专栏作家,请用通俗易懂的方式向高中生解释: 1. 什么是人工智能(用1个生活化比喻说明) 2. 列举3个当前主流应用场景 @@ -4363,7 +4275,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 差Prompt: - ``` + ```python 写个Python程序 ``` @@ -4372,7 +4284,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 好Prompt: - ``` + ```python 编写一个Python函数,实现以下功能: - 输入:字符串形式的日期(格式:YYYY-MM-DD) - 输出:该日期对应的季度(1-4) @@ -4396,7 +4308,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 差Prompt - ``` + ```python 如何优化网站性能? ``` @@ -4405,7 +4317,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 好Prompt - ``` + ```python 针对使用SpringBoot+Vue3的技术栈,请给出5项可量化的性能优化方案: 要求: 1. 每项方案包含: @@ -4429,7 +4341,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 差Prompt - ``` + ```python 分析这份销售数据 ``` @@ -4438,7 +4350,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 好Prompt - ``` + ```python 你是一位资深数据分析师,请完成以下任务: 数据集特征: - 时间范围:2027年1-12月 @@ -4463,23 +4375,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 指定分析方法论 * 规范输出格式 - - - - - - - - - - - - - - -#### 第3集 LangChain 提示模板PromptTemplate介绍 - -**简介: LangChain 提示模板PromptTemplate介绍** +#### LangChain 提示模板PromptTemplate介绍 * 需求 @@ -4494,7 +4390,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 动态内容组装 * 避免Prompt硬编码 - ![1](D:/学习/笔记/img/1-1073680.png) + ![1](/img/1-1073680.png) * PromptTemplate核心变量和方法 * template 定义具体的模板格式,其中 `{变量名}` 是占位符 @@ -4506,7 +4402,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 创建PromptTemplate对象简单模版 - ``` + ```python from langchain.prompts import PromptTemplate # 定义模板 @@ -4534,7 +4430,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 自动推断变量 - ``` + ```python from langchain.prompts import PromptTemplate # 当不显式声明 input_variables 时 @@ -4546,7 +4442,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 默认值设置 - ``` + ```python from langchain.prompts import PromptTemplate template = """分析用户情绪(默认分析类型:{analysis_type}): 用户输入:{user_input} @@ -4569,33 +4465,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(prompt_template.partial_variables) ``` - - - - - - - - - - - - - - - - - - - - -#### 第4集 PromptTemplate结合LLM案例实战 - -**简介: PromptTemplate结合LLM案例实战** +#### PromptTemplate结合LLM案例实战 * 案例实战 - ``` + ```python from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser @@ -4629,19 +4503,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - - - - - - - - - - -#### 第5集 大模型ChatModel聊天模型和Token计算 - -**简介: 大模型里面ChatModel聊天模型介绍** +#### 大模型ChatModel聊天模型和Token计算 * 什么是**ChatModel** @@ -4677,7 +4539,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 参考案例OpenAI代码 - ``` + ```python # 多轮对话示例 messages = [ {"role": "system", "content": "你是一个电影推荐助手"}, @@ -4695,8 +4557,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # 输出:《星际穿越》的主演是马修·麦康纳和安妮·海瑟薇... ``` - - * Chat聊天多轮对话中的Token如何计算 * 在多轮对话场景下,上下文通常涵盖以下几部分: @@ -4730,24 +4590,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 8k、32k Tokens :支持长上下文的模型,如 GPT-4 等,有更大的上下文窗口,分别为 8192 个和 32768 个 Token。 - - - - - - - - - - - - - - -#### 第6集 聊天模型ChatPromptTemplate讲解 - -**简介: 聊天模型ChatPromptTemplate讲解** +#### 聊天模型ChatPromptTemplate讲解 * ChatPromptTemplate 核心概念 @@ -4756,7 +4600,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 天然适配聊天模型(如GPT-3.5/4) * 可维护对话上下文 - ![2](D:/学习/笔记/img/2.png) + ![2](/img/2.png) * 消息类型体系 @@ -4791,7 +4635,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 使用from_messages构建多轮对话模板 - ``` + ```python from langchain_core.prompts import ChatPromptTemplate # 定义消息列表,包含系统指令、用户输入和AI回复模板, 通过元组列表定义角色和模板,动态插入name和user_input变量 @@ -4817,7 +4661,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 结合`from_template`与`from_messages` - ``` + ```python from langchain_core.prompts import ( ChatPromptTemplate, SystemMessagePromptTemplate, @@ -4846,34 +4690,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # 输出结果示例: # SystemMessage(content='你是一个翻译助手,请用中文回答。') - # HumanMessage(content='将'I love Python'翻译成中文。') + # HumanMessage(content='将'I love Python'翻译成中文。' ``` - - - - - - - - - - - - - - - - - - - - - -#### 第7集 LangChain聊天模型多案例实战 - -**简介: LangChain聊天模型多案例实战** +#### LangChain聊天模型多案例实战 * 需求 @@ -4883,7 +4704,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 领域专家案例实战 - ``` + ```python from langchain_openai import ChatOpenAI from langchain_core.messages import SystemMessage, HumanMessage @@ -4912,7 +4733,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 带参数的领域专家 - ``` + ```python from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate @@ -4955,7 +4776,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 合规客服系统 - ``` + ```python from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate @@ -4981,32 +4802,10 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(response) ``` - +### LCEL表达式和输出解析器多案例实战 - - - - - - - - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十二章 LCEL表达式和输出解析器多案例实战 - - - -#### 第1集 LangChain链和LLMChain链案例实战 - -**简介: LangChain链和LLMChain链案例实战** +#### LangChain链和LLMChain链案例实战 * 什么是Chain链 @@ -5014,7 +4813,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 本质:将多个处理单元(模型/工具/逻辑)按特定顺序连接起来,形成完整的任务处理流程 * 想象Java中的责任链模式或工作流引擎中的步骤串联。 - ``` + ```java // 传统Java责任链模式(对比理解) public interface Handler { void handle(Request request); @@ -5057,7 +4856,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 代码示例 - ``` + ```python from langchain_openai import ChatOpenAI from langchain.chains import LLMChain from langchain_core.prompts import PromptTemplate @@ -5081,36 +4880,18 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ llm=model, prompt=prompt_template ) + # LLMChain 类在 LangChain 0.1.17 中已被弃用,建议使用 RunnableSequence(如 prompt | llm) + llm_chain = prompt_template | model # 执行调用(类似service.execute(input)),run方法被淘汰了,统一invoke方法调用 result = llm_chain.invoke("智能手机") print(result) # 输出:"1. 高清OLED屏幕 2. 5000mAh大电池 3. 旗舰级处理器" ``` + + * 其他常见的Chain,比如 `SequentialChain、TransformChain、RouterChain、RetrievalChain` 部分已经淘汰 - * 其他常见的Chain,比如 `SequentialChain、TransformChain、RouterChain、RetrievalChain` 部分已经淘汰了 - - - - - - - - - - - - - - - - - - - -#### 第2集 新版LCEL表达式讲解和案例实战 - -**简介: 新版LCEL表达式讲解和案例实战** +#### 新版LCEL表达式讲解和案例实战 * **什么是LCEL(LangChain Expression Language**) @@ -5142,7 +4923,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - 简单问答、单步生成任务(如生成公司名称、翻译句子)。 - 快速原型开发,无需复杂配置 - ``` + ```python chain = LLMChain(llm=model, prompt=prompt) result = chain.invoke({"text": "Hello"}) ``` @@ -5155,7 +4936,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - 复杂工作流(如多模型协作、动态路由、实时流式交互)。 - 生产级应用开发,需高并发、稳定性和可观察性(如集成LangSmith跟踪) - ``` + ```python chain = prompt | model | output_parser result = chain.invoke({"text": "Hello"}) ``` @@ -5168,7 +4949,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 语法规则:`chain = component_a | component_b | component_c ` * 案例实战:构建一个简单的问答链 - ``` + ```python from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser @@ -5193,7 +4974,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(result) ``` - ``` + ```python # 旧版本的写法, 创建LLMChain(类似构建一个Service类) chain = LLMChain( llm=model, @@ -5206,23 +4987,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # 输出:"1. 高清OLED屏幕 2. 5000mAh大电池 3. 旗舰级处理器" ``` - - - - - - - - - - - - - -#### 第3集 LLM大模型Stream流式输出实战 - -**简介: LLM大模型Stream流式输出实战** +#### LLM大模型Stream流式输出实战 * Stream流式响应实战 @@ -5232,7 +4998,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例实战:故事小助手 - ``` + ```python from langchain_openai import ChatOpenAI # #模型 @@ -5249,7 +5015,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例实战:科普助手(采用LCEL表达式进行) - ``` + ```python from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser @@ -5284,21 +5050,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 等待时间较长:涉及大语言模型的节点可能需要较长时间才能返回完整结果。 * 复杂性较高:事件驱动的流式响应需要精细的控制和管理 - - - - - - - - - - - - -#### 第4集 输出解析器OutputParse实战和原理讲解 - -**简介: 输出解析器OutputParse实战和原理讲解** +#### 输出解析器OutputParse实战和原理讲解 * 为什么需要输出解析OutputParse? * 大模型原始输出通常是**非结构化文本** @@ -5306,7 +5058,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 将大模型的自由文本转为结构化数据(类似Java的JSON/XML解析) * 自动处理模型输出的格式错误 -![image-20250301152117731](D:/学习/笔记/img/image-20250301152117731.png) +![image-20250301152117731](/img/image-20250301152117731.png) * 解析器工作原理 @@ -5323,7 +5075,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 输出解析器基础结构三要素 - ``` + ```python from langchain.output_parsers import XxxParser # 要素1:创建解析器(类似Java的Gson实例) @@ -5342,7 +5094,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 测试查看 多个解析器prompt提示词 - ``` + ```python from langchain_core.output_parsers import JsonOutputParser,CommaSeparatedListOutputParser from langchain_core.prompts import ChatPromptTemplate @@ -5370,7 +5122,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例实战 - ``` + ```python from langchain_core.output_parsers import CommaSeparatedListOutputParser from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI @@ -5402,19 +5154,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 虽然有解析器,但是存在大模型返回内容不符合格式要求,则一样会报错 * 本质解析器还是Prompt提示词内容,如果有报错则可以让大模型重试 - - - - - - - - - - -#### 第5集 LangChain字符串和列表输出解析器实战 - -**简介: LangChain字符串和列表输出解析器实战** +#### LangChain字符串和列表输出解析器实战 * 需求 @@ -5428,7 +5168,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **适用场景**:无需结构化处理,直接返回原始文本 - ``` + ```python from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate @@ -5458,7 +5198,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **功能**:将逗号分隔的文本解析为列表。 * **适用场景**:模型生成多个选项或标签。 - ``` + ```python from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import CommaSeparatedListOutputParser from langchain_openai import ChatOpenAI @@ -5477,35 +5217,20 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # 调用 result = chain.invoke({"topic": "Java"}) - print(result) # 输出:["机器学习", "深度学习", "神经网络"] + print(result) # 输出:["机器学习", "深度学习", "神经网络"] ``` - - - - - - - - - - - - - -#### 第6集 Json输出解析器和问答系统答案提取实战 - -**简介: Json输出解析器和问答系统答案提取实战** +#### Json输出解析器和问答系统答案提取实战 * `JsonOutputParser` * **功能**:将模型输出解析为 JSON 对象。 * **适用场景**:需要模型返回结构化数据(如 API 响应),**多数要结合Pydantic进行使用** - ``` + ```python from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import JsonOutputParser @@ -5531,7 +5256,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 目标:从模型回答中提取答案和置信度。 - ``` + ```python from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI @@ -5566,30 +5291,12 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ #答案:地球的平均半径约为6,371公里。,置信度:0.95 ``` - - - - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** +### Pydantic模型和LLM高级解析器实战 -### 第三十三章 Pydantic模型和LLM高级解析器实战 - - - - - -#### 第1集 Python模型管理Pydantic介绍和安装 - -**简介: Python模型管理Pydantic介绍和安装** +#### Python模型管理Pydantic介绍和安装 * 什么是Pydatic @@ -5614,13 +5321,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - **序列化**:轻松转换数据为字典/JSON - **配置管理**:支持复杂配置项的验证 - image-20250228151848080 + image-20250228151848080 * 对比Java开发的模型验证 * 典型Java方式(需手写校验逻辑) - ``` + ```java public class User { private String name; private int age; @@ -5639,7 +5346,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 传统Python方式(样板代码) - ``` + ```python class User: def __init__(self, name: str, age: int): if not isinstance(name, str): @@ -5654,7 +5361,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * pydantic方式(声明式验证) - ``` + ```python # 只需3行代码即可实现完整验证! from pydantic import BaseModel, Field class User(BaseModel): @@ -5668,7 +5375,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 模块安装 Pydantic V2(需要Python 3.10+) - ``` + ```shell pip install pydantic==2.7.4 ``` @@ -5676,7 +5383,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * Pydantic 的主要方法是创建继承自 BaseModel 的自定义类 - ``` + ```python from pydantic import BaseModel # 类似Java中的POJO,但更强大 @@ -5695,7 +5402,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 创建实例与校验 - ``` + ```python try: UserProfile(username=123) # 触发验证错误 except ValueError as e: @@ -5710,7 +5417,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 字段类型验证 - ``` + ```python from pydantic import BaseModel,HttpUrl,ValidationError class WebSite(BaseModel): @@ -5739,7 +5446,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 数据解析/序列化 - ``` + ```python from pydantic import BaseModel class Item(BaseModel): @@ -5756,26 +5463,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 调试技巧:打印模型结构 - ``` + ```python print(Website.model_json_schema()) - # 输出完整的JSON Schema + # 输出完整的JSON Schem ``` - - - - - - - - - - - -#### 第2集 Pydantic字段校验Field函数多案例实战 - -**简介:Pydantic字段校验Field多案例实战** +#### Pydantic字段校验Field函数多案例实战 * Filed函数讲解 @@ -5801,7 +5495,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * Field 的第一个参数是 default,而 ... 在此处的语义等价于“无默认值”。 * 若省略 default 参数(如 Field(title="用户名")),Pydantic 会隐式使用 ...,但显式写出更明确 - ``` + ```python from pydantic import BaseModel, Field class User(BaseModel): name: str = Field(..., title="用户名", min_length=2) @@ -5814,7 +5508,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 可选字段(有默认值) - ``` + ```python from pydantic import BaseModel, Field class UserOptional(BaseModel): name: str = Field("Guest", title="用户名") # 默认值为 "Guest" @@ -5826,7 +5520,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 以下两种写法完全等价, 使用 `Field` 的优势在于可以附加额外参数(如 `title`、`min_length`、`description` 等)。 - ``` + ```python # 写法 1:省略 Field,直接类型注解 name: str @@ -5836,7 +5530,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 数值类型必填 - ``` + ```python from pydantic import BaseModel, Field, ValidationError class Product(BaseModel): @@ -5855,7 +5549,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 嵌套模型必填 - ``` + ```python from pydantic import BaseModel, Field class Address(BaseModel): city: str = Field(..., min_length=1) @@ -5874,7 +5568,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 明确可选字段 - ``` + ```python from pydantic import BaseModel, Field from typing import Optional @@ -5888,7 +5582,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 混合使用默认值和必填 - ``` + ```python from pydantic import BaseModel, Field class Config(BaseModel): @@ -5903,19 +5597,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ Config(timeout=5) # 触发 ValidationError ``` - - - - - - - - - -#### 第3集 Pydantic自定义验证器多案例实战 - -**简介:Pydantic自定义验证器多案例实战** +#### Pydantic自定义验证器多案例实战 * `@field_validator`介绍 @@ -5927,7 +5610,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础语法 - ``` + ```python from pydantic import BaseModel, ValidationError, field_validator class User(BaseModel): @@ -5955,7 +5638,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 字符串格式校验 - ``` + ```python from pydantic import BaseModel, Field,field_validator class User(BaseModel): @@ -5976,7 +5659,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 验证用户名和长度 - ``` + ```python from pydantic import BaseModel, Field,field_validator class User(BaseModel): username: str = Field(..., min_length=3) @@ -5996,7 +5679,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 密码复杂性验证 - ``` + ```python from pydantic import BaseModel, Field,field_validator class Account(BaseModel): @@ -6019,7 +5702,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 多个字段共享验证器 - ``` + ```python from pydantic import BaseModel, Field,field_validator class Product(BaseModel): price: float @@ -6042,7 +5725,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 忘记返回值:验证器必须返回字段的值(除非明确要修改)。 - ``` + ```python @field_validator("email") def validate_email(cls, v): if "@" not in v: @@ -6068,23 +5751,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ | `parse_obj()` | `model_validate()` | | `update_forward_refs()` | `model_rebuild()` | - - - - - - - - - - - - - -#### 第4集 重点-解析器PydanticOutputParser实战 - -**简介:重点-解析器PydanticOutputParser实战** +#### 重点-解析器PydanticOutputParser实战 * 为啥要用为什么需要Pydantic解析? @@ -6095,7 +5763,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **案例实战一:大模型信息输出提取( `PydanticOutputParser` 结合Pydantic模型验证输出)** - ``` + ```python from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field from langchain_core.output_parsers import PydanticOutputParser @@ -6153,7 +5821,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 新版才支持从pydantic获取约束模型,该参数并非强制要求,而是可选的增强功能 * `JsonOutputParser`可以处理流式返回的部分JSON对象。 - ``` + ```python from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field from langchain_core.prompts import ChatPromptTemplate @@ -6201,21 +5869,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # print(chunk) # 逐词输出 ``` - - - - - - - - - - - -#### 第5集 重点-大模型修复机制OutputFixingParser - -**简介:大模型修复机制OutputFixingParser解析器** +#### 重点-大模型修复机制OutputFixingParser * `OutputFixingParser` @@ -6226,13 +5881,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 兼容性:与Pydantic数据模型无缝集成,支持结构化输出验证。 * 容错机制:避免因模型输出不稳定导致程序中断 - export_4232z + export_4232z * 核心语法与使用步骤 * 基础语法 - ``` + ```python from langchain.output_parsers import OutputFixingParser, PydanticOutputParser from langchain_openai import ChatOpenAI @@ -6268,7 +5923,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 检测到错误后,将错误信息与原始输入传递给LLM。 * LLM根据提示生成符合Pydantic模型的修正结果。 - ``` + ```python from langchain.output_parsers import OutputFixingParser from langchain_core.output_parsers import PydanticOutputParser from langchain_openai import ChatOpenAI @@ -6313,7 +5968,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 完整正常案例 - ``` + ```python from langchain.output_parsers import OutputFixingParser from langchain_core.output_parsers import PydanticOutputParser from langchain_openai import ChatOpenAI @@ -6359,28 +6014,10 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 提示词不清晰:在提示模板中明确格式要求。 * 网络问题:通过代理服务优化API访问 - - - - +### AI大模型必备之RAG和智能医生实战 - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十四章 AI大模型必备之RAG和智能医生实战 - - - -#### 第1集 什么是大模型的幻觉输出 - -**简介: 什么是大模型的幻觉输出** +#### 什么是大模型的幻觉输出 * “幻觉输出”(Hallucination) @@ -6400,7 +6037,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 矛盾内容 * 例:同一段回答中前后逻辑冲突(如先说“地球是平的”,后又说“地球绕太阳公转”) - image-20250310151927722 + image-20250310151927722 * 幻觉产生的根本原因 @@ -6451,19 +6088,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - **提示词设计**:明确要求模型标注不确定性(如“回答需基于2023年数据”)。 - **多源验证**:对关键信息人工交叉核对(如学术论文、权威网站)。 +#### 带你走进RAG检索增强生成和应用场景 +**简介: 带你走进RAG检索增强生成和应用场景** - - - - - - -#### 第2集 带你走进RAG检索增强生成和应用场景 - -**简介: 带你走进RAG检索增强生成和应用场景** - -* 什么是RAG技术 +* 什么是RAG技术 * RAG(Retrieval-Augmented Generation)检索增强生成,是结合信息检索与文本生成的AI技术架构。 * 核心思想: @@ -6471,11 +6100,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 再将检索结果与问题共同输入生成模型得到最终答案 * 类比人类解答问题的过程:遇到问题时先查资料(检索),再结合资料组织回答(生成) - ![2](D:/学习/笔记/img/2-1580890.png) + ![2](/img/2-1580890.png) * 用Java伪代码描述RAG工作流程: - ``` + ```java public class JavaRAG { public static void main(String[] args) { // 1. 加载文档 @@ -6523,7 +6152,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 技术架构 - 1 + 1 * **涉及的技术链路环节: 文档加载器->文档转换器->文本嵌入模型->向量存储->检索器** @@ -6547,7 +6176,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 实时检索最新的产品文档、FAQ。 * 生成个性化回答(如退货政策、故障排查)。 - ``` + ```python 用户问:"这个小滴手机支持老人家使用不?" 系统检索:产品适合人群相关词条 生成回答:"我们这个产品适合18岁以上的成人使用,包括中老年人等" @@ -6564,7 +6193,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 检索权威医学数据库(如PubMed、临床指南)。 * 生成基于循证医学的答案,标注参考文献来源。 - ``` + ```python 用户问:"二甲双胍的禁忌症有哪些?" 系统检索:最新《临床用药指南》第5.3节 生成回答:"根据2023版用药指南,二甲双胍禁用于以下情况:1)严重肾功能不全..." @@ -6581,7 +6210,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 检索实时财报、新闻、行业数据 → 输入生成模型。 * 自动生成带有数据支撑的投资建议。 - ``` + ```python 用户问:"XXX公司财报如何" 系统检索:某某公司财报 生成回答:"根据公司的财报和解读,利润和负债..." @@ -6589,21 +6218,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 效果:析师效率提升,报告更新频率加快 - - - - - - - - - - - - -#### 第3集 LLM智能AI医生+RAG系统案例实战《上》 - -**简介: LLM智能AI医生+RAG系统案例实战** +#### LLM智能AI医生+RAG系统案例实战 * 需求 @@ -6615,7 +6230,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 创建项目和安装相关环境 - ``` + ```python # 创建并激活虚拟环境 python -m venv .venv source .venv/bin/activate @@ -6630,46 +6245,28 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 下载相关资料 ,使用**【wget】或者【浏览器】远程下载相关依赖包(需要替换群里最新的)** - ``` + ```python 原生资料下载方式(账号 - 密码 - ip地址 - 端口 需要替换群里最新的,【其他路径不变】) wget --http-user=用户名 --http-password=密码 http://ip:端口/dcloud_pan/aipan_xd-rag.zip - #比如 命令行下 wget --http-user=admin --http-password=xdclass.net888 http://47.115.31.28:9088/dcloud_pan/aipan_xd-rag.zip - # 比如 浏览器直接访问 http://47.115.31.28:9088/dcloud_pan/aipan_xd-rag.zip ``` - + * 解压后执行【**依赖很多,版本差异大,务必按照下面执行,否则课程无法进行下去,加我微信 xdclass6**】 ``` # 安装依赖 pip install -r requirements.txt ``` - - -​ - - - - - - - - - -#### 第4集 LLM智能AI医生+RAG系统案例实战《下》 - -**简介: LLM智能AI医生+RAG系统案例实战** - * 效果测试 -![image-20250314122237372](D:/学习/笔记/img/image-20250314122237372.png) +![image-20250314122237372](/img/image-20250314122237372.png) * 多数同学的问题 * **为啥可以根据我们的提问,进行检索到对应的词条?而且还可以正确检索?** @@ -6677,35 +6274,18 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **为啥检索到词条后,还可以用调整输出内容,更加友好?** * **什么是嵌入大模型?和前面学的LLM大模型有啥区别?** -image-20250314124004485 - - - - - - - - +image-20250314124004485 -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** +### RAG 检索增强生成之Loader实战 -### 第三十五章 RAG 检索增强生成之Loader实战 - - - -#### 第1集 RAG系统链路和数据加载Loaders技术 - -**简介: RAG系统链路和数据加载Loaders技术** +#### RAG系统链路和数据加载Loaders技术 * RAG系统与LLM交互架构图 * 注意 * 万丈高楼平地起,基础需要打牢固,一步步进行,然后学会举一反三使用 * 如果直接讲Agent智能体项目,那项目涉及到的很多技术就懵逼了,要学会思路 -![0](D:/学习/笔记/img/0.png) - - +![0](/img/0.png) * **涉及的技术链路环节: 文档加载器->文档转换器->文本嵌入模型->向量存储->检索器** @@ -6719,7 +6299,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ 网页 ``` - ![data_connection_diagram](D:/学习/笔记/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) + ![data_connection_diagram](/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) * 文档加载器 (Document Loaders) @@ -6727,8 +6307,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 将不同来源的原始数据(如PDF、网页、JSON、、HTML、数据库等)转换为统一格式的文档对象,便于后续处理。 * **核心任务**:数据源适配与初步结构化 - - * LangChain里面的Loader * 接口文档地址【如果失效就忽略):https://python.langchain.com/docs/integrations/document_loaders/ @@ -6748,7 +6326,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * LangChain 设计了一个统一的接口`BaseLoader`来加载和解析文档, - ``` + ```python class BaseLoader(ABC): # noqa: B024 """Interface for Document Loader. @@ -6772,7 +6350,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **`page_content`**: 文本内容 * **`metadata`**: 元数据(如来源、创建时间、作者等) - ``` + ```python class Document(BaseMedia): """Class for storing a piece of text and associated metadata. @@ -6823,23 +6401,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 其他加载器 (自定义) ... - - - - - - - - - - - - - - -#### 第2集 文档加载器Loaders技术多案例实战 - -**简介: 文档加载器Loaders技术多案例实战** +#### 文档加载器Loaders技术多案例实战 * TextLoader - 加载纯文本文件 @@ -6848,7 +6410,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - **`encoding`**: 文件编码(默认 `utf-8`) - **`autodetect_encoding`**: 自动检测编码(如处理中文乱码) - ``` + ```python from langchain_community.document_loaders import TextLoader # 文本加载 loader = TextLoader("data/test.txt") @@ -6863,7 +6425,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础案例代码 - ``` + ```python from langchain_community.document_loaders import CSVLoader loader = CSVLoader("data/test.csv", csv_args={"delimiter": ","}) @@ -6876,7 +6438,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 可指定列名,按行生成文档 - ``` + ```python from langchain_community.document_loaders import CSVLoader #loader = CSVLoader("data/test.csv", csv_args={"delimiter": ","}) @@ -6889,8 +6451,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(documents[1].page_content) ``` - - * JSONLoader - 加载 JSON 文件 * 核心参数详解 @@ -6926,7 +6486,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 编码实战 - ``` + ```python from langchain_community.document_loaders import JSONLoader loader = JSONLoader( file_path="data/test.json", @@ -6936,28 +6496,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ docs = loader.load() print(len(docs)) - print(docs[0]) + print(docs[0] ``` - - - - - - - - - - - - - - - - -#### 第3集 PDF文档加载器实战和常见问题处理 -**简介: PDF文档加载器实战和常见问题处理** +#### PDF文档加载器实战和常见问题处理 * `PyPDFLoader` 加载PDF文件 @@ -6971,13 +6514,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 安装依赖库 - ``` + ```python pip install pypdf ``` * 案例代码实战 - ``` + ```python from langchain_community.document_loaders import PyPDFLoader # PDF加载 loader = PyPDFLoader("data/test.pdf") @@ -6996,14 +6539,14 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 按需加载, 通过 `load()` 方法的参数控制加载范围: - ``` + ```python # 加载指定页码范围(例如第2页到第4页) pages = loader.load([1, 2, 3]) # 注意页码从0开始(第1页对应索引0) ``` * 提取所有文本合并为单个文档, 若需将全部页面内容合并为一个字符串: - ``` + ```python full_text = "\n\n".join([page.page_content for page in pages]) print(f"合并后的全文长度: {len(full_text)} 字符") ``` @@ -7021,7 +6564,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 调整分块策略:选择合适的分隔符或分块大小 - ``` + ```python text_splitter = RecursiveCharacterTextSplitter( separators=["\n\n", "\n", "."], # 按段落、句子分割 chunk_size=500, @@ -7033,7 +6576,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **批量处理PDF**:遍历文件夹内所有PDF文件。 - ``` + ```python import os pdf_folder = "docs/" all_pages = [] @@ -7043,31 +6586,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ all_pages.extend(loader.load()) ``` - - - - - - - - - - - - - - - - - - - - - -#### 第4集 Loader进阶-PDF文档里面的图片提取解析 - -**简介: Loader进阶-PDF文档里面的图片提取解析** +#### Loader进阶-PDF文档里面的图片提取解析 * 如何提取PDF里面的图片文案? @@ -7109,38 +6629,15 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 代码实战 - ``` + ```python from langchain_community.document_loaders import PyPDFLoader loader = PyPDFLoader("data/pdf-img.pdf", extract_images=True) pages = loader.load() print(pages[0].page_content) ``` - - - - - - - - - - - - - - - - - - - - - - - -#### 第5集 网页加载器WebBaseLoader案例实战 +#### 网页加载器WebBaseLoader案例实战 **简介: Web网页加载器WebBaseLoader案例实战** @@ -7158,7 +6655,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 安装依赖库 - ``` + ```python pip install beautifulsoup4 # HTML 解析依赖(默认已包含) pip install requests # 网络请求依赖(默认已包含) ``` @@ -7173,7 +6670,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础用法:加载单个网页 - ``` + ```python import os #代码中设置USER_AGENT, 设置USER_AGENT的代码一定要放在WebBaseLoader 这个包前面,不然还是会报错 os.environ['USER_AGENT'] = 'Mozilla/5.0 (Windows NT 14.0; Win64; x64) AppleWebKit/567.36 (KHTML, like Gecko) Chrome/58.0.444.11 Safari/337.3' @@ -7196,7 +6693,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 批量加载多个网页 - ``` + ```python import os #代码中设置USER_AGENT, 注意设置USER_AGENT的代码一定要放在WebBaseLoader 这个包前面,不然还是会报错 os.environ['USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' @@ -7221,17 +6718,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 更多详细API和参数 https://python.langchain.com/docs/integrations/document_loaders/web_base/ - - - - - - - - -#### 第6集 Word文档加载器实战和常见问题处理 - -**简介: Word文档加载器实战和常见问题处理** +#### Word文档加载器实战和常见问题处理 * `Docx2txtLoader`介绍 @@ -7243,7 +6730,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 安装依赖库 - ``` + ```python pip install docx2txt # 核心文本提取库 ``` @@ -7253,7 +6740,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础用法:加载单个Word文档 - ``` + ```python from langchain_community.document_loaders import Docx2txtLoader # 初始化加载器,传入文件路径 @@ -7270,7 +6757,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 批量加载文档 - ``` + ```python from langchain_community.document_loaders import Docx2txtLoader import os @@ -7302,39 +6789,16 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 原因:Docx2txtLoader 仅提取文本,忽略图片。 * 解决:使用 python-docx 单独提取图片,也可以使用其他组件,类似OCR +### RAG检索增强生成之文档切割 - - - - - - - - - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十六章 RAG检索增强生成之文档切割 - - - - -#### 第1集 RAG系统链路构建之文档切割转换 - -**简介: RAG系统链路构建之文档切割转换** +#### RAG系统链路构建之文档切割转换 * 构建RAG系统:**涉及的技术链路环节: 文档加载器->文档转换器->文本嵌入模型->向量存储->检索器** * RAG数据流水线示意图 - ``` + ```python 原始数据 → 数据加载 → 预处理 → 向量化 → 存储 → 检索增强生成 ↗ ↗ ↗ PDF 文本清洗 嵌入模型 @@ -7342,7 +6806,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ 网页 ``` - ![data_connection_diagram](D:/学习/笔记/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) + ![data_connection_diagram](/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) * 需求背景,为啥要用? @@ -7352,8 +6816,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 格式兼容性问题:PDF/HTML/代码等不同格式的结构差异 - - * 文档转换器(Document Transformers) * 文档转换器是 LangChain 处理文档流水线的核心组件,负责对原始文档进行结构化和语义化处理, @@ -7367,23 +6829,23 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **文本分块**:按固定长度或语义分割(防止截断完整句子) * **去噪处理**:移除特殊字符、乱码、广告内容 * **元数据注入**:添加来源、时间戳等上下文信息 - + * 效果 * **保留语义完整性**:避免因分割导致上下文断裂或信息丢失 * **适配模型输入限制**:确保分割后的文本块长度符合大语言模型(LLM)的token限制 * **优化向量化效果**:通过合理分块提升向量表示的语义精度,从而提高检索匹配率 - + | 问题类型 | 原始文档示例 | 转换前问题 | 转换后效果 | | :--------: | :-----------: | :-----------------------: | :--------------------: | | 长文本溢出 | 500页法律合同 | 直接输入导致API报错 | 分割为上下文合规的段落 | | 信息碎片化 | 产品手册PDF | 技术参数分散在不同页面 | 按功能模块重组内容 | | 噪音污染 | 网页抓取内容 | 包含广告/导航栏等干扰信息 | 提取纯净正文内容 | | 格式混乱 | 代码仓库文档 | Markdown/代码片段混合 | 分离代码与说明文本 | - + * 基础类和核心参数说明 - ``` + ```python from langchain_text_splitters import TextSplitter #源码 class TextSplitter(BaseDocumentTransformer, ABC): @@ -7399,7 +6861,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ strip_whitespace: bool = True, ) -> None: ``` - + * 方法说明 * `TextSplitter`本身没有实现`split_text`,要文档分割器按自己的分割策略实现分割 @@ -7409,13 +6871,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * `split_text()`是基础文本分割方法 * `create_documents()`在`split_text()`基础上封装了元数据绑定逻辑 * `split_documents()`内部调用`create_documents()`并自动处理元数据传递 - + | 方法 | 输入类型 | 输出类型 | 元数据处理 | 典型使用场景 | | :----------------------- | :------------------- | :--------------- | :------------------------- | :------------------------------------ | | **`split_text()`** | **单个字符串** | `List[str]` | ❌ 不保留元数据 | 仅需分割纯文本内容时使用 | | **`create_documents()`** | **字符串列表** | `List[Document]` | ✅ 需手动传递元数据 | 从原始文本构建带元数据的文档对象 | | **`split_documents()`** | **Document对象列表** | `List[Document]` | ✅ 自动继承输入文档的元数据 | 分割已加载的文档对象(如PDF解析结果) | - + * `chunk_size` @@ -7426,10 +6888,10 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 防止文本过长超出模型处理限制,影响检索精度。 * 较小的chunk_size能提高检索细粒度,会导致上下文缺失。 - + * 例子 - ``` + ```python # 设置chunk_size=100,分割文本为不超过100字符的块 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20) @@ -7437,7 +6899,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ #分割结果:["Python是一种解释型语言,适合快速开发。", "开发。它支持面向对象编程,语法简洁。"](假设每个块接近100字符) ``` - + * `chunk_overlap` * 定义:相邻文本块之间的重叠字符数,用于保留上下文连贯性。 @@ -7446,16 +6908,16 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例一 - ``` + ```python 如果chunk_size设为1024,chunk_overlap设为128, 对一个长度为2560的文本序列,会切分成3个chunk: chunk 1: 第1-1024个token chunk 2: 第897-1920个token (与chunk 1重叠128个) chunk 3: 第1793-2560个token (与chunk 2重叠128个) ``` - + * 案例二 - ``` + ```python # 设置chunk_size=50,chunk_overlap=10 text = "深度学习需要大量数据和计算资源。卷积神经网络(CNN)在图像处理中表现优异。" text_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10) @@ -7464,7 +6926,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ # 重叠部分"计算资源。"确保第二块包含前一块的结尾 ``` - + * `separators` * 定义:分隔符优先级列表,用于递归分割文本。 @@ -7473,7 +6935,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 例子 - ``` + ```python # 默认分隔符:["\n\n", "\n", " ", ""] text_splitter = RecursiveCharacterTextSplitter( separators=["\n\n", "。", ",", " "] @@ -7483,28 +6945,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ #分割流程:先按\n\n分割为两段,若仍超长则按。继续分割 ``` - - - - - - - - - - - - - - - - - -#### 第2集 字符文档转换器TextSplitter案例实战 - -**简介: 文档转换器CharacterTextSplitter案例实战** +#### 字符文档转换器TextSplitter案例实战 * `CharacterTextSplitter` 字符分割器 @@ -7528,7 +6971,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 长文本处理 - ``` + ```python from langchain.text_splitter import CharacterTextSplitter text = "是一段 需要被分割的 长文本示例....,每个文本块的最大长度(字符数或token数)Document loaders are designed to load document objects. LangChain has hundreds of integrations with various data sources to load data from: Slack, Notion, Google Drive" @@ -7547,7 +6990,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 日志文件处理 - ``` + ```python from langchain.text_splitter import CharacterTextSplitter log_data = """ @@ -7571,43 +7014,23 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ | 特性 | 优势 | 局限性 | | :--------: | :----------------------: | :----------------------------------------: | | 分割速度 | ⚡️ 极快(O(n)复杂度) | 不考虑语义结构 | - | 内存消耗 | 🟢 极低 | 可能切断完整语义单元, 对语义关联性保持较弱 | - | 配置灵活性 | 🛠️ 支持自定义分隔符和重叠 | 需要预定义有效分隔符 | - | 多语言支持 | 🌍 支持任意字符集文本 | 对表意文字计算可能不准确 | - -* 适合场景 - - * 推荐使用: - - 结构化日志处理 - - 代码文件解析 - - 已知明确分隔符的文本(如Markdown) - - 需要精确控制块大小的场景 - * 不推荐使用: - - 自然语言段落(建议用RecursiveCharacterSplitter) - - 需要保持语义完整性的场景 - - 包含复杂嵌套结构的文本 - - - - - - - - - - - - - - - - - + | 内存消耗 | 🟢 极低 | 可能切断完整语义单元, 对语义关联性保持较弱 | + | 配置灵活性 | 🛠️ 支持自定义分隔符和重叠 | 需要预定义有效分隔符 | + | 多语言支持 | 🌍 支持任意字符集文本 | 对表意文字计算可能不准确 | +* 适合场景 -#### 第3集 递归字符文档转换器TextSplitter案例实战 + * 推荐使用: + - 结构化日志处理 + - 代码文件解析 + - 已知明确分隔符的文本(如Markdown) + - 需要精确控制块大小的场景 + * 不推荐使用: + - 自然语言段落(建议用RecursiveCharacterSplitter) + - 需要保持语义完整性的场景 + - 包含复杂嵌套结构的文本 -**简介: 递归字符文档转换器TextSplitter案例实战** +#### 递归字符文档转换器TextSplitter案例实战 * `RecursiveCharacterTextSplitter` 递归字符分割器 @@ -7619,7 +7042,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 核心参数说明 - ``` + ```python from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( @@ -7635,7 +7058,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础案例测试, 处理后chunk之间也有overlap - ``` + ```python from langchain_text_splitters import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( @@ -7657,7 +7080,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 学术论文处理 - ``` + ```python from langchain.text_splitter import RecursiveCharacterTextSplitter paper_text = """ @@ -7681,7 +7104,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 避坑指南 - ``` + ```python # 错误示范:不合理的separators顺序 bad_splitter = RecursiveCharacterTextSplitter( separators=[" ", "\n"], # 空格优先会导致过早分割 @@ -7712,27 +7135,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 包含嵌套结构的文本(如Markdown) * 需要保持段落完整性的问答系统 - - - - - - - - - - - - - - - - - - -#### 第4集 分割器常见问题和优化最佳实践 - -**简介: 分割器常见问题和优化最佳实践** +#### 分割器常见问题和优化最佳实践 * 其他常见分割器 @@ -7770,7 +7173,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 文本总长度不足:当输入文本长度 ≤ chunk_size时,不会触发分割。 - ``` + ```python #解释:文本长度远小于chunk_size,不触发分割,无重叠。 from langchain_text_splitters import CharacterTextSplitter text = "这是一个非常短的测试文本。" @@ -7788,7 +7191,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 递归分割策略:RecursiveCharacterTextSplitter优先保证块大小,可能牺牲重叠。 - ``` + ```python # 解释:当无法找到分隔符时,按字符数硬分割,强制保留重叠。 from langchain_text_splitters import RecursiveCharacterTextSplitter @@ -7817,7 +7220,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 函数是一个内置函数,用于在迭代过程中同时获取元素的索引和值。 * 它返回一个枚举对象,包含了索引和对应的元素 - ``` + ```python # enumerate(iterable, start=0) #参数:iterable:必需,一个可迭代对象,如列表、元组、字符串等。 #参数:start:可选,指定索引的起始值,默认为 0。 @@ -7829,7 +7232,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 分隔符强制分割:在分隔符处切割时,剩余文本不足以形成重叠。 - ``` + ```python #解释:分隔符优先切割,每个块正好为7个字符,无法形成重叠。 from langchain_text_splitters import CharacterTextSplitter @@ -7865,7 +7268,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 分割Python代码时,`RecursiveCharacterTextSplitter.from_language(Language.PYTHON)` * 会自动识别函数、类等结构,避免打断代码逻辑 - ``` + ```python from langchain_text_splitters import Language, RecursiveCharacterTextSplitter python_splitter = RecursiveCharacterTextSplitter.from_language( language=Language.PYTHON, chunk_size=200, chunk_overlap=50 @@ -7881,7 +7284,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 使用MarkdownHeaderTextSplitter按标题分割,保留元数据 * 输入Markdown内容将按标题层级生成带元数据的块 - ``` + ```python headers_to_split_on = [("#", "Header 1"), ("##", "Header 2")] markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on) ``` @@ -7906,32 +7309,15 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **实验验证:通过AB测试对比不同参数的检索准确率与生成质量** - - - - - - - +### 人工智能和高等数学核心基础扫盲 - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十七章 人工智能和高等数学核心基础扫盲 - - - -#### 第1集 扫盲-AI大模型必备之向量-张量和应用场景 - -**简介: 扫盲-AI大模型必备之向量-张量和应用场景** +#### 扫盲-AI大模型必备之向量-张量和应用场景 * 什么是向量 * 向量就是一串有序的数字,像一条带方向的“箭头”, 在机器学习里面尤其重要 - image-20250313142026018 + image-20250313142026018 * 世间万物使用计算机表示,用的数字化语言,让计算机能理解复杂事物, 每个数据都包含多种属性 @@ -7943,7 +7329,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 向量就是有几个数字横向或者纵向排列而成,每个数字代表一个属性。 - ``` + ```python // 传统Java数据存储 String[] names = {"小明", "身高", "体重"}; Object[] person = {"张三", 175, 68.5}; @@ -7975,7 +7361,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - 高维向量表示用户画像 - ``` + ```python public class UserVector { // 每个维度代表一个特征 float[] features = new float[256]; @@ -8049,19 +7435,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 多维向量 → 更长的数字串(像详细简历)。 * 张量 → 数字的“集装箱”(像Excel表格、图片集、视频流)。 - - - - - - - - - - -#### 第2集 扫盲-高等数学里面的求和-点积公式讲解 - -**简介: 高等数学里面的求和-点积公式讲解** +#### 扫盲-高等数学里面的求和-点积公式讲解 * **什么是求和符号?** @@ -8071,21 +7445,19 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基本形式 - image-20250313151603856 + image-20250313151603856 - ![image-20250313151918579](D:/学习/笔记/img/image-20250313151918579.png) + ![image-20250313151918579](/img/image-20250313151918579.png) * **单变量求和示例** * 计算1到5的整数和: - image-20250313151657094 + image-20250313151657094 * 计算前3个偶数的平方和: - image-20250313151724171 - - + image-20250313151724171 * 点积(内积)的定义与计算 @@ -8093,41 +7465,27 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 点积是**两个向量对应分量相乘后求和**的运算,结果是一个标量(数值)。 - image-20250313161943645 + image-20250313161943645 * 几何意义 * 点积反映两个向量的夹角关系 * 通过在空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出 - image-20250313162742811 + image-20250313162742811 * 点积计算示例 - image-20250313162827278 - + image-20250313162827278 - - - - - - - - - - - -#### 第3集 扫盲-向量的相似度计算之余弦相似度 - -**简介: 扫盲-向量的相似度计算之余弦相似度** +#### 扫盲-向量的相似度计算之余弦相似度 * 补充:三角函数 * **正弦(sinθ)**:对边长度与斜边长度的比值。 * **余弦(cosθ)**:邻边长度与斜边长度的比值(即夹角的两边) - image-20250313164754696 + image-20250313164754696 * 为啥要学余弦相似度? @@ -8138,9 +7496,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **LLM大模型的RAG原理:用户输入自然语言query,找到最相关的文档** * 这些场景的共同点:需要量化两个事物的相似程度,向量空间中的"方向感" - image-20250313170154488 - - + image-20250313170154488 * 什么是余弦相似度? @@ -8150,9 +7506,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 公式(向量的模长等于其各分量平方和的平方根) - ![image-20250315152627015](D:/学习/笔记/img/image-20250315152627015.png) + ![image-20250315152627015](/img/image-20250315152627015.png) - image-20250313170520819 + image-20250313170520819 * **直观理解** @@ -8177,7 +7533,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 以二维向量为例:向量A = [3, 4],向量B = [1, 2] * 结论:两个向量方向高度相似! - image-20250313170904153 + image-20250313170904153 * 大模型中的核心应用场景 @@ -8194,27 +7550,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 物品向量:[0.4, 0.1, 0.0](科技类文章) * 相似度 ≈ 0.3×0.4 + 0.5×0.1 = 0.17 → 推荐该文章。 - - * 为什么重要:掌握余弦相似度,就是掌握了**连接数据与智能的钥匙**! -![1](D:/学习/笔记/img/1-1859494.png) +![1](/img/1-1859494.png) - - - - - - - - - - - - -#### 第4集 科学计算核心库NumPy和推荐系统案例 - -**简介: 科学计算核心库NumPy和推荐系统案例** +#### 科学计算核心库NumPy和推荐系统案例 * 什么是 NumPy? @@ -8227,7 +7567,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 原生 Python 列表的痛点 - ``` + ```python # 计算两个列表元素相加 a = [1, 2, 3] b = [4, 5, 6] @@ -8236,7 +7576,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * NumPy 的解决方案 - ``` + ```python import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) @@ -8252,7 +7592,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础安装 - ``` + ```python # 常规安装 pip install numpy @@ -8267,7 +7607,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例1:基础向量计算 - ``` + ```python import numpy as np def cos_sim(v1, v2): @@ -8299,7 +7639,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 案例2:推荐系统 - ``` + ```python import numpy as np def cosine_similarity(a, b): @@ -8335,34 +7675,10 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print("推荐排序:", recommendations) ``` - - - - - - - - - +### RAG系统必备之嵌入大模型Embedding - - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - -### 第三十八章 RAG系统必备之嵌入大模型Embedding - - - -#### 第1集 嵌入大模型Embedding和LLM大模型对比 - -**简介: 嵌入大模型Embedding和LLM大模型对比** +#### 嵌入大模型Embedding和LLM大模型对比 * 什么是文本嵌入Text Embedding @@ -8387,7 +7703,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **语义感知**:相似的文字数字也相似 - ``` + ```python # "狗"和"犬"的嵌入向量距离近 # "苹果"(水果)和"苹果"(手机)的嵌入距离远 ``` @@ -8408,7 +7724,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 句子1和2相近,因为维度大体相同 - image-20250313210027704 + image-20250313210027704 * 应用场景 @@ -8428,7 +7744,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 这些向量可以用于计算文本之间的相似度、进行信息检索和聚类分析 * 文本嵌入的整体链路 `原始文本 → Embedding模型 → 数值向量 → 存储/比较` -![image-20250313212722723](D:/学习/笔记/img/image-20250313212722723.png) +![image-20250313212722723](/img/image-20250313212722723.png) * LLM 大模型 vs Embedding 大模型 @@ -8468,31 +7784,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * Embedding:把论文段落转为向量,计算与数据库的相似度 * LLM:若发现高相似度,自动改写重复段落并给出修改建议 - - - - - - - - - - - - - - - - - - - - - - -#### 第2集 LangChain框架文本嵌入Embedding实战 - -**简介: LangChain框架文本嵌入Embedding实战** +#### LangChain框架文本嵌入Embedding实战 * LangChain框架中的Embedding @@ -8506,7 +7798,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 源码查看 - ``` + ```python from langchain.embeddings import OpenAIEmbeddings from abc import ABC, abstractmethod @@ -8554,9 +7846,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 在线嵌入模型使用,也可以使用其他的厂商 * 地址:https://bailian.console.aliyun.com/ - ![image-20250313215608473](D:/学习/笔记/img/image-20250313215608473.png) + ![image-20250313215608473](/img/image-20250313215608473.png) - ``` + ```python from langchain_community.embeddings import DashScopeEmbeddings # 初始化模型 @@ -8580,23 +7872,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(len(embeddings[0])) # 1536 ``` - - - - - - - - - - - - - -#### 第3集 本地私有化部署嵌入大模型Embedding实战 - -**简介: 本地私有化部署嵌入模型Embedding实战** +#### 本地私有化部署嵌入大模型Embedding实战 * 为什么要本地部署嵌入大模型 @@ -8615,7 +7892,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ 用户数据 → 企业内网服务器 → 本地模型处理 → 结果存于本地数据库 ``` - ![data_connection_diagram](D:/学习/笔记/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) + ![data_connection_diagram](/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) * 部署实战 @@ -8623,7 +7900,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 地址:https://ollama.com/search?c=embed - ``` + ```python #下载嵌入模型 ollama run mofanke/acge_text_embedding @@ -8645,7 +7922,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 由于 LangChain 0.3.x 尚未原生支持 Ollama 嵌入模型,需自定义接口类 * `pip install requests` - ``` + ```python from typing import List, Optional from langchain.embeddings.base import Embeddings import requests @@ -8678,7 +7955,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 使用自定义嵌入模型处理文档 - ``` + ```python embeddings = OllamaEmbeddings( model="mofanke/acge_text_embedding", base_url="http://localhost:11434" @@ -8699,25 +7976,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ print(len(embeddings[0])) # 1024 ``` - - - - - - - - - - - - - - - -#### 第4集 【面试题】RAG系统构建之嵌入模型性能优化 - -**简介: RAG系统构建之嵌入模型性能优化** +#### 【面试题】RAG系统构建之嵌入模型性能优化 * 需求背景(面试高频题目) @@ -8736,7 +7996,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 技术架构图 - ``` + ```python [应用程序] → 检查缓存 → 命中 → 返回缓存嵌入 ↓ 未命中 → 调用模型 → 存储结果 → 返回新嵌入 @@ -8750,7 +8010,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 核心语法与参数 - ``` + ```python from langchain.storage import LocalFileStore from langchain.embeddings import CacheBackedEmbeddings @@ -8770,7 +8030,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 存储支持多类型 - ``` + ```python #这个包里面 from langchain.storage @@ -8806,7 +8066,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基础版本(无缓存) - ``` + ```python from langchain.embeddings import OpenAIEmbeddings # 初始化模型 @@ -8819,7 +8079,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 带缓存版本 - ``` + ```python from langchain.storage import LocalFileStore from langchain.embeddings import CacheBackedEmbeddings @@ -8844,7 +8104,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 高级配置示例(分布式案例-存储Redis) - ``` + ```python # 带TTL的Redis缓存 from redis import Redis from langchain.storage import RedisStore @@ -8859,27 +8119,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ ) ``` - - - - - - - - - - - - - - - - - -#### 第5集 嵌入大模型CacheBackedEmbeddings案例实战 - -**简介: 嵌入模型CacheBackedEmbeddings案例实战** +#### 嵌入大模型CacheBackedEmbeddings案例实战 * **案例实战:对比嵌入大模型使用缓存前后性能区别** @@ -8900,8 +8141,11 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 编码实战 - ``` - from langchain.embeddings import CacheBackedEmbeddings,DashScopeEmbeddings + ```python + from langchain.embeddings import CacheBackedEmbeddings + # 已被弃用,需改为从 langchain_community.embeddings 导入 + # from langchain.embeddings import DashScopeEmbeddings + from langchain_community.embeddings import DashScopeEmbeddings import time # 初始化模型和缓存 from langchain.storage import LocalFileStore @@ -8954,40 +8198,15 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ | RedisStore | 高性能、支持分布式 | 需要运维Redis | 生产环境集群 | | InMemoryStore | 最快速度 | 重启丢失数据 | 临时测试 | - - - - - - - - - - - - - - - - - - -![logo](D:/学习/笔记/img/image-20230918114907133-5008948.png) **愿景:"IT路上的持续充电平台,让技术不再难学"** -**更多高级课程请访问 xdclass.net** - ### 第三十九章 大模型必备技术Milvus向量数据库 - - -#### 第1集 向量数据库介绍和技术选型思考 - -**简介: 向量数据库介绍和技术选型思考** +#### 向量数据库介绍和技术选型思考 * 为什么要用向量数据库,不能用MySQL存储? * 文档块通过嵌入模型处理后得到对应向量,下一步就是将向量存储到数据库中,方便后续进行检索使用 - ![data_connection_diagram](D:/学习/笔记/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) + ![data_connection_diagram](/img/data_connection-95ff2033a8faa5f3ba41376c0f6dd32a.jpg) * 传统数据库的局限性 @@ -9136,7 +8355,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 适用场景:推荐系统、图像检索、自然语言处理(NLP)等 * 全球大厂使用者 - ![Milvus Adopters](D:/学习/笔记/img/milvus-adopters.png) + ![Milvus Adopters](/img/milvus-adopters.png) * 支持部署的架构 @@ -9145,15 +8364,15 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * Milvus Standalone 是单机服务器部署,所有组件都捆绑在一个 Docker 镜像中,方便部署 * Milvus Distributed 可部署在 K8S 集群上,采用云原生架构,适合十亿规模甚至更大的场景,该架构可确保关键组件的冗余。 - image-20250318151846918 + image-20250318151846918 - image-20250318155633751 + image-20250318155633751 * Milvus 架构解析 * 数据处理流程 :插入数据 → 生成日志 → 持久化到存储层 → 构建索引 → 支持查询。 - export_qtyb85 + export_qtyb85 | 组件名称 | 核心职责 | 关键特性 | | :-------------: | :----------------------------------------------------------: | :---------------------------: | @@ -9171,7 +8390,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 每列代表一个字段,每行代表一个实体。 * 下图显示了一个有 8 列和 6 个实体的 Collection - ![Collection explained](D:/学习/笔记/img/collection-explained.png) + ![Collection explained](/img/collection-explained.png) @@ -9308,7 +8527,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 基于向量夹角的相似度。 - image-20250313170520819 + image-20250313170520819 @@ -9345,7 +8564,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 三者协作关系 -0 +0 | 维度 | 分区(Partition) | 分片(Shard) | 段(Segment) | | :--------: | :---------------: | :--------------------: | :----------------: | @@ -9377,13 +8596,13 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 系统自动将数据均分到3个分片(假设集群有3个节点) - 2 + 2 * **段阶段(自动完成)** * 分片内数据按512MB大小自动切割成多个段 - 4 + 4 * 三者协作原理 @@ -9494,7 +8713,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ - **Milvus Standalone**适用于中型数据集,可扩展至 1 亿向量。 - **Milvus Distributed 专为**大规模部署而设计,能够处理从一亿到数百亿向量的数据集。 - ![Select deployment option for your use case](D:/学习/笔记/img/select-deployment-option.jpeg) + ![Select deployment option for your use case](/img/select-deployment-option.jpeg) * Milvus分层架构(Docker部署都包括了) @@ -9600,7 +8819,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * **版本兼容性**:注意 Attu 与 Milvus 版本的匹配,避免接口不兼容问题【**当前安装的Milvus版本 V2.5X**】 * GitHub地址:https://github.com/zilliztech/attu - ![image-20250318190605311](D:/学习/笔记/img/image-20250318190605311.png) + ![image-20250318190605311](/img/image-20250318190605311.png) * 核心功能 @@ -9622,7 +8841,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){ * 安装实战(根据系统选择对应的客户端下载,输入ip+端口) - ![image-20250318201255473](D:/学习/笔记/img/image-20250318201255473.png) + ![image-20250318201255473](/img/image-20250318201255473.png)