
构建基于Claude MCP的天气查询智能体 | 实战落地示例
随着大规模语言模型(LLM)在各行各业的广泛应用,提示词设计(Prompt Engineering)与检索增强生成(Retrieval-Augmented Generation,RAG)已成为初级工程师面试中的必考模块。
面试中常见的问题包括:
本文将从Prompt 基础原理、RAG 架构与实现、常见考题解析、实战代码示例、面试演练五大维度,系统呈现“初级工程师 Prompt 面试题库”,帮助你从容应对相关高频考题。
在 LLM 应用中,Prompt 就是对模型的“指令”——它定义了输入格式、上下文示例和输出要求:
清晰的角色设定
你是一位经验丰富的法律专家,请根据以下事实撰写法律意见书。
明确“角色”可让 LLM 在对应语域和专业深度上更贴合预期。
格式化输出要求
输出格式(JSON):
{
"summary": "...",
"key_points": ["...", "..."]
}
强制模型按指定结构返回,便于后续解析与系统集成。
Few-shot 示例
示例1:
Q: 计算 2+2。
A: 4
示例2:
Q: 计算 7*8。
A: 56
现在,请回答:
Q: 计算 9-3。
A:
提供示例帮助模型掌握问答格式与逻辑模式。
Chain-of-Thought(CoT)
请先列出解题思路,再输出最终答案。
要求模型“思考”步骤,以提升复杂问题的准确性。
边界与错误处理
如果问题无法回答,请返回 “无法回答” 而非编造内容。
明确禁止生成“幻觉”或“胡编乱造”,提高输出可靠性。
回答要点可包含使用自定义令牌、字段校验、Hash 验证等。
**RAG(Retrieval-Augmented Generation)**结合了 检索 和 生成 两大模块:
Embedding & 检索
Prompt 拼接
生成回答
┌────────────┐ ┌───────────┐ ┌──────────────┐
│ 用户查询 Q │──▶── │ Embedding │──▶── │ 向量索引库 V │
└────────────┘ └───────────┘ └──────────────┘
│ ▲
│ │
▼ │
┌───────────┐ Top‑k ┌─────────────────┐
│ Prompt 拼接│◀─────────────│ 最相关文档切片 D │
└───────────┘ └─────────────────┘
│
▼
┌───────────┐
│ LLM 生成 │
└───────────┘
│
▼
用户响应 Answer
System: 你是一名知识库助理,请基于以下文档回答用户的问题。
文档:
1. {{doc1}}
2. {{doc2}}
...
问题:{{query}}
回答时,请引用文档编号并给出简明答案。
“什么是 Dense Retriever 与 Sparse Retriever?它们有何优缺点?”
“如何衡量 RAG 系统质量?”
“如何降低 RAG 系统的成本与延迟?”
“如何防止 RAG 中的上下文拼接注入攻击?”
方法 | 知识更新成本 | 通用性 | 生成质量 | 系统成本 |
---|---|---|---|---|
Prompt | 低(无需重新训练) | 高 | 中 | 低 |
RAG | 中(重建向量库) | 高 | 高(外部知识支持) | 中(索引成本 + 推理成本) |
Fine-tuning | 高(训练耗时) | 低(模型绑定) | 最高 | 高(训练 + 部署) |
以下以 Python + OpenAI Embeddings + FAISS 为例,展示 RAG 查询 Pipeline 核心代码。
import faiss
import numpy as np
from openai import OpenAI
from sentence_transformers import SentenceTransformer
# 初始化模型与索引
embedder = SentenceTransformer('all-MiniLM-L6-v2')
d = 384 # 嵌入维度
index = faiss.IndexFlatL2(d)
# 文档预处理:切分与嵌入
documents = load_documents() # list of text chunks
vectors = embedder.encode(documents)
index.add(np.array(vectors))
# 查询与检索
def rag_query(query: str, top_k: int = 5) - > str:
q_vec = embedder.encode([query])
D, I = index.search(np.array(q_vec), top_k)
retrieved = [documents[i] for i in I[0]]
prompt = "根据以下文档回答问题:\n" + "\n\n".join(retrieved)
prompt += f"\n\n问题:{query}\n回答:"
# 调用 OpenAI LLM
client = OpenAI()
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role":"system","content":prompt}],
temperature=0.2
)
return resp.choices[0].message.content
# 示例
print(rag_query("什么是 RAG 系统?"))
问题 | 答题要点 |
---|---|
Prompt 如何提升 LLM 生成质量? | 提示词示例(Few-shot)、CoT、角色设定、输出格式限制、边界控制 |
RAG 系统架构包含哪些模块? | 文档预处理、向量索引、检索、Prompt拼接、LLM生成 |
如何切分长文档并平衡召回与精确? | Chunk大小200–500字、重叠20–30%、结合 BM25 粗排 + ANN 精排 |
如何防止 prompt injection 攻击? | 对用户输入与文档切片做严格转义、使用白名单、对系统 Prompt 限制 |
RAG 中 Dense vs Sparse Retriever 如何选择? | 语义匹配 vs 精确匹配、索引成本 vs 更新成本、场景决定 |
如何衡量 RAG 系统质量与可用性? | Recall\@k、Precision\@k、Latency、Factuality、端到端分词 & token 计费 |
Prompt vs RAG vs Fine-tuning 的优缺点? | 见对比表;场景驱动选型 |
在初级岗位中如何落地 RAG 项目? | 简易 Prototype → 向量库部署 → 基本监控与采集 → 并发与延迟优化 |
> 问:如何设计一个用于法律文书摘要的 RAG+Prompt 系统?
>
> 答:
> “首先,对法律文书进行分段切片,chunk 大小控制在 300–400 字,重叠 25%,避免关键信息被拆散。使用 Sentence-BERT 为文档和查询生成向量,构建 FAISS HNSW 索引,并部署在单节点或云服务。查询阶段,从索引检索 Top‑k 相关切片,再用以下 Prompt 模板拼接:
>
> text > System: 你是一名法律专家,请根据以下内容撰写摘要: > 文档:… > 问题:请给出这份法律文书的关键要点。 >
>
> LLM 生成后,对输出做简单正则校验 JSON 格式,再展示给前端。整个系统简单易扩展,且可通过 Prometheus 监控检索延迟和模型响应时间,结合 Grafana 可视化。”
Pitfall | 描述 | 优化建议 |
---|---|---|
Prompt 太长 | 导致 Token 超限或无关信息干扰 | 精简示例、控制文档切片长度 |
Chunk 重叠不合理 | 过大冗余、过小丢失上下文 | 经验值 20–30% 重叠 |
向量索引更新延迟 | 新增文档后检索结果不及时 | 定时增量更新索引或使用在线索引服务 |
Prompt Injection | 用户输入植入恶意指令 | 严格转义、白名单字段、隔离系统 Prompt |
模型生成“幻觉” | 输出与事实不符 | 加入“如果无法回答,请返回‘无答案’”的边界控制 |
高并发下延迟飙升 | 检索/生成成为瓶颈 | 缓存常见查询结果、批量检索、并发优化 |
本文系统涵盖了 初级工程师 Prompt 面试题库 中的两大核心模块:
下一步提升建议:
掌握上述内容,你将在 LLM 初级工程师面试中自信应对提示词与 RAG 场景高频考题,早日拿到心仪的高薪 Offer。祝面试顺利!