必看!AI 大模型面试精选之 Agent+RAG相关要点(四)

大模型向量数据库机器学习
AI大模型Agent面试精选题(四)

本文是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的结合方式
  • • 掌握检索优化方法
  • • 了解性能优化策略
  • • 具备实际项目经验
  • • 关注技术发展趋势

希望这些题目能帮助您更好地准备大模型应用岗位的面试!

picture.image

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
大模型产品方案白皮书——PromptPilot
AI 正以空前速度重塑行业,大模型成为继移动互联网后的新科技浪潮。如何将其与业务深度融合,实现落地,仍是数字化转型的核心挑战。有效 Prompt 是驱动模型达成业务目标的关键,但业务诉求常模糊、缺乏标准答案,模型理解差异大。企业需让模型准确理解需求、稳定输出高质量结果,并在数据积累中持续优化性能与价值。 PromptPilot 应运而生,通过对话与任务用例自动生成高质量 Prompt 与评估标准,运行中持续识别并优化问题,释放大模型潜力,让非技术人员也能轻松驾驭大模型,推动落地与创新。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论