构造问答系统

一、通过 API 调用大模型

1.1 基础调用

  • 使用 OpenAI Python SDK,base_url 指向百炼兼容接口:https://dashscope.aliyuncs.com/compatible-mode/v1
  • 消息三角色:system(系统指令)、user(用户输入)、assistant(模型回复)
  • 模型选择:qwen-max / qwen-plus / qwen-turbo 等

1.2 多轮对话

  • 关键:维护 conversation_history 列表,每次调用需传入完整历史
  • 大模型 API 是无状态的,不会自动记住上一轮对话
  • 对话历史占上下文窗口空间,过长需截断或摘要处理
  • 生产环境需将对话历史持久化存储(如数据库),支持跨会话连续对话

1.3 流式输出

  • 参数:stream=True
  • 效果:逐 token 增量返回,用户无需等待完整回复
  • 本质:仅改变展示方式,不影响模型推理过程和最终答案质量
  • ⚠️ 流式输出如使用负载均衡,可能需要禁用缓存和数据压缩

二、大模型工作原理(五阶段)

阶段 名称 核心过程
1 文本分词 (Tokenization) 文本 → Token ID 序列;Token ≠ 词,是子词/字符片段
2 Token 向量化 (Embedding) Token ID → Embedding 矩阵查表 → 语义向量 + 位置编码
3 大模型推理 (Forward Pass) 向量逐层穿过 Transformer 解码器 → 最后 token 的隐藏状态 → 线性投影 → Logits
4 解码与自回归 Logits → Softmax 概率分布 → 选 token → 追加到输入 → 重复推理
5 输出文本 Token ID 序列 → 可读字符串;流式 = 逐 token 解码增量发送
  • 自回归生成:每次生成一个 token,追加到输入,循环直至遇到 EOS / 达到最大长度 / 遇到停用词
  • 不同模型 EOS 不同:Qwen3 = <|im_end|>,LLaMA/Mistral = </s>,DeepSeek V3.2 = <|end▁of▁sentence|>,GPT-OSS = <|return|>

解码策略两大分类

分类 策略 特点
近似确定性解码 Greedy Decoding(贪心) 每次选概率最高的 token
Beam Search(束搜索) 保留多个候选路径,选最优
随机采样解码 Top-p (Nucleus Sampling) 按累计概率采样
Top-k Sampling 从前 k 个 token 中随机选

三、随机性参数

参数 范围 默认值 作用 调参建议
temperature [0, 2) 0.7 控制概率分布尖锐程度;低→确定性强,高→多样性高 代码生成→0.1;创意文案→0.9
top_p (0, 1] 0.8 按累计概率筛选候选 Token 集合;低→窄选稳定,高→广选多样 明确答案→0.3;创意任务→0.9
top_k ≥1 从概率前 k 的 token 中随机选择;k=1 等价贪心
seed 整数 相同 seed + 相同参数 → 最大可能返回相同结果,但无法完全一致
  • ⚠️ 不建议同时调整 temperature 和 top_p,优先调整其中一个
  • ⚠️ 即使 temperature=0、top_p 极小、seed 相同,仍可能因分布式系统/优化引入微小随机性
  • 确定性场景(结构化提取):temperature=0.1, top_p=0.3
  • 创意场景(广告文案):temperature=0.7~0.9, top_p=0.9

拓展:enable_search 参数

  • 千问支持 enable_search 参数,让大模型在生成回答时利用互联网搜索结果丰富回复内容

四、上下文工程 (Context Engineering)

为什么需要?

  • 大模型知识来自训练数据,不包含私域知识
  • 直接在提示词中喂入知识 → 上下文窗口有限 + 效率低 + 成本高 + 信息干扰
  • 核心定义:在正确的时间,将最相关、最精准的知识,动态加载到大模型有限的上下文窗口中

四大核心技术

技术 作用 课程对应
RAG 从外部知识库检索信息,为模型提供精准依据 C2.2-C2.5
Prompt 精确引导模型思考和输出格式 C2.3
Tool 赋予模型调用外部工具能力 C3.1
Memory 跨对话理解历史上下文 C3.4

五、RAG(检索增强生成)

5.1 两阶段流程

阶段 步骤 说明
建立索引 文档解析 → 文本分段 → 文本向量化 → 存储索引 一次性完成,持久化到向量数据库
检索生成 问题向量化 → 相似度检索 → 提示词模板 → 大模型生成 每次查询时执行
  • 检索是最重要的环节:如果检索不到正确的信息,后面的生成一定出错

5.2 文本向量化原理(扩展)

  • Embedding 模型通过对比学习训练:相关文本对向量相似度高,不相关的低
  • 检索时:问题向量与库中所有片段向量进行余弦相似度比较 → 返回最相似的 N 个

5.3 RAG 多轮对话

  • 挑战:检索只基于当前问题,代词指代丢失上下文(如"他的主管是谁?"不知"他"是谁)
  • 解决方案:问题改写
    • 用大模型根据对话历史改写当前问题
    • 例:「他的主管是谁?」→「张三的主管是谁?」
    • 实现:LlamaIndex 的 CondenseQuestionChatEngine

5.4 LlamaIndex 核心用法

# 加载文档 → 创建索引 → 保存/加载 → 查询
documents = SimpleDirectoryReader('./docs').load_data()
index = VectorStoreIndex.from_documents(documents, embed_model=DashScopeEmbedding(...))
index.storage_context.persist("path")  # 保存
index = load_index_from_storage(StorageContext.from_defaults(persist_dir="path"), embed_model=...)  # 加载
query_engine = index.as_query_engine(streaming=True, llm=OpenAILike(...), similarity_top_k=5)
response = query_engine.query('问题')

六、提示词工程

6.1 提示词框架六要素

要素 含义 示例
任务目标 (Object) 明确要求完成什么 "审查文档中的错别字"
上下文 (Context) 任务的背景信息 公司制度文件、操作流程
角色 (Role) 大模型扮演的身份/语气 算法工程师 / 小学老师
受众 (Audience) 针对的特定受众 零基础新员工 / 资深开发者
样例 (Sample) 供大模型参考的案例 输入-输出对
输出格式 (Output Format) 输出的格式/类型/枚举范围 JSON / Markdown / 枚举值
  • 其他分析方法:SWOT分析法、5W2H分析法等也可辅助构建提示词
  • 阿里云百炼提供提示词自动优化工具

6.2 六大提示词技巧

技巧 核心要点 适用场景
清晰表达 + 分隔符 用【】、###、XML标签分隔关键要素;避免与已有符号冲突 所有场景
限定角色和受众 角色决定语气风格,受众决定内容深度 回答风格差异化
规定输出格式 指定 JSON/Markdown/枚举,便于下游解析 结构化输出
少样本示例 (Few-shot) 提供输入-输出样例让模型"模仿"风格和结构 风格/结构一致性
思维链 (CoT) 加"请一步步推导",让模型输出中间推理步骤 复杂数学/逻辑推理
Meta Prompting 让大模型扮演"提示词教练"优化提示词;进阶:引入参考答案做差距分析 提示词迭代优化
  • 超越 CoT:思维树(ToT)、思维图(GoT)等方法进一步扩展推理能力
  • 发展趋势:大模型从 CoT 提示方法向多智能体(Agent)方向发展

6.3 Meta Prompting 的多角色协作架构

  • Critic(评估者):将生成答案与参考答案对比,输出差距分析报告
  • Optimizer(优化者):根据差距分析报告重写提示词
  • Grader(评分员):按量化标准(如友好度、清晰度、准确性 1-5 分)评分,输出结构化 JSON
  • 迭代流程:生成 → Critic 对比 → Optimizer 重写 → Grader 评分 → 循环直到差距足够小

6.4 AI裁判

  • 用大模型依据预设量化标准判断"通过/不通过"
  • 训练流程类似机器学习:
    1. 准备标注样本(好答案与坏答案)
    2. 7:3 拆分训练集/评估集
    3. 迭代优化(Meta Prompting 改进裁判提示词)
    4. 监控两个准确率:训练集准确率 + 评估集准确率
    5. 过拟合检测:训练准确率持续提升但评估准确率停滞或下降 → 停止优化
    6. 样本质量问题:标注样本含糊或矛盾 → 先修复样本,再优化裁判
    7. 选择标准:采用评估集上表现最好的版本,而非训练集
  • 用于自动化提示词优化流程的停止条件

6.5 推理模型 vs 通用模型

维度 推理模型 通用模型
设计目标 逻辑推理、多步求解 通用对话、文本生成
训练数据侧重 数学题解、代码逻辑、科学推理 百科、文学、对话等多领域
输出特征 含完整推导步骤 简洁直接
响应速度 较慢 较快
适用场景 模糊任务、大海捞针、代码调试/改进 明确通用任务、速度/成本敏感

推理模型提示词技巧

  1. 保持简洁清晰 + 足够背景信息
  2. 避免添加"一步一步推理"(模型自带深度思考)
  3. 可补充角色/受众/输出格式
  4. 适合做 Meta Prompting 的"教练"
  5. 根据模型响应迭代调整:推理模型回含思考过程,天然适合分析推理逻辑;不断对话补充信息完善提示词;描述太抽象时可增加示例明确
  6. 混合分工策略:推理模型做"规划师"/"分析师"(提示词优化、复杂规划、代码调试),通用模型做执行者(信息提取、格式转换、简单问答),最佳性价比

6.6 提示词工程化最佳实践

  • 提示词应做成可配置的,方便领域专家参与设计
  • 阿里云百炼提供可视化大模型应用构建能力(页面编写提示词、流程可视化搭建)

七、自动化评测

7.1 为什么需要评测?

  • 大模型输出有随机性 → 每次调整需量化验证
  • 从"感觉变好了" → "指标提升了 X%"
  • 评测先行的三大原因
    1. 避免盲目优化:没有基线,不知道优化是否真的有效
    2. 量化改进效果:从"感觉变好了"变成"指标提升了X%"
    3. 防止跷跷板效应:一处优化可能导致另一处退步,评测发现整体是否提升

7.2 "Lost in the Middle" 与"知识浓度"

  • Lost in the Middle:关键信息被埋藏在海量无关信息中,大模型"视而不见"
  • 知识浓度:上下文中相关信息密度高、噪音少、与问题直接关联
  • RAG精度瓶颈往往不在大模型"聪明"与否,而在于上下文的"知识浓度"

7.3 评测维度与框架

RAG 评测四大维度

  1. 召回质量(Retrieval Quality)
  2. 答案忠实度(Faithfulness)
  3. 答案相关性(Answer Relevance)
  4. 上下文利用率/效率(Context Utilization)

主流评测框架对比

框架 核心特点 主要指标 适用场景
Ragas 专为 RAG 设计 Answer Correctness / Context Recall / Context Precision / Faithfulness / Answer Relevancy RAG 全链路评估(推荐)
TruLens 可观测性与过程追踪 Groundedness / Answer Relevance / Context Relevance 需要调试中间过程
DeepEval TDD 理念 + CI/CD 集成 Faithfulness / Context Recall / Answer Relevance 自动化测试流水线
自定义评测 领域专家深度参与 流程可操作性 / 政策合规性 / 情绪安抚度 / 问题解决完备度 业务特定指标
  • LlamaIndex / LangChain 等主流 RAG 框架也内置评估工具

7.4 Ragas 指标分类

评测阶段 指标 衡量什么
整体回答质量 Answer Correctness 生成答案与标准答案的准确度
生成环节 Faithfulness 答案是否完全基于 contexts,无幻觉
Answer Relevancy 答案是否直接回应问题
召回环节 Context Precision contexts 中相关片段的排序质量和信噪比
Context Recall ground_truth 观点在 contexts 中的覆盖率

7.5 Ragas 三大核心指标详解

指标 衡量什么 需要的数据 计算方式
Answer Correctness 生成答案与标准答案的准确度 question + answer + ground_truth 0.25 × 语义相似度 + 0.75 × 事实F1
Context Recall ground_truth 观点在 contexts 中的覆盖率 question + contexts + ground_truth 被支持的观点数 ÷ 总观点数
Context Precision contexts 中相关片段的排序质量和信噪比 question + contexts + ground_truth 相关 context 的 precision 均值
  • 事实 F1 计算:大模型将 answer 和 ground_truth 分解为观点列表 → 计算 TP/FP/FN → F1 = TP / (TP + 0.5×(FP+FN))
  • Faithfulness(忠实度):评估答案与检索参考资料的事实一致性(是否"胡编乱造"/幻觉)
  • Answer Relevancy(答案相关性):评估生成的答案是否与问题相关
  • 低分诊断
指标偏低 可能原因 优化方向
Context Recall 低 知识库不全 / embedding 模型弱 / query 表达差 补充知识库 / 升级 embedding 模型 / Query 改写
Context Precision 低 检索噪声多 / 排序不佳 引入 Rerank / 优化 chunk 切分策略
Answer Correctness 低(但 Recall/Precision 高) 生成阶段出错 优化 prompt / 调整 temperature / 更换更强 LLM / 微调
Faithfulness 低 模型产生幻觉 强化 prompt 中"仅基于上下文回答"指令 / 使用更忠实的生成模型

7.6 Ragas 提示词模板可定制

  • Ragas 默认提示词模板是英文的,可自定义中文模板以更符合中文问答场景
  • Ragas 提示词中包含示例,也可更改示例适配业务场景

7.7 更多评价指标

指标 任务类型 说明
ToolCallAccuracy Agent 评估 LLM 识别和调用工具的表现
DataCompyScore NL2SQL 评估 SQL 检索结果的差异性
LLMSQLEquivalence NL2SQL 评估 SQL 语句的语义等价性(无需真正执行)
BleuScore 微调/通用 基于 n-gram 评估相似度,无需大模型

7.8 评测运营体系

  • 问题来源:真实用户场景(工单、反馈、高频问题)
  • 标准答案:领域专家编写(技术人员无法判断业务正确性)
  • 指标层级对齐:
层级 示例 说明
业务指标 用户满意度 > 90% 最终目标
核心技术指标 召回准确率 > 85% 可工程化衡量
算法指标 Context Precision > 0.8 自动化评测
  • 评测先行动作:明确定义目标 → 构建评测集 → 建立自动化评测 → 针对性优化 → 评测验证 → 持续迭代
  • 持续运营三举措:
    1. 让业务专家参与AI评测(如电商主管评测促销规则、物流专员评测运费时效)
    2. 从最终用户视角出发,评判答案的正确性、简洁性与可操作性
    3. 建立闭环机制:发现问题 → 改进优化 → 跟踪效果 → 迭代指标

八、RAG 优化

8.1 文档准备阶段

  • 意图空间 vs 知识空间
    • 重叠区 → 优化内容质量 + 工程/算法
    • 未覆盖意图 → 补充知识库
    • 未利用知识 → 优化召回 + 剔除无关内容
  • 建立持续收集用户意图的机制,领域专家参与评测

8.2 文档解析与切片

问题 策略
不支持的文档格式 开发解析器 / 转换格式 / DashScopeParse
表格/图片等特殊内容 改进解析器 / 视觉模型辅助
主题接近的内容混淆 扩写标题 + 元数据打标
切片过长(噪声多) 减小 chunk_size
切片过短(信息截断) 增大 chunk_size

五种切片方法

方法 特点 适用场景
Token切片 按固定 Token 数截断 上下文长度受限
句子切片(默认) 保持句子完整性 通用场景
句子窗口切片 检索小切片,返回时扩展前后文 需要保持上下文连贯
语义切片 按语义相关性自适应切分 逻辑性强的文档
Markdown切片 按标题层级智能分割 Markdown 文档
  • 句子窗口切片解决的核心矛盾:小 chunk 精准定位 vs 大 chunk 上下文完整
  • 没有最好的方法,只有最适合场景的方法
  • 借助百炼 DashScopeParse 将 PDF/Word 解析为 Markdown,可用大模型润色修正

8.3 向量化与存储

Embedding 模型选择

  • 新版通常更好(text-embedding-v3 > v2)
  • 可通过相似度对比和 Ragas 评测验证效果

向量数据库选择

方案 优点 缺点 适用
内存存储 快速上手 不持久化、受内存限制 开发测试
本地数据库(Milvus/Qdrant) 功能完整 需自行运维 中小规模
云服务(DashVector/Milvus版) 免运维/自动扩容/混合检索 按量付费 生产环境

8.4 检索召回优化

检索前策略

策略 说明 示例
问题改写 大模型扩写问题,补充上下文 "张伟" → "公司所有叫张伟的员工及其部门"
问题扩写 增加更多信息,让检索更全面 "张伟是哪个部门的" → +联系方式、职责
用户画像扩展 结合用户信息个性化 不同岗位问"工作注意事项"→不同回答
提取标签 标签过滤 + 向量检索组合 提取"人名:张伟"→先标签过滤再向量检索
反问用户 不明确时主动追问 "请问你想了解哪个岗位的工作职责?"
多步检索规划 复杂问题拆解为多步检索 StepDecomposeQueryTransform + MultiStepQueryEngine
HyDE 大模型生成假想答案文档→用假想文档向量检索真实文档 即使假想内容不准,结构和风格相似也有助检索

检索后策略

策略 说明
Rerank(重排序) 先大数量召回(如 top_k=20),再用排序模型精选(如 top_n=3)
滑动窗口检索 检索到切片后补充前后相邻切片,保持语义连贯

8.5 生成阶段优化

优化方向 具体措施
选择模型 简单查询→qwen-turbo;复杂推理→qwen-plus/max;长文档→qwen-long;法律→farui-plus
优化提示词 ①明确要求不编造答案 ②内容分隔标记 ③按问题类型调整模板
调整参数 固定输出→降 temperature/top_p + 设 seed;减少重复→提高 presence_penalty;控长度→调 max_tokens
混合架构 蒸馏模型做预处理 → RAG 做知识查询 → 大模型做最终回答

8.6 进阶架构

模块化 RAG

  • 结合不同问题路由到不同的 RAG 应用,构建能力更强大的模块化 RAG 系统

GraphRAG

  • 结合检索增强生成(RAG)和查询聚焦摘要(QFS)的优点
  • RAG 擅长精确细节信息,QFS 善于理解和总结整体内容
  • GraphRAG 既能准确回答具体问题,又能处理需要深入理解的复杂查询
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容