# 2026.6.9原力健康 双非硕鼠鼠Agent开发凉经
1. 知识库的检索过程能介绍一下吗?
2. 你的原始知识来自哪里?
3. chunk 切片阶段有哪些优化手段?
4. 有没有专门解析这些文档的模型?
5. 向量化用的是什么模型?
6. 检索的时候也需要向量化吗?
7. 你会把用户问题进行改写,对吗?改写方法有哪些?
8. 如果检索不到怎么办?
9. 听说过多路召回吗?
10. 如果系统要改成多路召回,你会怎么改?几路召回?
11. LangChain 和 LangGraph 听说过吗?
12. 如果用 LangGraph 编排问答系统,会大致分为几个节点?
13. 第一个节点是什么?第二个节点是什么?
14. Redis 分布式锁讲一下。
15. 缓存穿透、击穿、雪崩了解吗?
16. Redis 为什么快?
17. 基础数据结构了解吗?
18. 设计模式接触过哪些?
19. 动态规划了解吗?
20. 讲一下冒泡排序。
21. 冒泡排序可以双向吗?
22. 双向冒泡复杂度有变化吗?
23. 双向冒泡相比单向冒泡有哪些优化?
一、 RAG 与大模型应用 (Q1-Q13)
1. 知识库的检索过程
标准流程为:用户提问 → Query改写/扩展 → 向量化(Embedding) → 向量数据库检索(ANN) → 重排序(Rerank) → 上下文组装 → LLM生成。高级系统还会加入元数据过滤和混合检索。
2. 原始知识来源
我的预训练数据来自互联网公开文本、书籍、学术论文、代码仓库等海量语料;而在RAG场景下,“知识”特指用户上传或企业私有的文档数据,经过解析、切片、向量化后存入向量数据库。
3. Chunk 切片阶段的优化手段
- 语义切分:基于NLP句子边界或段落语义完整性切分,而非固定字符数。
- 重叠窗口(Overlap):保留10%-25%的重叠内容,防止上下文断裂。
- 父子索引(Parent-Child Indexing):小切片用于精准检索,命中后返回其所属的大切片给LLM。
- 结构化增强:为每个Chunk附加摘要、标题、关键词等元数据。
- Markdown感知:针对表格、列表、代码块做特殊保护,避免从中间截断。
4. 专门的文档解析模型
是的,目前主流且效果较好的包括:
- MinerU2.5-Pro (OpenDataLab):2026年最新SOTA,复杂表格/公式解析能力极强。
- Marker:轻量级PDF转Markdown,速度快,适合基础文献。
- Docling (IBM):开源,支持多种格式,结构化输出好。
- Surya:高精度OCR和版面分析模型。
- GOT-OCR / Qwen-VL:端到端多模态文档理解模型。
5. 向量化模型
中文场景常用:BGE-M3、BCEmbedding、text2vec-large-chinese、Qwen3-Embedding。
英文/多语言场景:E5-Mistral-7B-Instruct、Cohere Embed v3、OpenAI text-embedding-3-large。
选型需参考 MTEB/C-MTEB 榜单及业务延迟要求。
6. 检索时也需要向量化吗?
必须。 检索的本质是计算Query向量与文档向量的相似度(余弦/内积),因此用户问题必须通过与索引阶段相同的Embedding模型转换为向量。
7. 用户问题改写及方法
对,改写能显著提升召回率。常见方法:
- HyDE:让LLM先生成一个“假设性答案”,用该答案去检索。
- Multi-Query:将一个问题改写为3-5个不同角度的子查询,合并结果。
- Step-back Prompting:将具体问题抽象化为更宽泛的问题。
- 指代消解/补全:结合历史对话补全省略的主语或宾语。
- 关键词提取+扩展:抽取核心实体并补充同义词。
8. 检索不到怎么办?
- 降级策略:扩大Top-K、降低相似度阈值、回退到全文关键词检索。
- 兜底回复:诚实告知“未找到相关信息”,避免幻觉。
- 追问用户:引导用户补充更多细节。
- 联网搜索:作为外部知识源补充。
- 反馈闭环:记录bad case,后续优化索引或改写策略。
9. 多路召回
听说过。指同时使用多种检索策略(如向量检索 + BM25关键词检索 + 知识图谱检索 + 元数据过滤),各自返回候选集,再通过Rerank模型或加权算法进行融合排序,以兼顾语义理解和精确匹配。
10. 改成多路召回的设计方案
建议 3路召回:
- 稠密向量检索(Dense Retrieval):捕捉语义相似性。
- 稀疏检索(BM25/Elasticsearch):捕捉精确关键词、专有名词、编号。
- 结构化/图谱检索(Metadata/KG):处理实体关系、时间范围、分类过滤等确定性查询。
最后接一个 Cross-Encoder Rerank 模型做精排融合。
11. LangChain 和 LangGraph
都了解。LangChain 是LLM应用开发的基础框架,提供链式调用、工具集成等抽象;LangGraph 是LangChain团队推出的状态图编排框架,专为构建有循环、条件分支、持久化状态的复杂Agent/Workflow设计,弥补了LangChain线性链的不足。
12. LangGraph 编排问答系统的节点划分
典型RAG Agent至少包含 4-5个核心节点:
- Query Analysis / Rewrite Node
- Retrieval Node
- Relevance Check / Grader Node
- Generation Node
- Answer Validation / Self-Correction Node(可选)
13. 第一和第二个节点
- 第一个节点:Query Analysis / Rewrite Node —— 分析用户意图、改写问题、决定是否需要检索或直接回答。
- 第二个节点:Retrieval Node —— 执行实际的检索操作(可包含多路召回逻辑),将结果写入State。
二、 Redis 与后端架构 (Q14-Q17)
14. Redis 分布式锁
- 基本原理:
SET key value NX EX timeout原子命令获取锁。 - 释放安全:Lua脚本保证“判断值+删除”原子性,防止误删他人锁。
- 续期机制:Watchdog(如Redisson)自动续期,防止业务未完成锁过期。
- 高可用:RedLock算法(多实例多数派加锁),但存在争议;生产环境更推荐基于ZooKeeper/etcd的强一致锁,或接受Redis锁的最终一致性。
15. 缓存穿透、击穿、雪崩
| 问题 | 定义 | 解决方案 |
|---|---|---|
| 穿透 | 查询不存在的数据,请求直达DB | 布隆过滤器、缓存空值 |
| 击穿 | 热点Key过期瞬间大量并发打DB | 互斥锁(singleflight)、逻辑过期 |
| 雪崩 | 大量Key同时过期或Redis宕机 | 随机过期时间、多级缓存、限流熔断 |
16. Redis 为什么快?
- 纯内存操作,纳秒级访问。
- IO多路复用(epoll/kqueue),单线程处理网络请求无锁竞争。
- 高效数据结构(SDS、跳表、压缩列表、哈希表等)。
- 通信协议简单(RESP),解析开销小。
- 6.0+多线程IO:仅网络读写并行,命令执行仍单线程,兼顾吞吐与安全。
17. 基础数据结构
Redis底层核心结构:
- SDS(Simple Dynamic String):字符串
- ziplist / listpack:紧凑列表(小对象)
- quicklist:双端链表+压缩列表混合
- skiplist:跳表(有序集合)
- intset:整数集合
- hashtable:字典(渐进式rehash)
- stream:消息流(Radix Tree + Listpack)
三、 计算机基础 (Q18-Q23)
18. 设计模式
常用的包括:
- 创建型:工厂、单例、建造者
- 结构型:适配器、装饰器、代理、门面
- 行为型:策略、观察者、模板方法、责任链
在AI系统中,策略模式(切换检索/改写策略)、责任链模式(Pipeline处理)、观察者模式(流式输出回调)尤为常见。
19. 动态规划
了解。核心思想:最优子结构 + 重叠子问题 → 状态转移方程 + 记忆化/自底向上填表。
经典问题:背包、最长公共子序列、编辑距离、区间DP、树形DP等。关键在于定义状态 dp[i][j] 的含义和推导转移关系。
20. 冒泡排序
重复遍历数组,比较相邻元素,若逆序则交换。每轮将最大元素“冒泡”到末尾。
for i in range(n-1):
for j in range(n-1-i):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
时间复杂度 O(n²),空间 O(1),稳定排序。
21. 双向冒泡(鸡尾酒排序)
可以。在单向冒泡基础上,交替从左→右和从右→左两个方向扫描交换。正向把最大值推到右端,反向把最小值推到左端。
22. 双向冒泡复杂度变化
- 最坏/平均时间复杂度:仍为 O(n²),渐近复杂度不变。
- 最好情况:O(n)(已有序时一趟即止,与优化后的单向冒泡相同)。
- 常数因子:比单向冒泡略大(每轮两次遍历),但在特定数据分布下实际交换次数更少。
23. 双向冒泡相比单向的优化点
- 解决“乌龟问题”:当最小元素位于数组末尾时,单向冒泡需要n-1轮才能将其移到首位;双向冒泡一轮反向扫描即可归位。
- 双向收缩边界:记录最后一次交换位置,左右边界同时向内收缩,减少无效比较。
- 对部分有序数据更友好:尤其适用于“两端无序、中间有序”或“尾部有小元素”的场景。
⚠️ 注意:尽管双向冒泡有上述优化,它仍然是O(n²)算法,仅具教学意义。生产环境请使用 TimSort、IntroSort 等 O(n log n) 算法。
评论区