本文是Agent面试题的第四辑,精选15道关于Agent与RAG(检索增强生成)结合的高频面试题,涵盖Agent+RAG架构设计、RAG作为工具、检索优化、记忆管理、性能优化、实际应用等核心知识点,适合准备大模型应用岗位面试的同学。
字数约 8000,预计阅读 16 分钟
一、Agent+RAG架构设计篇(3题)
01|Agent 和 RAG 如何结合?有哪些架构模式?
参考答案:
结合模式:
RAG作为Agent工具(RAG as Tool)
- • RAG系统作为Agent的一个工具
- • Agent根据需要调用RAG检索
- • 适用于需要知识检索的任务
Agent增强RAG(Agent-Enhanced RAG)
- • Agent优化RAG的检索策略
- • 动态调整检索参数
- • 多轮检索和重排序
混合架构(Hybrid Architecture)
- • Agent和RAG并行工作
- • Agent处理任务规划,RAG提供知识
- • 结果融合和整合
架构示例:
# 模式1:RAG作为工具
from langchain.agents import Tool
from langchain.vectorstores import FAISS
# 创建RAG工具
retriever = vectorstore.as\_retriever()
rag\_tool = Tool(
name="KnowledgeBase",
func=lambda q: retriever.get\_relevant\_documents(q),
description="从知识库检索相关信息"
)
# Agent使用RAG工具
agent = initialize\_agent(
tools=[rag\_tool, ...],
llm=llm
)
# 模式2:Agent增强RAG
classAgentEnhancedRAG:
def\_\_init\_\_(self, agent, rag\_system):
self.agent = agent
self.rag = rag\_system
defquery(self, question):
# Agent优化查询
optimized\_query = self.agent.optimize\_query(question)
# RAG检索
docs = self.rag.retrieve(optimized\_query)
# Agent处理结果
answer = self.agent.process\_results(docs, question)
return answer
选择建议:
- • 简单知识检索 → RAG作为工具
- • 复杂查询优化 → Agent增强RAG
- • 多任务场景 → 混合架构
02|如何设计一个 Agent+RAG 系统?需要考虑哪些因素?
参考答案:
设计考虑:
架构设计
- • Agent和RAG的交互方式
- • 数据流向和控制流
- • 组件职责划分
检索策略
- • 何时触发RAG检索
- • 检索参数如何确定
- • 多轮检索策略
结果融合
- • RAG结果如何传递给Agent
- • Agent如何利用检索结果
- • 结果优先级和排序
性能优化
- • 检索延迟优化
- • 缓存策略
- • 并发处理
设计示例:
classAgentRAGSystem:
def\_\_init\_\_(self, agent, rag\_system, cache=None):
self.agent = agent
self.rag = rag\_system
self.cache = cache or {}
defprocess\_query(self, query, context=None):
# 1. Agent分析是否需要检索
needs\_retrieval = self.agent.should\_retrieve(query)
if needs\_retrieval:
# 2. Agent优化查询
optimized\_query = self.agent.optimize\_query(query)
# 3. RAG检索
if optimized\_query inself.cache:
docs = self.cache[optimized\_query]
else:
docs = self.rag.retrieve(optimized\_query)
self.cache[optimized\_query] = docs
# 4. Agent处理结果
answer = self.agent.generate\_answer(
query=query,
context=context,
retrieved\_docs=docs
)
else:
# 5. 直接回答
answer = self.agent.generate\_answer(
query=query,
context=context
)
return answer
关键因素:
- • 检索触发条件
- • 查询优化策略
- • 结果融合方法
- • 性能平衡
03|Agent+RAG 系统中,Agent 如何决定何时调用 RAG?
参考答案:
决策策略:
基于意图识别
- • 分析用户意图
- • 判断是否需要知识检索
- • 使用分类模型或规则
基于关键词匹配
- • 检测特定关键词
- • 实体识别
- • 领域判断
基于置信度
- • Agent回答的置信度
- • 低置信度时触发检索
- • 动态调整阈值
基于历史经验
- • 学习历史交互
- • 相似场景触发检索
- • 优化触发策略
实现示例:
classRetrievalDecisionMaker:
def\_\_init\_\_(self, llm, threshold=0.7):
self.llm = llm
self.threshold = threshold
defshould\_retrieve(self, query, agent\_response=None):
# 方法1:意图识别
intent = self.classify\_intent(query)
if intent in ["knowledge\_query", "factual\_question"]:
returnTrue
# 方法2:关键词检测
keywords = ["是什么", "如何", "为什么", "解释"]
ifany(kw in query for kw in keywords):
returnTrue
# 方法3:置信度判断
if agent\_response:
confidence = self.calculate\_confidence(agent\_response)
if confidence < self.threshold:
returnTrue
returnFalse
defclassify\_intent(self, query):
prompt = f"判断查询意图:{query}\n选项:knowledge\_query, general\_chat, task\_execution"
response = self.llm.predict(prompt)
return response.strip()
最佳实践:
- • 多策略结合
- • 动态调整阈值
- • 记录决策历史
- • 持续优化
二、RAG作为工具篇(3题)
04|如何将 RAG 系统封装为 Agent 的工具?有哪些实现方式?
参考答案:
实现方式:
简单封装
- • 将RAG检索封装为函数
- • 注册为Agent工具
- • 直接返回检索结果
增强封装
- • 添加查询优化
- • 结果后处理
- • 错误处理
多模式封装
- • 支持多种检索模式
- • 参数可配置
- • 结果格式化
示例:
from langchain.tools import Tool
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# 方式1:简单封装
defsimple\_rag\_tool(query: str) -> str:
"""简单RAG工具"""
retriever = vectorstore.as\_retriever(search\_kwargs={"k": 3})
docs = retriever.get\_relevant\_documents(query)
return"\n".join([doc.page\_content for doc in docs])
rag\_tool = Tool(
name="KnowledgeSearch",
func=simple\_rag\_tool,
description="从知识库搜索相关信息"
)
# 方式2:增强封装
classEnhancedRAGTool:
def\_\_init\_\_(self, vectorstore, llm):
self.retriever = vectorstore.as\_retriever()
self.llm = llm
defsearch(self, query: str, top\_k: int = 5) -> str:
# 查询优化
optimized\_query = self.optimize\_query(query)
# 检索
docs = self.retriever.get\_relevant\_documents(
optimized\_query,
k=top\_k
)
# 结果处理
ifnot docs:
return"未找到相关信息"
# 格式化结果
formatted\_result = self.format\_results(docs, query)
return formatted\_result
defoptimize\_query(self, query):
# 使用LLM优化查询
prompt = f"优化以下查询以便检索:{query}"
returnself.llm.predict(prompt)
defformat\_results(self, docs, query):
# 格式化检索结果
context = "\n\n".join([
f"文档{i+1}:{doc.page\_content}"
for i, doc inenumerate(docs)
])
returnf"根据知识库,关于'{query}'的信息:\n\n{context}"
# 使用
enhanced\_tool = EnhancedRAGTool(vectorstore, llm)
rag\_tool = Tool(
name="EnhancedKnowledgeSearch",
func=enhanced\_tool.search,
description="从知识库智能搜索相关信息,支持查询优化和结果格式化"
)
最佳实践:
- • 清晰的工具描述
- • 合理的参数设计
- • 完善的错误处理
- • 结果格式化
05|Agent 如何利用 RAG 检索结果?有哪些处理策略?
参考答案:
处理策略:
直接使用
- • 将检索结果直接作为上下文
- • 简单拼接
- • 适用于简单场景
结果筛选
- • 根据相关性筛选
- • 去重和排序
- • 选择最相关的片段
结果融合
- • 多源结果融合
- • 冲突解决
- • 优先级排序
结果增强
- • 使用LLM总结
- • 提取关键信息
- • 结构化处理
示例:
classRAGResultProcessor:
def\_\_init\_\_(self, llm):
self.llm = llm
defprocess(self, query, retrieved\_docs, strategy="enhanced"):
if strategy == "direct":
returnself.direct\_use(retrieved\_docs)
elif strategy == "filtered":
returnself.filter\_results(query, retrieved\_docs)
elif strategy == "enhanced":
returnself.enhance\_results(query, retrieved\_docs)
defdirect\_use(self, docs):
"""直接使用"""
return"\n".join([doc.page\_content for doc in docs])
deffilter\_results(self, query, docs):
"""筛选结果"""
# 计算相关性
scored\_docs = []
for doc in docs:
score = self.calculate\_relevance(query, doc.page\_content)
scored\_docs.append((score, doc))
# 排序并选择top-k
scored\_docs.sort(reverse=True)
top\_docs = [doc for \_, doc in scored\_docs[:3]]
return"\n".join([doc.page\_content for doc in top\_docs])
defenhance\_results(self, query, docs):
"""增强结果"""
# 提取关键信息
context = "\n\n".join([doc.page\_content for doc in docs])
prompt = f"""
根据以下检索结果,回答查询:{query}
检索结果:
{context}
请提取关键信息并组织答案。
"""
answer = self.llm.predict(prompt)
return answer
最佳实践:
- • 根据场景选择策略
- • 处理结果冲突
- • 优化结果质量
- • 监控结果有效性
06|Agent+RAG 系统中如何处理检索失败的情况?
参考答案:
处理策略:
降级处理
- • 检索失败时使用Agent知识
- • 提示用户信息不足
- • 建议替代方案
重试机制
- • 调整检索参数重试
- • 使用不同检索策略
- • 扩大检索范围
多源检索
- • 使用多个检索源
- • 备用知识库
- • 外部API补充
用户交互
- • 询问用户澄清
- • 提供相关建议
- • 引导用户重新提问
示例:
classRobustAgentRAG:
def\_\_init\_\_(self, agent, rag\_system, fallback\_sources=None):
self.agent = agent
self.rag = rag\_system
self.fallback\_sources = fallback\_sources or []
defquery\_with\_fallback(self, query):
# 尝试RAG检索
try:
docs = self.rag.retrieve(query)
if docs andlen(docs) > 0:
returnself.agent.generate\_answer(query, docs)
except Exception as e:
print(f"RAG检索失败:{e}")
# 降级1:调整参数重试
try:
docs = self.rag.retrieve(query, k=10) # 扩大检索范围
if docs andlen(docs) > 0:
returnself.agent.generate\_answer(query, docs)
except:
pass
# 降级2:使用备用源
for source inself.fallback\_sources:
try:
docs = source.retrieve(query)
if docs:
returnself.agent.generate\_answer(query, docs)
except:
continue
# 降级3:使用Agent知识
response = self.agent.generate\_answer(query)
ifself.is\_low\_confidence(response):
returnf"{response}\n\n注意:知识库中未找到相关信息,以上回答基于模型训练数据。"
return response
defis\_low\_confidence(self, response):
# 检测低置信度回答
low\_confidence\_phrases = [
"我不确定",
"可能",
"也许",
"根据我的知识"
]
returnany(phrase in response for phrase in low\_confidence\_phrases)
最佳实践:
- • 多层降级策略
- • 清晰的错误提示
- • 记录失败原因
- • 持续优化
三、Agent增强RAG检索篇(3题)
07|Agent 如何优化 RAG 的检索查询?有哪些方法?
参考答案:
优化方法:
查询重写
- • 使用LLM重写查询
- • 扩展关键词
- • 添加同义词
查询分解
- • 将复杂查询分解为子查询
- • 分别检索后合并
- • 提高检索精度
查询扩展
- • 添加相关术语
- • 使用知识图谱
- • 实体链接
多查询策略
- • 生成多个查询变体
- • 并行检索
- • 结果融合
示例:
classQueryOptimizer:
def\_\_init\_\_(self, llm):
self.llm = llm
defoptimize(self, query, method="rewrite"):
if method == "rewrite":
returnself.rewrite\_query(query)
elif method == "decompose":
returnself.decompose\_query(query)
elif method == "expand":
returnself.expand\_query(query)
elif method == "multi\_variant":
returnself.generate\_variants(query)
defrewrite\_query(self, query):
"""查询重写"""
prompt = f"""
将以下查询重写为更适合检索的形式:
原查询:{query}
要求:
1. 保留核心意图
2. 使用更具体的术语
3. 添加相关关键词
"""
returnself.llm.predict(prompt)
defdecompose\_query(self, query):
"""查询分解"""
prompt = f"""
将以下复杂查询分解为多个子查询:
原查询:{query}
输出格式:每行一个子查询
"""
response = self.llm.predict(prompt)
sub\_queries = [q.strip() for q in response.split("\n") if q.strip()]
return sub\_queries
defexpand\_query(self, query):
"""查询扩展"""
prompt = f"""
扩展以下查询,添加相关术语和同义词:
原查询:{query}
输出:扩展后的查询
"""
returnself.llm.predict(prompt)
defgenerate\_variants(self, query):
"""生成查询变体"""
prompt = f"""
为以下查询生成3个不同的表达方式:
原查询:{query}
输出格式:每行一个变体
"""
response = self.llm.predict(prompt)
variants = [v.strip() for v in response.split("\n") if v.strip()]
return [query] + variants # 包含原查询
最佳实践:
- • 根据查询类型选择方法
- • 平衡精度和召回率
- • 监控优化效果
- • A/B测试不同策略
08|Agent 如何实现 RAG 的多轮检索和重排序?
参考答案:
实现策略:
迭代检索
- • 基于初始结果生成新查询
- • 多轮检索
- • 结果累积
重排序
- • 使用LLM重排序
- • 基于相关性评分
- • 考虑上下文
结果去重
- • 识别重复内容
- • 保留最相关版本
- • 合并相似结果
示例:
classMultiRoundRAG:
def\_\_init\_\_(self, retriever, llm, max\_rounds=3):
self.retriever = retriever
self.llm = llm
self.max\_rounds = max\_rounds
defretrieve(self, query, context=None):
all\_docs = []
current\_query = query
for round\_num inrange(self.max\_rounds):
# 检索
docs = self.retriever.get\_relevant\_documents(
current\_query,
k=5
)
all\_docs.extend(docs)
# 判断是否需要继续
ifself.should\_continue(docs, context):
# 生成下一轮查询
current\_query = self.generate\_next\_query(
query, docs, context
)
else:
break
# 去重和重排序
unique\_docs = self.deduplicate(all\_docs)
reranked\_docs = self.rerank(query, unique\_docs, context)
return reranked\_docs[:10] # 返回top-10
defshould\_continue(self, docs, context):
"""判断是否需要继续检索"""
iflen(docs) == 0:
returnTrue
# 检查结果质量
avg\_score = sum(doc.metadata.get("score", 0) for doc in docs) / len(docs)
return avg\_score < 0.7# 阈值可调
defgenerate\_next\_query(self, original\_query, docs, context):
"""生成下一轮查询"""
doc\_summaries = "\n".join([
doc.page\_content[:200] for doc in docs[:3]
])
prompt = f"""
基于以下信息,生成一个更精确的检索查询:
原始查询:{original\_query}
已检索到的信息:{doc\_summaries}
上下文:{context or"无"}
生成新的查询:
"""
returnself.llm.predict(prompt)
defdeduplicate(self, docs):
"""去重"""
seen = set()
unique\_docs = []
for doc in docs:
content\_hash = hash(doc.page\_content[:100])
if content\_hash notin seen:
seen.add(content\_hash)
unique\_docs.append(doc)
return unique\_docs
defrerank(self, query, docs, context):
"""重排序"""
# 使用LLM重排序
scored\_docs = []
for doc in docs:
score = self.calculate\_relevance\_score(query, doc, context)
scored\_docs.append((score, doc))
scored\_docs.sort(reverse=True)
return [doc for \_, doc in scored\_docs]
defcalculate\_relevance\_score(self, query, doc, context):
"""计算相关性分数"""
prompt = f"""
评估以下文档与查询的相关性(0-1分):
查询:{query}
文档:{doc.page\_content[:500]}
上下文:{context or"无"}
只输出分数:
"""
score\_str = self.llm.predict(prompt)
try:
returnfloat(score\_str.strip())
except:
return0.5# 默认分数
最佳实践:
- • 限制检索轮数
- • 设置终止条件
- • 优化重排序算法
- • 监控检索效果
09|Agent 如何利用上下文信息增强 RAG 检索?
参考答案:
增强方式:
上下文融合
- • 将对话历史融入查询
- • 提取关键信息
- • 构建增强查询
上下文过滤
- • 基于上下文过滤结果
- • 排除不相关内容
- • 提高相关性
上下文扩展
- • 使用上下文扩展查询
- • 添加相关实体
- • 补充背景信息
示例:
classContextAwareRAG:
def\_\_init\_\_(self, retriever, llm):
self.retriever = retriever
self.llm = llm
defretrieve\_with\_context(self, query, context):
# 方法1:上下文融合
enhanced\_query = self.fuse\_context(query, context)
docs = self.retriever.get\_relevant\_documents(enhanced\_query)
# 方法2:上下文过滤
filtered\_docs = self.filter\_by\_context(docs, context)
# 方法3:上下文扩展
expanded\_docs = self.expand\_with\_context(filtered\_docs, context)
return expanded\_docs
deffuse\_context(self, query, context):
"""融合上下文"""
ifnot context:
return query
prompt = f"""
基于以下上下文信息,优化检索查询:
原始查询:{query}
上下文:{context}
生成增强后的查询:
"""
returnself.llm.predict(prompt)
deffilter\_by\_context(self, docs, context):
"""基于上下文过滤"""
ifnot context:
return docs
filtered = []
for doc in docs:
# 检查文档与上下文的相关性
relevance = self.check\_context\_relevance(doc, context)
if relevance > 0.5: # 阈值
filtered.append(doc)
return filtered if filtered else docs # 如果全部过滤掉,返回原结果
defexpand\_with\_context(self, docs, context):
"""使用上下文扩展结果"""
ifnot context:
return docs
# 基于上下文补充相关信息
expanded\_docs = list(docs)
# 从上下文中提取实体
entities = self.extract\_entities(context)
# 为每个实体检索相关文档
for entity in entities:
entity\_docs = self.retriever.get\_relevant\_documents(
entity, k=2
)
expanded\_docs.extend(entity\_docs)
return expanded\_docs[:10] # 限制总数
defcheck\_context\_relevance(self, doc, context):
"""检查文档与上下文的相关性"""
prompt = f"""
评估文档与上下文的相关性(0-1):
文档:{doc.page\_content[:300]}
上下文:{context[:300]}
只输出分数:
"""
score\_str = self.llm.predict(prompt)
try:
returnfloat(score\_str.strip())
except:
return0.5
defextract\_entities(self, context):
"""从上下文中提取实体"""
prompt = f"""
从以下文本中提取关键实体(人名、地名、组织等):
{context}
每行一个实体:
"""
response = self.llm.predict(prompt)
return [e.strip() for e in response.split("\n") if e.strip()]
最佳实践:
- • 合理利用上下文
- • 避免上下文干扰
- • 动态调整策略
- • 监控效果
四、Agent+RAG性能优化篇(3题)
10|Agent+RAG 系统如何优化检索性能?有哪些策略?
参考答案:
优化策略:
缓存机制
- • 缓存常见查询结果
- • 缓存向量嵌入
- • 减少重复计算
异步处理
- • 异步检索
- • 并行处理多个查询
- • 提高吞吐量
索引优化
- • 优化向量索引
- • 使用高效检索算法
- • 索引分片
结果预取
- • 预测可能查询
- • 预加载相关文档
- • 减少延迟
示例:
import asyncio
from functools import lru\_cache
import hashlib
classOptimizedAgentRAG:
def\_\_init\_\_(self, retriever, cache\_size=1000):
self.retriever = retriever
self.cache = {}
self.cache\_size = cache\_size
@lru\_cache(maxsize=1000)
defcached\_retrieve(self, query\_hash, k):
"""缓存检索结果"""
returnself.retriever.get\_relevant\_documents(
self.get\_query\_from\_hash(query\_hash),
k=k
)
defretrieve(self, query, k=5, use\_cache=True):
"""检索(带缓存)"""
if use\_cache:
query\_hash = self.hash\_query(query)
cache\_key = (query\_hash, k)
if cache\_key inself.cache:
returnself.cache[cache\_key]
# 执行检索
docs = self.retriever.get\_relevant\_documents(query, k=k)
if use\_cache:
# 更新缓存
iflen(self.cache) >= self.cache\_size:
# 删除最旧的
oldest\_key = next(iter(self.cache))
delself.cache[oldest\_key]
self.cache[cache\_key] = docs
return docs
asyncdefasync\_retrieve(self, query, k=5):
"""异步检索"""
loop = asyncio.get\_event\_loop()
docs = await loop.run\_in\_executor(
None,
self.retriever.get\_relevant\_documents,
query,
k
)
return docs
asyncdefbatch\_retrieve(self, queries, k=5):
"""批量检索"""
tasks = [
self.async\_retrieve(query, k)
for query in queries
]
results = await asyncio.gather(*tasks)
return results
defhash\_query(self, query):
"""查询哈希"""
return hashlib.md5(query.encode()).hexdigest()
defget\_query\_from\_hash(self, query\_hash):
# 实际应用中需要维护哈希到查询的映射
pass
最佳实践:
- • 合理设置缓存大小
- • 监控缓存命中率
- • 异步处理提高并发
- • 持续优化
11|Agent+RAG 系统如何控制成本?有哪些优化方法?
参考答案:
成本控制:
减少API调用
- • 缓存LLM响应
- • 批量处理
- • 减少不必要的调用
优化检索策略
- • 减少检索次数
- • 限制检索文档数
- • 使用本地模型
Token优化
- • 压缩检索结果
- • 摘要长文档
- • 选择性包含上下文
模型选择
- • 简单任务用小模型
- • 复杂任务用大模型
- • 混合使用
示例:
classCostOptimizedAgentRAG:
def\_\_init\_\_(self, agent, rag, cost\_tracker):
self.agent = agent
self.rag = rag
self.cost\_tracker = cost\_tracker
defquery(self, query, budget=None):
"""带成本控制的查询"""
if budget:
remaining = budget
else:
remaining = float('inf')
# 1. 检查缓存(免费)
cached\_result = self.check\_cache(query)
if cached\_result:
return cached\_result
# 2. 判断是否需要检索
needs\_retrieval = self.should\_retrieve(query)
ifnot needs\_retrieval:
# 直接使用Agent(节省检索成本)
result = self.agent.generate(query)
self.cost\_tracker.record("agent\_only", self.estimate\_cost(result))
return result
# 3. 优化检索(减少文档数)
docs = self.rag.retrieve(query, k=3) # 限制为3个
# 4. 压缩结果(减少token)
compressed\_docs = self.compress\_docs(docs)
# 5. 生成回答
result = self.agent.generate(query, compressed\_docs)
# 6. 记录成本
cost = self.estimate\_cost(result, docs)
self.cost\_tracker.record("agent\_rag", cost)
return result
defcompress\_docs(self, docs):
"""压缩文档"""
compressed = []
for doc in docs:
# 只保留前500字符
compressed\_content = doc.page\_content[:500]
compressed.append({
"content": compressed\_content,
"source": doc.metadata.get("source", "unknown")
})
return compressed
defestimate\_cost(self, result, docs=None):
"""估算成本"""
# 简化的成本估算
result\_tokens = len(result.split()) * 1.3# 粗略估算
doc\_tokens = sum(len(d.page\_content.split()) for d in (docs or [])) * 1.3
# 假设每1000 tokens $0.002
cost = (result\_tokens + doc\_tokens) / 1000 * 0.002
return cost
最佳实践:
- • 设置成本预算
- • 监控成本使用
- • 优化高成本操作
- • 定期成本分析
12|Agent+RAG 系统如何实现流式输出?有哪些方案?
参考答案:
实现方案:
检索结果流式返回
- • 边检索边返回
- • 逐步展示结果
- • 提高用户体验
生成结果流式输出
- • LLM流式生成
- • 实时显示
- • 降低延迟感知
混合流式
- • 检索和生成并行
- • 结果逐步融合
- • 最优体验
示例:
import asyncio
from typing import AsyncGenerator
classStreamingAgentRAG:
def\_\_init\_\_(self, agent, rag):
self.agent = agent
self.rag = rag
asyncdefstream\_query(self, query) -> AsyncGenerator[str, None]:
"""流式查询"""
# 1. 流式检索
asyncfor doc\_chunk inself.stream\_retrieve(query):
yieldf"[检索到文档片段]\n{doc\_chunk}\n\n"
# 2. 获取完整结果
docs = awaitself.rag.retrieve\_async(query)
# 3. 流式生成
asyncfor token inself.agent.stream\_generate(query, docs):
yield token
asyncdefstream\_retrieve(self, query):
"""流式检索"""
# 模拟流式检索
docs = awaitself.rag.retrieve\_async(query)
for doc in docs:
# 分块返回
chunks = self.chunk\_document(doc.page\_content)
for chunk in chunks:
yield chunk
await asyncio.sleep(0.1) # 模拟延迟
defchunk\_document(self, content, chunk\_size=200):
"""文档分块"""
words = content.split()
chunks = []
for i inrange(0, len(words), chunk\_size):
chunk = " ".join(words[i:i+chunk\_size])
chunks.append(chunk)
return chunks
asyncdefstream\_generate(self, query, docs):
"""流式生成"""
# 使用支持流式的LLM
asyncfor token inself.agent.llm.astream(
self.build\_prompt(query, docs)
):
yield token
defbuild\_prompt(self, query, docs):
"""构建提示词"""
context = "\n\n".join([d.page\_content for d in docs])
returnf"""
基于以下信息回答问题:
{context}
问题:{query}
回答:
"""
# 使用示例
asyncdefmain():
agent\_rag = StreamingAgentRAG(agent, rag)
asyncfor chunk in agent\_rag.stream\_query("什么是RAG?"):
print(chunk, end="", flush=True)
# asyncio.run(main())
最佳实践:
- • 合理的流式粒度
- • 处理流式错误
- • 优化延迟
- • 用户体验优先
五、Agent+RAG应用实践篇(3题)
13|Agent+RAG 系统在实际应用中常见的挑战有哪些?如何解决?
参考答案:
常见挑战:
检索不准确
- • 问题 :检索到不相关文档
- • 解决 :优化查询、改进排序、增加过滤
信息冲突
- • 问题 :多个文档信息不一致
- • 解决 :冲突检测、优先级排序、用户确认
上下文过长
- • 问题 :检索结果太多,超出上下文限制
- • 解决 :结果压缩、摘要、选择性包含
延迟问题
- • 问题 :检索和生成延迟高
- • 解决 :缓存、异步、并行处理
成本控制
- • 问题 :API调用成本高
- • 解决 :缓存、批量处理、模型选择
解决方案框架:
classRobustAgentRAG:
def\_\_init\_\_(self, agent, rag):
self.agent = agent
self.rag = rag
self.conflict\_resolver = ConflictResolver()
self.context\_manager = ContextManager(max\_tokens=4000)
defprocess\_query(self, query):
# 1. 检索
docs = self.rag.retrieve(query)
# 2. 处理冲突
resolved\_docs = self.conflict\_resolver.resolve(docs)
# 3. 管理上下文
context = self.context\_manager.prepare\_context(
query, resolved\_docs
)
# 4. 生成回答
answer = self.agent.generate(query, context)
# 5. 验证答案
ifself.needs\_verification(answer, resolved\_docs):
answer = self.verify\_and\_correct(answer, resolved\_docs)
return answer
最佳实践:
- • 系统化解决问题
- • 持续监控和优化
- • 建立最佳实践库
- • 学习和改进
14|如何评估 Agent+RAG 系统的效果?有哪些指标?
参考答案:
评估指标:
检索质量
- • 检索准确率
- • 召回率
- • 相关性评分
生成质量
- • 答案准确性
- • 答案完整性
- • 答案相关性
系统性能
- • 响应时间
- • 吞吐量
- • 资源消耗
用户体验
- • 用户满意度
- • 任务完成率
- • 交互次数
评估方法:
classAgentRAGEvaluator:
def\_\_init\_\_(self):
self.metrics = {
"retrieval\_accuracy": [],
"answer\_accuracy": [],
"response\_time": [],
"user\_satisfaction": []
}
defevaluate\_retrieval(self, query, retrieved\_docs, ground\_truth):
"""评估检索质量"""
# 计算准确率
relevant\_docs = [
doc for doc in retrieved\_docs
ifself.is\_relevant(doc, ground\_truth)
]
accuracy = len(relevant\_docs) / len(retrieved\_docs) if retrieved\_docs else0
# 计算召回率
recall = len(relevant\_docs) / len(ground\_truth) if ground\_truth else0
return {
"accuracy": accuracy,
"recall": recall,
"f1": 2 * accuracy * recall / (accuracy + recall) if (accuracy + recall) > 0else0
}
defevaluate\_answer(self, answer, ground\_truth\_answer):
"""评估答案质量"""
# 使用LLM评估
prompt = f"""
评估以下答案的质量(0-1分):
答案:{answer}
标准答案:{ground\_truth\_answer}
考虑因素:
1. 准确性
2. 完整性
3. 相关性
只输出分数:
"""
# 实际实现中调用LLM
score = 0.8# 示例
return score
defis\_relevant(self, doc, ground\_truth):
"""判断文档是否相关"""
# 简化的相关性判断
returnany(
keyword in doc.page\_content.lower()
for keyword in ground\_truth.get("keywords", [])
)
最佳实践:
- • 建立评估基准
- • 定期评估
- • 多维度评估
- • 持续改进
15|Agent+RAG 系统的未来发展方向是什么?
参考答案:
发展方向:
更智能的检索
- • 多模态检索
- • 时序检索
- • 图结构检索
更好的融合
- • 深度集成Agent和RAG
- • 端到端优化
- • 统一训练
更强的推理
- • 多步推理
- • 因果推理
- • 逻辑推理
更广的应用
- • 多领域应用
- • 实时应用
- • 边缘部署
技术趋势:
- • 向量数据库优化
- • 检索算法改进
- • 模型能力提升
- • 系统架构演进
应用前景:
- • 智能助手
- • 知识问答
- • 文档分析
- • 决策支持
总结
本文精选了15道关于Agent与RAG结合的高频面试题,涵盖了:
Agent+RAG架构设计 :结合模式、系统设计、检索触发
RAG作为工具 :工具封装、结果处理、失败处理
Agent增强RAG检索 :查询优化、多轮检索、上下文增强
性能优化 :检索性能、成本控制、流式输出
应用实践 :常见挑战、效果评估、未来方向
核心要点:
- • Agent和RAG可以多种方式结合
- • RAG可以作为Agent的工具
- • Agent可以优化RAG的检索策略
- • 性能优化和成本控制很重要
- • 实际应用需要系统化解决方案
面试建议:
- • 理解Agent和RAG的结合方式
- • 掌握检索优化方法
- • 了解性能优化策略
- • 具备实际项目经验
- • 关注技术发展趋势
希望这些题目能帮助您更好地准备大模型应用岗位的面试!
