南京鼎华 AI应用工程
1. 自我介绍
2. 什么是 RAG?它和普通大模型问答有什么区别?
答案:RAG 是 Retrieval-Augmented Generation,也就是检索增强生成。它不是让大模型完全依赖参数记忆回答问题,而是在生成答案前,先从外部知识库里检索相关资料,再把检索结果作为上下文交给大模型生成答案。
普通大模型问答依赖模型训练时学到的知识,容易出现知识过期、幻觉、无法引用来源等问题。RAG 的优势是可以接入企业私有知识、实时文档和业务数据库,并且答案可以追溯到原始证据。它更适合企业内部知识问答、客服、运维、法规、医疗、金融等知识更新频繁且要求可追溯的场景。
def rag_pipeline(query):
query_vec = embed(query)
docs = vector_search(query_vec, top_k=20)
docs = rerank(query, docs, top_k=5)
prompt = build_prompt(query, docs)
answer = call_llm(prompt)
return {
"answer": answer,
"references": [doc["id"] for doc in docs]
}
3. 为什么不用传统文件检索?RAG 解决了什么问题?
答案:传统文件检索主要依赖关键词匹配,适合查精确词、编号、标题和字段,但对语义表达变化不敏感。比如用户问“设备启动后一直跳闸”,文档里写的是“上电后保护动作频繁触发”,关键词检索可能召回不到,而向量检索可以根据语义相似度找到相关内容。
RAG 解决的是“语义召回 + 上下文生成 + 可追溯回答”的问题。它不仅能找到相关资料,还能把多个文档片段整合成自然语言答案。对于企业知识库来说,用户不一定知道文档标题和专业术语,RAG 能降低检索门槛。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
docs = [
"上电后保护动作频繁触发,建议检查绝缘阻抗和接地状态",
"设备正常启动流程说明",
"通信模块离线时检查网关配置"
]
query = ["设备启动后一直跳闸"]
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(docs + query)
scores = cosine_similarity(matrix[-1], matrix[:-1])
print(scores)
4. 询问 RAG 相比大模型直接问答的优缺点
答案:RAG 的优点是知识可更新、能接企业私有数据、答案可引用、成本相对可控,也能减少模型幻觉。大模型不需要重新训练,只要更新知识库,就能让系统回答新内容。
缺点是链路更复杂,效果受检索质量影响很大。如果文档切分不好、embedding 模型不合适、召回结果噪声大,大模型即使能力很强也会生成错误答案。RAG 还有上下文窗口限制,检索出来的内容不能无限塞给模型,所以需要 rerank、压缩和证据筛选。
大模型直答:链路短,但知识不可控、不可追溯、容易过期 RAG:链路长,但知识可更新、可追溯、适合企业私有数据 核心瓶颈:召回质量、chunk 设计、rerank、答案校验
5. RAG 的文档切分怎么做?chunk 太大或太小会有什么问题?
答案:文档切分不能只按固定长度粗暴切。结构化文档要优先按标题、章节、段落、表格和语义边界切。比如运维手册可以按“故障现象-可能原因-排查步骤-处理建议”切;FAQ 可以一问一答切;法规和制度类文档适合按条款切。
chunk 太大会带入很多噪声,导致模型引用无关内容;chunk 太小会丢失上下文,比如只召回到“检查接地线”,但不知道是哪种故障场景。工程上通常会使用 chunk overlap,并保留文档标题、章节路径、设备型号、版本号等 metadata。
def split_text(text, max_len=500, overlap=80):
chunks = []
start = 0
while start < len(text):
end = min(start + max_len, len(text))
chunks.append(text[start:end])
if end == len(text):
break
start = end - overlap
return chunks
6. RAG 中向量检索、BM25、rerank 分别解决什么问题?
答案:向量检索解决语义相似问题,适合用户表达和文档表达不完全一致的场景。BM25 解决关键词精确匹配问题,适合型号、故障码、设备编号、法规条款等强字面匹配内容。rerank 负责在初召回结果里重新排序,判断候选文档是否真的能回答当前 query。
一个成熟的 RAG 系统一般不会只用向量检索。比如用户问“PCS-320 报 E42 怎么处理”,其中 PCS-320 和 E42 是强关键词,BM25 很重要;但“怎么处理”又需要语义理解,所以最好做混合检索。
from collections import defaultdict
def rrf_fusion(result_lists, k=60):
scores = defaultdict(float)
docs = {}
for results in result_lists:
for rank, doc in enumerate(results, start=1):
doc_id = doc["id"]
scores[doc_id] += 1 / (k + rank)
docs[doc_id] = doc
return [
docs[doc_id]
for doc_id, _ in sorted(scores.items(), key=lambda x: x[1], reverse=True)
]
7. 大模型为什么会有幻觉?RAG 能彻底解决幻觉吗?
答案:大模型幻觉的原因是它本质上是在做概率生成,不是数据库查询。模型会根据上下文和训练中学到的模式生成最可能的文本,当问题超出知识范围、上下文不足、提示词诱导错误或者检索内容本身有噪声时,就可能生成看起来合理但事实错误的内容。
RAG 可以降低幻觉,但不能彻底消除。因为检索可能召回错内容,文档可能过期,模型也可能错误理解证据。要进一步降低幻觉,需要做证据约束、引用校验、答案置信度、无法回答机制和后处理验证。对于高风险场景,不能让模型在证据不足时强行回答。
def verify_answer(answer, retrieved_docs):
claims = extract_claims(answer)
unsupported = []
for claim in claims:
if not has_evidence(claim, retrieve
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

