惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
有赞技术团队
有赞技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
T
Tor Project blog
T
Threat Research - Cisco Blogs
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Register - Security
The Register - Security
Latest news
Latest news
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
T
Tenable Blog
H
Hacker News: Front Page
B
Blog
宝玉的分享
宝玉的分享
C
Check Point Blog
美团技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
G
GRAHAM CLULEY
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
L
Lohrmann on Cybersecurity
量子位
A
About on SuperTechFans
V2EX - 技术
V2EX - 技术
T
The Exploit Database - CXSecurity.com

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
AI Agent 全日制30天速成|Day3 笔记
云淡风轻YangG · 2026-06-18 · via 博客园_首页

AI Agent 全日制30天速成|Day3 教学笔记

今日总学习目标

  1. 掌握向量嵌入(Embedding)原理、文本向量化、向量相似度计算
  2. 搭建简易本地向量库(内存版FAISS),实现文本入库、检索、删除
  3. 打通基础RAG检索链路:文档分片→向量化存储→用户提问召回片段→注入Prompt
  4. 结合Day2工具调用,实现「RAG知识库检索 + Function Calling」混合Agent
    每日时长分配(全天8h)
  • 理论笔记阅读+理解:2.5h
  • 代码编写调试:4h
  • 复盘+面试题背诵:1.5h

一、核心理论教学笔记

1. Embedding 向量嵌入基础

1.1 核心概念

Embedding(向量嵌入):将自然语言文本转化为固定长度浮点数字向量,语义相近的文本,向量在空间距离更近。

  • 用途:知识库检索、文档相似度匹配、分类聚类、对话记忆检索
  • 兼容规范:国内通义千问、DeepSeek、OpenAI均提供统一Embedding接口,同样只替换base_url与key即可复用代码

1.2 相似度计算(RAG核心)

常用两种计算方式:

  1. 余弦相似度 Cosine Similarity(向量检索标准)
    • 取值范围[-1,1],越接近1代表语义越相似
    • 不受向量长度影响,长/短文本对比首选
  2. 欧式距离:距离越小越相似,长文本向量不推荐

1.3 文本分片(Chunk)规则

大模型单次Embedding存在输入长度限制,长文档必须拆分片段:

  • 固定长度分片:按字符/Token切割(简单易实现,缺点容易割裂完整语义)
  • 重叠分片:每段chunk保留前后重叠文本,解决上下文割裂问题(工程首选)
  • 分片长度建议:200~600汉字,兼顾检索精度与上下文完整性

1.4 Embedding 接口调用要点

  1. 输入支持批量文本,单次批量提交降低接口调用次数、节省计费
  2. 批量接口有单次文本条数上限,超过需做分批切割
  3. Embedding无流式输出,均为同步返回向量数组
  4. 向量化过程会消耗Token,批量任务需增加并发限流、重试机制

2. 向量数据库基础(FAISS内存版)

2.1 FAISS介绍

Meta开源轻量向量检索库,适合本地测试、小型知识库,无需部署服务:

  • 支持向量添加、批量入库、相似度TopK检索
  • 支持向量与原文映射存储(索引→文本元数据)
  • 百万级以内向量检索速度极快,适合学习阶段使用

2.2 向量库存储两层结构

  1. FAISS索引:仅存储浮点向量,用于快速相似度检索
  2. 元数据映射字典:index_id -> {原文文本、来源、标题},检索拿到id后反向取出原文

2.3 检索流程

用户提问 → 提问文本向量化 → FAISS检索TopN相似向量 → 通过id匹配原文片段 → 拼接进Prompt交给LLM

3. RAG检索增强生成完整链路(标准5步)

  1. 文档加载与分块:读取知识库文档,切割为重叠Chunk片段
  2. 文本向量化入库:调用Embedding接口,所有Chunk生成向量存入FAISS
  3. 用户提问向量化:用户问题单独生成查询向量
  4. 相似度召回:检索最相似的Top-K知识库片段
  5. 上下文增强生成:把召回文档作为参考资料塞入System Prompt,限制模型仅基于参考内容回答,减少幻觉

3.4 RAG解决的核心问题

  • 大模型知识截止时间问题,可接入实时业务文档、私有知识库
  • 大幅降低模型幻觉,强制模型引用检索到的资料作答
  • 减少超长上下文Token消耗,无需全量传入知识库,只召回相关片段

4. RAG + Function Calling 混合Agent逻辑

两条能力互补:

  1. 私有文档、内部知识库查询 → 使用RAG向量检索
  2. 实时数据、计算、外部接口查询 → 使用Function Calling工具调用
    执行流程:
    用户提问 → 先执行RAG召回知识库内容 → 将检索片段注入System Prompt → 模型判断是否需要调用工具 → 执行工具闭环 → 结合知识库+工具结果输出最终答案

二、今日学习重点

  1. 封装兼容OpenAI标准的Embedding异步调用客户端
  2. 实现重叠文本分片工具函数
  3. 封装内存FAISS向量库,完成增、查基础操作
  4. 搭建完整单轮RAG问答链路,限制模型仅基于检索内容作答
  5. 融合Day2工具调用,实现RAG+Function Calling混合智能体

三、今日难点 & 解决方案

难点1:分片切割破坏完整语义,检索结果不相关

解决方案:

  1. 开启重叠分片,设置50~100字重叠区间
  2. 分片长度控制在300~500汉字,避免单块内容过短/过长
  3. 检索后增加重排逻辑(简单版:过滤相似度低于阈值的片段)

难点2:向量检索返回无关文本,模型答非所问

解决方案:

  1. 设置相似度阈值,低于阈值直接丢弃片段,不注入Prompt
  2. Prompt强约束:没有相关资料时统一回复“暂无相关资料”,禁止编造内容
  3. 优化Embedding输入,对知识库chunk做简单摘要再向量化

难点3:批量Embedding接口超限、请求频繁触发限流

解决方案:

  1. 封装批量分批工具,按接口最大条数拆分文本列表
  2. 使用信号量控制Embedding并发,捕获429限流指数退避重试
  3. 向量本地缓存,重复文本无需重复调用Embedding接口

难点4:RAG与工具调用逻辑冲突,模型优先调用工具忽略知识库

解决方案:

  1. System Prompt明确优先级:先参考知识库内容,无法解决再调用工具
  2. 检索片段放在Prompt最靠前位置,提升权重
  3. Few-shot示例演示“先读知识库,再判断是否需要工具”

四、完整练习代码(基于Day1、Day2代码扩展)

依赖安装

pip install faiss-cpu numpy aiohttp pydantic fastapi uvicorn

1. embedding向量客户端 + FAISS向量库 rag_store.py

import aiohttp
import asyncio
import faiss
import numpy as np
import json
from typing import List, Dict, Tuple

# 模型配置(沿用前两日)
MODEL_CONFIG = {
    "qwen-turbo": {
        "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
        "embedding_url": "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings",
        "api_key": "你的通义千问key"
    },
    "deepseek-chat": {
        "base_url": "https://api.deepseek.com/v1/chat/completions",
        "embedding_url": "https://api.deepseek.com/v1/embeddings",
        "api_key": "你的deepseek key"
    }
}

# 文本分片工具(重叠分片)
def split_text_chunk(text: str, chunk_size: int = 400, overlap: int = 80) -> List[str]:
    chunks = []
    start = 0
    text_len = len(text)
    while start < text_len:
        end = min(start + chunk_size, text_len)
        chunk = text[start:end]
        chunks.append(chunk.strip())
        start += chunk_size - overlap
    return chunks

# 异步Embedding客户端
class AsyncEmbeddingClient:
    def __init__(self, model_name: str = "qwen-turbo"):
        self.conf = MODEL_CONFIG[model_name]
        self.semaphore = asyncio.Semaphore(3)
        self.timeout = aiohttp.ClientTimeout(total=30)

    async def batch_embedding(self, texts: List[str]) -> List[List[float]]:
        headers = {
            "Authorization": f"Bearer {self.conf['api_key']}",
            "Content-Type": "application/json"
        }
        payload = {
            "input": texts,
            "model": "text-embedding-v1"
        }
        async with self.semaphore:
            async with aiohttp.ClientSession(timeout=self.timeout) as session:
                resp = await session.post(self.conf["embedding_url"], json=payload, headers=headers)
                res_data = await resp.json()
                vecs = [item["embedding"] for item in res_data["data"]]
                return vecs

# 内存FAISS向量库封装
class FaissVectorStore:
    def __init__(self, vec_dim: int = 1536):
        self.index = faiss.IndexFlatL2(vec_dim)
        self.meta_map: Dict[int, Dict] = {}
        self.current_id = 0

    # 批量插入向量+原文
    def add_batch(self, vectors: List[List[float]], metas: List[Dict]):
        arr = np.array(vectors, dtype=np.float32)
        self.index.add(arr)
        for meta in metas:
            self.meta_map[self.current_id] = meta
            self.current_id += 1

    # 相似度检索TopK
    def search(self, query_vec: List[float], top_k: int = 3, score_threshold: float = 600) -> List[Dict]:
        arr = np.array([query_vec], dtype=np.float32)
        distances, ids = self.index.search(arr, top_k)
        results = []
        for dist, idx in zip(distances[0], ids[0]):
            if idx == -1:
                continue
            if dist > score_threshold:
                continue
            meta = self.meta_map.get(idx, {})
            meta["distance"] = float(dist)
            results.append(meta)
        return results

# RAG统一封装类
class RAGService:
    def __init__(self, model_name="qwen-turbo"):
        self.emb_client = AsyncEmbeddingClient(model_name)
        self.vec_store = FaissVectorStore(vec_dim=1536)

    # 文档入库:文本分片+向量化+存入向量库
    async def add_document(self, doc_text: str, source: str = "默认文档"):
        chunks = split_text_chunk(doc_text)
        if not chunks:
            return
        vecs = await self.emb_client.batch_embedding(chunks)
        metas = [{"text": c, "source": source} for c in chunks]
        self.vec_store.add_batch(vecs, metas)

    # 用户提问召回知识库片段
    async def retrieve(self, query: str, top_k=3):
        query_vec = await self.emb_client.batch_embedding([query])
        return self.vec_store.search(query_vec[0], top_k=top_k)

# 测试RAG
async def test_rag():
    rag = RAGService()
    # 模拟知识库文档
    doc = """AI Agent 是具备工具调用、记忆、规划能力的智能体。
    Agent可以读取私有知识库,结合计算器、数据库等外部工具完成复杂任务。
    RAG检索增强生成用于解决大模型知识滞后、幻觉问题,先检索文档再回答用户问题。
    Function Calling允许模型自主调用外部函数,完成数学计算、实时数据查询。"""
    await rag.add_document(doc, source="Agent基础文档")
    # 用户提问召回
    res = await rag.retrieve("RAG有什么作用")
    print("召回知识库片段:")
    for item in res:
        print(f"相似度距离:{item['distance']} 内容:{item['text']}")

if __name__ == "__main__":
    asyncio.run(test_rag())

2. RAG+工具调用混合LLM服务 llm_rag_agent.py

import asyncio
from pydantic import BaseModel, Field, ValidationError
import json
from rag_store import RAGService
# 复用Day2 LLM客户端、工具定义
from llm_client_v2 import AsyncLLMClientV2, TOOLS, TOOL_MAP, CalcToolParams

# 混合Agent整合类
class MixedRAGAgent:
    def __init__(self, model_name="qwen-turbo"):
        self.llm = AsyncLLMClientV2(model_name)
        self.rag = RAGService(model_name)
        self.system_base = """
你是智能AI助手,回答严格遵守以下规则:
1. 优先参考下方知识库检索内容作答,禁止编造不存在信息;
2. 如果知识库无相关内容,再判断是否需要调用计算器工具;
3. 数学计算必须调用calculator工具,禁止手动计算;
4. 无资料、无可用工具时,直接回复暂无相关信息。
【知识库参考资料】:
{rag_context}
"""

    # 完整问答链路:RAG召回 + 工具调用闭环
    async def chat(self, user_query: str):
        # 1. RAG召回相关文档
        retrieve_list = await self.rag.retrieve(user_query, top_k=3)
        rag_context = "\n".join([item["text"] for item in retrieve_list])
        # 2. 拼接系统提示词
        system_prompt = self.system_base.format(rag_context=rag_context)
        messages = [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_query}
        ]
        # 3. 执行工具调用对话
        answer = await self.llm.chat_with_tools(messages, TOOLS)
        return {
            "answer": answer,
            "reference_doc_count": len(retrieve_list),
            "reference_content": rag_context
        }

# 测试混合Agent
async def test_mixed_agent():
    agent = MixedRAGAgent()
    # 预先写入知识库
    doc = """RAG全称检索增强生成,作用是接入私有文档减少模型幻觉。
    Function Calling是大模型调用外部工具的能力,支持计算器、接口查询。"""
    await agent.rag.add_document(doc, source="Agent知识库")

    # 测试1:知识库相关问题
    print("问题1:什么是RAG?")
    res1 = await agent.chat("什么是RAG?")
    print("回答:", res1["answer"])
    print("参考文档:", res1["reference_content"])

    # 测试2:数学计算,触发工具调用
    print("\n问题2:365*2等于多少?")
    res2 = await agent.chat("365*2等于多少?")
    print("回答:", res2["answer"])

if __name__ == "__main__":
    asyncio.run(test_mixed_agent())

3. FastAPI 一体化接口 main_rag.py

from fastapi import FastAPI, Query
import asyncio
from llm_rag_agent import MixedRAGAgent

app = FastAPI(title="Day3 RAG+Function Calling混合Agent")
agent = MixedRAGAgent()

# 预加载知识库文档
@app.on_event("startup")
async def load_knowledge():
    doc = """
AI Agent 30天速成课程Day3学习内容:
1. Embedding向量嵌入将文本转为数字向量,用于相似度检索;
2. FAISS本地向量库存储向量,实现私有知识库检索;
3. RAG检索增强生成解决大模型幻觉、知识滞后问题;
4. RAG结合Function Calling,同时支持知识库查询与外部工具调用;
5. 文本分片采用重叠切割,避免语义断裂。
"""
    await agent.rag.add_document(doc, source="Day3学习文档")

@app.get("/chat/rag")
async def chat_rag(prompt: str = Query(..., description="用户提问")):
    result = await agent.chat(prompt)
    return result

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main_rag:app", reload=True)

五、今日必做练习任务

  1. 填入有效API Key,运行rag_store.py,测试文档分片、向量入库、相似度检索
  2. 修改分片chunk_sizeoverlap参数,观察召回内容完整性变化
  3. 调整检索score_threshold阈值,观察无关片段过滤效果
  4. 运行混合Agent代码,分别测试知识库问题、数学计算问题,验证RAG与工具调用双逻辑
  5. 启动FastAPI,连续提问,查看接口返回的参考文档片段
  6. 新增一段无关知识库文本,测试模型不会引用无关内容

六、今日配套面试题(RAG入门必考)

基础问答

  1. 什么是Embedding向量嵌入?余弦相似度在RAG中的作用?
  2. RAG完整执行流程分为哪几步?RAG解决了大模型哪些痛点?
  3. 文本分块为什么需要设置重叠分片?固定长度分片有什么缺陷?
  4. 简述FAISS的作用,内存向量库的优缺点?
  5. RAG + Function Calling混合架构的执行顺序和设计思路?

工程实操题

  1. 检索出无关文本,如何优化召回效果?写出至少3种方案
  2. 批量Embedding调用时,如何处理接口批量上限、并发限流问题?
  3. 如何通过Prompt约束模型只能基于检索到的知识库内容回答,避免幻觉?
  4. 内存FAISS重启后向量丢失,线上生产环境如何持久化向量数据?

拓展思考题(进阶)

  1. Top-K检索只取固定条数,如何实现结果重排提升检索精度?
  2. 海量百万级知识库,本地FAISS无法承载,有哪些商用向量数据库可选?
  3. 如果知识库文档极大,全量向量化耗时过长,如何做增量更新?

面试题参考答案

基础问答

  1. Embedding与余弦相似度
    Embedding把文本映射为低维浮点向量,语义相近文本向量空间距离更近;余弦相似度衡量两个向量夹角,取值0~1,数值越高代表语义越相似,是RAG检索排序标准。

  2. RAG流程与解决痛点
    流程:文档分块→向量化入库→提问向量召回片段→片段注入Prompt生成回答。
    解决痛点:模型知识截止、私有业务数据无法输入、模型自由编造内容(幻觉)、超长上下文Token超限。

  3. 重叠分片作用
    固定长度分片会把完整语义句子拆分成两段,导致检索缺失上下文;重叠分片每段保留前后一小段文本,保证跨分片语义完整,提升检索准确率。

  4. FAISS优缺点
    FAISS是开源向量检索库,快速计算向量相似度。
    优点:本地运行无需部署服务、检索速度快、上手简单;缺点:仅内存存储,重启丢失数据,不支持海量数据持久化、复杂过滤条件。

  5. 混合架构执行顺序
    先执行RAG召回私有知识库内容,将检索片段注入系统提示词;再交由模型判断是否需要调用外部工具;工具执行结果回填上下文,模型结合知识库+工具数据给出最终回答。

工程实操题

  1. 优化无关检索片段方案
  • 设置相似度阈值,过滤距离过大低相关文本;
  • 采用重叠分片提升Chunk语义完整性;
  • Prompt强约束禁止使用知识库外信息;
  • 增加检索重排,过滤弱相关内容;
  • 优化Embedding输入,对长文档做摘要再向量化。
  1. 批量Embedding限流与分批
    按接口最大单次文本数量切割列表,分批提交;使用信号量限制并发;捕获429限流异常,指数退避重试;缓存重复文本向量,减少重复调用。

  2. 约束模型减少幻觉
    System Prompt明确:无相关资料统一回复无信息,禁止编造;将检索片段放在Prompt最前,提升权重;配合temperature=0降低随机性;Few-shot示例演示正确回答方式。

  3. 向量持久化方案
    生产不使用内存FAISS;选用支持持久化的向量库:Chroma、Milvus、Qdrant、PGVector;向量落地磁盘,支持重启加载、增量更新。

拓展思考题

  1. 检索重排
    基础粗召回(FAISS TopK)→ 重排模型(Cross-Encoder)对召回片段与问题打分,过滤低分片段,大幅提升精准度。
  2. 线上向量数据库
    开源:Milvus、Qdrant、Chroma、PGVector;云厂商托管:阿里云DashVector、腾讯云向量库、Pinecone。
  3. 知识库增量更新
    记录文档唯一ID,仅对新增/修改文档分片向量化;增量插入向量库,不重复处理全量历史文档;维护文档-向量映射关系,支持删除旧向量。

学习总结

Day3完成AI Agent三大核心能力之一:RAG检索增强,打通「私有知识库读取」链路,同时融合Day2的Function Calling实现混合智能体。
向量嵌入、文本分片、相似度检索是RAG底层核心,面试高频提问;内存FAISS适合本地学习,为后续持久化向量库、高级重排、多模态RAG打下基础。
至此底层工具链全部成型:异步LLM客户端、SSE流式、Function Calling、多轮会话、RAG知识库,完整支撑简易Agent开发。