#技术 · #AI
AI学习和总结
RAG
步骤
- 离线阶段:文档加载切分chunk。根据自然语义切分,并且设置一定overlap。然后用embedding模型向量化,存储在向量数据库
- 在线阶段:提问后,用同样模型把问题向量化,然后做混合检索,RRF融合召回后根据相关性rerank
- 生成:把检索到的内容和用户问题拼成 prompt,要求模型基于给定资料回答,不知道就说不知道,并且尽量附上引用来源
优化
提问优化
- 优化问题
- 多查询策略 Multi-Query
- 多查询结果融合 RAG-Fusion:
- 生成多个查询
- 并行检索
- 使用RRF算法融合结果
- 返回重新排序的Top-K文档
- 问题分解策略
顺序分解,并行分解,层次分解 - step back问答回退
- HyDE 用假答案区匹配真答案(优缺点
- 路由优化(逻辑路由,语义路由
- 问题构建策略(变成数据库语言检索
离线阶段 - 索引生成优化
- Multi-representation Index(多表示索引)
Multi-representation Index 是为了解决单表示检索的一个矛盾:原文太长,嵌入向量容易稀释语义;原文太短,又丢信息。它的做法是用 LLM 为原文生成多个检索表示,比如摘要或假设性问题,用这些表示建索引。检索时用它们匹配,命中后回溯源文档,把完整原文交给 LLM 生成答案。本质上是检索和生成解耦。 - RAPTOR(递归抽象处理树状检索)
RAPTOR 可以看作 Multi-representation 思路的系统化升级。Multi-representation 是给单篇文档生成几个代理表示,让匹配更准;RAPTOR 则是用递归摘要把整个文档库组织成一棵语义树,检索时既能在叶子层拿细节,也能在高层拿宏观摘要。它解决的是多跳、整合型问题里‘只见树木不见森林’的问题。 - ColBERT(Token级别上下文检索) ColBERT 比普通单向量检索更耗存储和计算,因为普通做法是把文档所有 token 向量池化成一个向量,而 ColBERT 保留每个 token 的向量序列。好处是避免了压缩损失,查询里每个 token 可以各自去找最匹配的文档 token,保留细粒度匹配证据,而不是被平均成一个模糊的整体向量。代价是索引存储量大约变成 token 数倍,在线 MaxSim 计算也更重。
在线阶段 - 检索优化
- Ranking(排序):对检索结果进行初步排序 精排前,RRF融合混合检索结果,计算排名召回 精排阶段,根据专门排序引擎或者LLM重排筛选
- Refinement(精炼):对检索结果进行过滤和优化
- Adaptive Retrieval(自适应检索):根据查询特征动态调整检索策略
生成 - 优化
CRAG(纠错检索增强生成)
- 检索评估器
- 知识精炼
- 网络搜索 Self-RAG(自反思检索增强生成) 把问题分解为是否需要检索
评估RAG
- 检索质量
- 召回率
- 准确率
- MRR(正确答案排第几位
- 生成质量
- 事实准确度
- 忠实度
- 相关性
- 端到端评估
Agent
架构分层
感知层、认知层、执行层、记忆层
组成部分
大语言模型、规划模块、记忆模块、工具集
工作原理
ReAct, Chain of Thought, Plan-and-Execute, Self-Ask
LangChain
LangGraph
Transformer
Harness
读代码学习
离线入库:
- 解析PDF/TXT/MarkDown/Docx,返回 list[textBlock],包含文章页数,标题等信息
- 分块,800/120 切分,注意标点符号,并且拼接标题
- 文本转化为向量,id,embedding(和标题拼接的doc转化的向量),docments,matadata(chunk信息)
- 存入chorma,chorma返回的是距离
在线问答:
- BM25+RRF
retrieval_service.py ★★★ 第5步 检索总编排(最该精读) retrieval_scoring.py ★ 纯函数 BM25+RRF(最好读,从这里入门) reranker_client.py 第6步 精排(可降级) prompt_builder.py 第7步 拼 prompt + 清理引用 llm_client.py 第8步 调大模型 rag_service.py ★★ 编排:检索→拼prompt→生成→清理→存历史
- BM25 用jieba分词,然后计算在每篇文章出现的次数。词的罕见程度,出现的频次都会影响分数。
- RRF:向量检索和BM25融合,根据rank计算分数。k=60
问题:
- 超时重试,异常降级,防死循环,未检索到正确文章如何排查
- 如何节约Token,防止幻觉,持久化
1. agent是什么?和RAG,workflow,chain有什么区别?
Agent 是能自主决定下一步做什么的系统,控制流由模型决策。
RAG 是一种能力/架构模式,专门解决模型知识不足需要外部证据。可以是一条链,也可以嵌入agent。
chain 是 固定顺序的调用编排:A → B → C,步骤和顺序预先写死。它没有自主决策。
Workflow 比 chain 更宽,是带分支、条件、并行、人工节点的流程编排,但路由规则仍然是人预先定义的。
2. Agent核心由几个模块组成?
目标与任务理解模块,规划/决策模块,工具/动作执行模块,记忆/状态模块,输出与校验模块
3. ReAct执行流程
| 方式 | 介绍 |
|---|---|
| React | thought — action — observation循环 优点:灵活,走一步看一步 |
| plan-and-execute | 适合流程长,且子任务存在依赖 |
| Reflexion | 自我纠错反思,在上面基础加一层复盘,下一次尝试规避 |
| Tree-of-Thought | 展开多个推理后择优,适合复杂规划任务 |
| DAG | 一次生成完整的工具依赖图,可并行token,成本低 |
4. Function calling作用
让模型从”只会生成文本”变成”能结构化的表达要调什么工具、传什么参数”,但执行本身不在模型里
5. Memory负责什么?
保持信息的延续性和可复用性。短期记忆,长期记忆,中间状态记忆
短期记忆压缩分四层:最近轮对话保留,更早轮结构化摘要,指针话文档片段,丢弃对后续决策无关信息
长期记忆防污染:按需取用,分级权重,时效性(新覆盖旧),记忆不当作事实
指代绑定在短期记忆里怎么维护:做一个表,内容包含实体,出现轮次等等。按照权重,比如类型,后提及的。没有就直接问
6. Agent架构是什么?
7. 怎么判断何时调用工具
规则兜底,llm判断
8. 幻觉原因,怎么处理
检索没召回到,模型硬答;召回到了但不相关,模型被误导;模型编造引用、编号越界;模型在正确证据上过度推理、加戏;多轮里指代绑错,答非所问
9. 工具超时怎么容错
超时重试,熔断,降级方案,记录
10. RAG召回不准怎么排查
入库侧,召回侧,精排侧,查询侧分级排查
11. 死循环怎么解决
先判断是哪种死循环,有agent循环死循环,工具失败重试死循环,状态机原地打转。 设置重试次数,时间,收敛判断,记录
12. prompt怎么设计
设置好边界和拒答
约束要双重:prompt+代码硬约束
审计独立prompt,对抗找问题
节省上下文:渐进式披露,指针化,分层
改动可回归,测评
13. 怎么统计token
openAI的usage字段,使用时标注记录
14. 怎么测评效果的
建固定标注集:问题 → 正确片段 → 标准答案,分可回答和必拒答两类,方便拒答阈值、证据充分性阈值、相关性过滤阈值设置
确定性测试断言, 收敛度评估
15. agent回答不稳定怎么办
看是输入侧,检索侧,生成侧,工具侧,哪里的问题。同样问题多次问根据路径,答案分布等等,定位来源
16.
17. 多agent适合什么场景?有什么问题
18. 为什么用langgraph
19. 优化agent怎么做
20. agent最大局限?
规划不确定性,结果不可预测,成本高
21.如何做agent的监控
22. 多agent怎么设计,设计角色,通信
按职责分:规划者,执行者,审阅者,仲裁者
通信:共享状态,消息传递
模式:supervisor,pipeline(流水线),parallel(并行),debate(辩论),层级模式
责任可追溯,单个可独立,结构化输出,循环检测+轮次上限
23.意图识别:
24. 遇到了哪些问题怎么解决的
- 不同车型文档难以区分---元数据加上车型
- xxx错误码怎么处理---BM25更容易检索到,混合检索
- 拒答阈值不好定,且 Reranker 可能挂
- 自主迭代不收敛
添加新评论