南京鼎华 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-320E42 是强关键词,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面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论

相关推荐

做梦也会成功的:真是Token比人贵
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务