LLM 大模型核心技术笔记:架构、提示工程与推理框架详解
构建 AI 化需要的知识体系
Semantic Kernel
Semantic Kernel 是 Microsoft 推出的一个开源框架,旨在帮助开发者构建和部署 AI 应用,特别是那些需要理解和生成自然语言的应用。它提供了一种结构化的方式来定义和管理技能(Skills),这些技能可以是简单的函数调用,也可以是复杂的 AI 模型交互。
核心组件
- Kernel: Semantic Kernel 的核心,负责技能的管理和执行,充当连接不同组件的枢纽。
- Skills: 定义了应用可以执行的一系列操作,可以是本地函数,也可以是远程服务调用,支持 C#、Python 等多种语言。
- Prompt Templates: 用于生成和修改自然语言的模板,支持变量注入和函数调用,允许动态调整提示词。
- Memory: 提供了存储和检索应用状态的能力,可以是简单的键值对,也可以是复杂的图数据库或向量存储,用于实现上下文记忆。
LangChain
LangChain 是一个开源框架,专注于构建应用,这些应用可以利用大型语言模型(LLMs)来执行各种任务,如回答问题、生成文本、执行代码等。它提供了一种灵活的方式来组合和调用不同的 LLMs,以及管理与这些模型的交互。
核心组件
- Chains: 定义了模型调用的逻辑流程,可以是简单的单步调用,也可以是复杂的多步流程,支持链式调用和条件分支。
- Prompts: 用于指导模型生成特定类型输出的模板,支持多种格式和变量替换机制。
- Memory: 提供了存储和检索应用状态的能力,可以用于上下文理解和历史记录,支持多种内存策略如缓冲、摘要等。
- Agents: 可以自动执行任务的实体,基于给定的目标和约束,能够自主决定调用哪些工具或 API。
总结
Semantic Kernel 和 LangChain 都是为了简化 AI 应用的开发,但它们的侧重点不同。Semantic Kernel 更注重技能的定义和管理,强调与企业现有系统的集成;而 LangChain 则更侧重于大型语言模型的组合和调用,生态更为丰富。选择哪个框架取决于具体的应用场景和需求。在我们的场景里我们更多的是考虑使用 Semantic Kernel 的方式来构建,不是说 LangChain 不好,只是 LangChain 的代码侧抽象的东西太厉害,本身架构也比较重,对于后期开发的运维和迭代成本比较高,我们现在的体量还太小,感觉自身玩不太动。
大模型的应用架构
典型的业务架构
在业务层面,AI 应用通常分为感知层、决策层和执行层。感知层负责理解用户输入和外部环境数据;决策层利用 LLM 进行逻辑推理和规划;执行层负责调用外部工具完成具体任务。
技术架构
纯 Prompt
就像和一个人对话,你说一句,ta 回一句,你再说一句,ta 再回一句。这种方式最简单,但缺乏持久性和工具调用能力,适用于简单的问答场景。
Agent + FC (Function calling)
- Agent: AI 主动提要求,根据当前状态决定下一步行动。
- Function Calling: AI 要求执行某个函数,将自然语言指令转化为结构化参数调用后端 API。
- 场景举例: 你问过年去哪玩,ta 先反问你有几天假,然后查询天气 API 推荐目的地。
RAG (Baseline) = Embeddings + 向量数据库
- Embeddings: 把文字转换为更易于相似度计算的编码。这种编码叫向量,能够捕捉语义信息。
- 向量数据库: 把向量存起来,方便查找,支持高维数据的快速索引。
- 向量搜索: 根据输入向量,找到最相似的向量,返回相关文档片段。
- 场景举例: 考试时,看到一道题,到书上找相关内容,再结合题目组成答案。然后,就都忘了。
- 优化: 目前我们还使用了 rerank model 对 RAG 的结果进行重排序,使得得到更精准的答案,减少噪声干扰。
Fine-Tuning
努力学习考试内容,长期记住,活学活用。通过微调让模型适应特定领域的术语和风格。
- 现状: 目前传统的 FT 对于在运维体系中,特别是抽象对象的训练达不到一个很好的效果。
- 尝试: 所以我们也在尝试基于 DeepKe 的抽象方式做运维体系中的数据,文本做 FT,看是不是能把抽象的对象直接关系能理解清楚。这涉及到如何将非结构化日志转化为结构化知识图谱的过程。
Prompt 的工程:提升 LLM 理解与响应能力
Prompt 设计原则
为什么要说 Prompt,其实有了架构,但如何让 LLM 理解你的推理依据,那就需要 Prompt 提示工程来解决。不同的 LLM 的 chat_template 的模版也是完全不同的,也就会导致不同的模型你用同一种 Prompt 的方式无法得到一样的答案,甚至于同一个模型多次重复同一个问题也会存在差异的现象。
从我的个人实践来说,总结主要有以下几条原则:
- Write clear instructions: 写出清晰的指令,避免歧义。
- Provide reference text: 提供参考文本,作为模型回答的依据。
- Split complex tasks into simpler subtasks: 将复杂的任务拆分为更简单的子任务,降低模型认知负荷。
- Give the model time to 'think': 给模型时间'思考',例如使用 Chain-of-Thought。
- Use external tools: 使用外部工具,弥补模型知识盲区。
- Test changes systematically: 系统地测试变更,记录不同 Prompt 的效果对比。
具体实现的方式
1. 把话说详细
尽量多的提供任何重要的详细信息和上下文,说白了,就是把话说明白一点,不要一个太笼统。比如:不要说:'总结会议记录',而是说:'用一个段落总结会议记录。然后写下演讲者的 Markdown 列表以及他们的每个要点。最后,列出发言人建议的后续步骤或行动项目(如果有)。'
2. 让模型充当某个角色
你可以把大模型想象成一个演员,你要告诉他让他演什么角色,他就会更专业更明确,一个道理。比如:充当一个喜欢讲笑话的喜剧演员,每当我请求帮助写一些东西时,你会回复一份文档,其中每个段落至少包含一个笑话或有趣的评论。
3. 使用分隔符清楚地指示输入的不同部分
三引号、XML 标签、节标题等分隔符可以帮助划分要区别对待的文本节。可以帮助大模型更好的理解文本内容。我最喜欢用 """ 把内容框起来。比如:用 50 个字符总结由三引号分隔的文本。"""在此插入文字"""
4. 指定完成任务所需的步骤
有些任务能拆就拆,最好指定为一系列步骤。明确地写出这些步骤可以使模型更容易去实现它们。比如:使用以下分步说明来响应用户输入。步骤 1 - 用户将为您提供三引号中的文本。用一个句子总结这段文字,并加上前缀'Summary:'。步骤 2 - 将步骤 1 中的摘要翻译成西班牙语,并添加前缀'翻译:'。
5. 提供例子
也就是经典的少样本提示,few-shot prompt,先扔给大模型例子,让大模型按你的例子来输出。比如:按这句话的风格来写 XX 文章:"""落霞与孤鹜齐飞,秋水共长天一色。渔舟唱晚,响穷彭蠡之滨"""
6. 指定所输出长度
可以要求模型生成给定目标长度的输出。目标输出长度可以根据单词、句子、段落、要点等的计数来指定。中文效果不明显,同时你给定的长度只是个大概,多少个字这种肯定会不精准,但是像多少段这种效果就比较好。比如:用两个段落、100 个字符概括由三引号分隔的文本。"""在此插入文字"""
提示框架应用
是不是遵循着一套方式就可以一路梭了呢,显然不是,对于不同的任务背景其实还需要使用不同的提示词框架来做具体任务的实现。由于涉及到具体内容太过冗长,我这里也就直接给出有哪些框架和实现的框架逻辑。
- TAG 框架: 任务(Task)、行动(Action)、目标(Goal)。适合简单明确的指令。
- SPAR 框架: 情境(Scenario)、问题(Problem)、行动(Action)、结果(Result)。适合问题解决类任务。
- TRACE 框架: 任务(Task)、请求(Request)、行动(Action)、背景(Context)、示例(Example)。适合需要上下文的复杂任务。
- SCOPE 框架: 情境(Scenario)、复杂情况(Complications)、目标(Objective)、计划(Plan)、评估(Evaluation)。适合项目管理类任务。
- APE 框架: 行动(Action)、目的(Purpose)、期望(Expectation)。适合工作流自动化。
- SAGE 框架: 情况(Situation)、行动(Action)、目标(Goal)、预期(Expectation)。适合通用对话。
- RTF 框架: 角色(Role)、任务(Task)、格式(Format)。适合内容生成。
- ROSES 模型: 角色(Role)、目标(Objective)、情境(Scenario)、解决方案(Solution)、步骤(Steps)。适合咨询类任务。
- CARE 框架: 背景(Context)、行动(Action)、结果(Result)、示例(Example)。适合反馈类任务。
以上不同的提示框架对于具体实际的应用场景中需要灵活的去实现,天下没有一招鲜的武功,要用好大模型提升助力,底层的逻辑实现与框架的了解是必不可少的,否则 LLM 只是一个聊天工具,并不能为你的工作带来质的提升。
让 LLM 理解逻辑推理:从 CoT 到 ReAct
上面几个 KeyPoint 解释了在 LLM 中实现应用的主要的技术或者方式,但真正要让 LLM 作为一个 AGENT 或者 Copilot 存在,还需要有一个关键的点,那就是如何让 LLM 知道你的推理方式。其实 LLM 解决只是技术差距的问题,但它无法解决提出问题的源头,所以其实在 LLM 的今天,对于大家来说有想法且逻辑清楚的人,有了 LLM 的加持可能真的会一飞冲天,如果你能提出好的问题,那么就能得到一个好的答案。
那么推理架构有具体哪些呢,我在这里只说一些相对用的比较多的,特别是在运维运营场景中比较容易落地的方式。
CoT(chain-of-thought prompting)思维链
提示通过中间推理步骤实现了复杂的推理能力。您可以将其与少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务。对于解决数据等具体落地问题,可以显著提高大模型的推理方面的能力。
区别于传统的 Prompt 从输入直接到输出的映射 <input——>output> 的方式,CoT 完成了从输入到思维链再到输出的映射,即 <input——>reasoning chain——>output>。
示例: 如果问题是'纽约到洛杉矶的距离是多少?',模型可能首先检索纽约和洛杉矶的坐标,然后计算两点之间的距离,最后给出答案。在这个过程中,模型不仅提供了答案,还展示了其推理过程,增强了答案的可信度。
Auto-CoT 自动思维链
即利用 LLMs'让我们一步一步地思考'提示来生成一个接一个的推理链。这种自动过程仍然可能在生成的链中出现错误。为了减轻错误的影响,演示的多样性很重要。这项工作提出了 Auto-CoT,它对具有多样性的问题进行采样,并生成推理链来构建演示。
Auto-CoT 主要由两个阶段组成:
- 阶段 1:问题聚类: 将给定问题划分为几个聚类。
- 阶段 2:演示抽样: 从每组数组中选择一个具有代表性的问题,并使用带有简单启发式的 Zero-Shot-CoT 生成其推理链。
示例: 如果问题是'如果一个苹果的重量是 150 克,那么 10 个苹果的总重量是多少?',Auto-COT 模型可能会生成这样的思维链:'10 个苹果的总重量 = 10 * 150 克 = 1500 克'。这样,用户不仅得到了答案,还了解了模型是如何得出这个答案的。
在运维的告警源头判断做辅助,或者故障处理建议等方面可以产生不错的效果,也降低新人工技能培训的投入,更容易让运维人员统一视角与标准。
TOT(Tree of Thought)思维树
这里我可能需要特别说一下思维树这个框架,'TOT 思维树'并不是一个广泛认可或标准的术语,因此其具体定义可能在不同的上下文或领域中有所变化。但我们可以基于'思维树'的概念来理解它可能的含义。
思维树(Tree of Thoughts)是一种用于表示和组织思考过程的结构化方法,它以树状图的形式展示思考的层次和分支。在决策制定、问题解决、创意生成等场景中,思维树可以帮助人们系统地探索各种可能性,评估不同选项,从而做出更明智的决策。
在思维树中:
- 根节点: 通常代表问题或决策的起点,即需要解决的核心问题。
- 分支: 从根节点开始,每个分支代表一个可能的思考方向或解决方案。分支可以进一步细分,形成更详细的子分支,代表更具体的思考步骤或子问题。
- 叶节点: 树的末端,代表思考过程的最终结果或结论。
通过构建思维树,人们可以:
- 系统地探索: 确保所有可能的思考方向都被考虑,避免遗漏重要的信息或解决方案。
- 评估和比较: 通过比较不同分支的结果,评估各种选项的优劣,做出更合理的决策。
- 增强理解: 通过可视化思考过程,增强对问题的理解,使复杂的决策过程变得清晰。
目前针对 TOT 我们还没有得到特别好的效果,可能是在构建当中还有不合理的定义或者解析问题不精准的存在。但从对于资源的合理性投入,供应链的管理,提高决策质量和效率它应该是有天然的优势存在,如果有哪位大佬对 TOT 有深度尝试并有合理化建议的,请给出更多的好的建议,在此先谢过了。
ReAct(Retrieval-Augmented Generation for Thinking and Acting)
其实对于这个框架,我个人总结来看,可以理解为是一种结合了推理和行动的新型人工智能框架,主要用于增强 AI 系统在复杂环境中的决策能力和执行效率。ReAct 框架的核心思想是通过实时检索相关信息和执行基于这些信息的行动,来辅助 AI 系统进行更准确的推理和决策。
在 ReAct 框架中,AI 系统不仅依赖于其预训练的知识,还会在遇到新情况时,主动检索外部信息(如数据库、网络资源等),并将这些信息整合到其决策过程中。这一过程可以看作是 AI 系统在'思考'(Reasoning)和'行动'(Acting)之间的循环,其中:
- 思考(Reasoning): AI 系统基于当前状态和目标,进行推理和规划,确定下一步需要采取的行动或需要检索的信息。
- 行动(Acting): 根据推理结果,AI 系统执行相应的行动,如检索信息、执行任务等。
- 反馈: AI 系统根据行动的结果,更新其状态和知识,然后再次进入思考阶段,形成一个闭环。
ReAct 框架的优势在于,它使 AI 系统能够适应不断变化的环境,处理之前未见过的情况,而不仅仅是依赖于预训练数据。通过实时检索和整合新信息,AI 系统可以做出更准确、更灵活的决策,提高其在复杂任务中的表现。
总结来说:ReAct 是 Reason + Action,而 CoT、ToT 则只是 Reason。ReAct 与 CoT 和 ToT 的本质区别,就是 ReAct 不止在推理,还在利用外部工具实现目标。
运维场景应用
随着大模型技术的成熟,运维领域正在经历智能化转型。以下是几个关键应用场景:
- 告警分析与故障处理: 利用 CoT 与 Auto-CoT 辅助故障诊断,提供决策支持。当告警触发时,模型可分析历史日志,推断根因,并给出修复建议。
- 资源管理与优化: TOT 框架帮助系统化分析资源分配,提升运维效率。通过模拟不同调度策略,预测资源瓶颈。
- 动态决策与执行: ReAct 框架在复杂运维场景中,实现基于实时信息的决策与行动。例如自动扩缩容、流量切换等。
- 知识库问答: 基于 RAG 技术,构建企业级运维知识库,新员工可通过自然语言快速查询操作手册和故障案例。
挑战与未来展望
尽管 LLM 在运维领域展现出巨大潜力,但仍面临诸多挑战:
- 幻觉问题: 模型可能生成看似合理但事实错误的信息,需要引入验证机制和人类反馈。
- 数据安全: 运维数据往往敏感,需确保私有化部署和数据脱敏处理。
- 延迟与成本: 实时推理对延迟敏感,需优化模型大小和推理引擎。
- 可解释性: 黑盒模型难以满足审计要求,需增强推理过程的可追溯性。
通过深度探索与实践,我们正逐步构建基于 LLM 的运维体系,旨在提升运维效率与可观测性。未来,我们将继续探索更多创新场景,推动 AI 技术在运维领域的广泛应用,期待与更多同行携手,共同开创运维智能化的新篇章。
本文旨在分享 AI 在运维领域的实践与思考,通过 Semantic Kernel、LangChain、RAG、Fine-Tuning 等技术,结合 Prompt 工程与推理架构,探索如何有效提升运维效率与可观测性。希望这些经验能为技术探索者和实践者提供参考,共同推动 AI 在运维领域的创新与发展。