当前位置: 首页 > news >正文

AI和运维的故事


AIOps 与大模型知识指南

AIOps 的实现离不开现在大模型的大力发展,所以要做 AIOps 相关的业务,就需要了解并使用大模型相关知识。本次内容将从以下6个章节介绍大模型相关的知识:

  • Prompt Engineering
  • Chat Completions、Memory、JSON Mode
  • Function Calling
  • Fine-tuning
  • 检索增强生成(RAG、Graph RAG)
  • 本地部署常见的开源模型

Prompt Engineering

Prompt简介

Prompt Engineering 是指通过设计、优化输入给 AI 模型的“提示词”(Prompt),来引导模型生成更准确、有用或创意性输出的技术。它是一门结合语言理解、任务建模与人机交互的艺术与科学。

尽管现在的大模型具备强大的自然语言理解和生成能力,但它的行为高度依赖输入的提示词(Prompt),所以 Prompt 决定着大模型的输出质量。

当用户输入 Prompt,大模型接受到的其实是一个个 Token,这是为什么呢?在大模型中,Token 是模型处理文本的基本单位,人类是通过文本来理解内容,而大模型是通过 Token 来理解内容。它可以是一个单词、标点符号、数字,甚至是一个子词(subword)。不同模型对 Token 的划分方式略有不同,但总体上可以理解为:把一段文字切分成一小块一小块的“单元”就是 Token 。

比如,当用户输入 "Hello, world!",会被拆分为以下几个 Token(以 GPT 模型为例):“Hello”、“,”、" world"、“!”,所以一共是 4 个 token。当大模型接收 Token 后,会根据这些 Token 进行推理生成新的 Token,最后再把这些 Token 转换成人类可读的文本输出。

Tips:
每个模型都有最大上下文长度限制(比如 GPT-3.5 是 4096 tokens,GPT-4 可达 32768 tokens),包括你的 Prompt + 输出内容都不能超过这个限制。另外,目前商用大模型的Token免费额度都有限,如果设计的Prompt不合理,就会产生额外的费用,我们可以看看Prompt中的哪些内容对Token的数量有实质的影响。

类型影响程度说明
文字长度⬆️ 高内容越长,Token 越多
标点符号⬆️ 中逗号、句号、引号等都会单独算作Token
专业术语/生僻词⬆️ 中某些模型可能将其拆成多个Token
语言种类⬆️ 中英语通常比中文Token更少
编程语言⬆️ 高特殊符号多,Token数量上升快

所以,我们在设计Prompt的时候要记住 并非输入的越多,回答的就越好 。要记住设计 Prompt 的几个核心原则:

  1. 具体描述,避免模糊:不说 “不要遗漏重点”,而是明确 “请突出 XX、XX 两个关键信息”;
  2. 排序重要事项:如果有多个需求,按优先级说明,比如 “首先分析日志错误,其次统计出现频率,最后给出解决方案”;
  3. 使用标准格式:比如用 Markdown 的标题、列表等结构,让模型输出更规整,例如 “请用 ### 问题原因、### 解决步骤的格式整理结果”;
  4. 拆解任务,给出思路:复杂问题分步骤引导,比如 “先分析错误类型,再匹配历史案例,最后生成修复建议”。

Prompt的开发模式:Zero-shot 和 Few-shot

日常工作中,常用的Prompt编写模式是 Zero-shot 和 Few-shot。

  • Zero-shot 模式是纯自然的描述任务,不提供具体的例子,比如仅说明识别用户意图可能涉及查询日志、指标或运维操作。
  • Few-shot 模式在自然语言任务描述之外,提供参考例子,如给出三个示例,以增强大模型的推理准确性。

由于 Few-shot 模式会给大模型提供例子,这能使大模型回答的更加精准, 所以在日常使用中,我们优先采用 Few-shot 模式。但是,对于处理逻辑性比较强的任务时,单纯 Few-shot 不太够用,这时候就要引入 思维链(Chain of Thought)。


Chain of Thought

思维链是一种技巧,旨在让大模型在给出答案前进行逐步思考,并在每一步提供解释,以增强答案的解释性和提高推理的准确性。

一个典型的 CoT Prompt 包括以下几个部分:

  • 问题描述
  • 明确要求分步思考
  • 示例演示(可选)
  • 最终要求输出答案

示例Prompt:

问题:小明有 5 个苹果,吃了 2 个,又买了 3 个。他现在有多少个苹果?

请一步步思考这个问题,并写出你的推理过程,最后给出答案。

大模型可能的回答是:

  1. 小明最开始有 5 个苹果。
  2. 他吃了 2 个,剩下 5 - 2 = 3 个。
  3. 他又买了 3 个,所以现在有 3 + 3 = 6 个苹果。
    答:小明现在有 6 个苹果。

在运维场景中,可以把专家知识库中的内容加入到系统提示语中,让大模型扮演运维专家的角色,优先以提供的知识库而非自身训练的内容回答问题,这种基于特定知识库进行问题解答可以提升回答的准确性和专业性。


Prompt 分片

Prompt 分片是指将原始 Prompt 切分为多个小块(chunks),然后分别处理这些小块内容,并最终整合输出结果的一种策略。

场景:

  • 输入文本太长,超过模型最大 Token 数限制。
  • 需要对文档、文章、日志等内容进行摘要、分析、问答操作。
  • 提高模型对长文本的理解和处理能力。

流程:

  • 拆分:将长文本按一定规则拆分成多个chunk。
  • 处理:对每个chunk进行单独运行Prompt,生成中间结果。
  • 整合:将所有中间结果合并,生成最终的输出。

分片方式:

分片方法描述适用场景
固定长度分片每个 chunk 固定长度文本较长且结构不敏感的任务
基于语义分片按句子、段落、章节等需保留逻辑结构的任务(论文、合同等)
滑动窗口分片前后chunk有重叠防丢失关键信息可能跨chunk出现的场景
向量化分片用向量匹配最相关chunkRAG、智能检索、问答系统
  • 注意事项:
    • 信息丢失风险。
    • Token 成本增加。
    • 一致性问题。

Chat Completions、Memory、JSON Mode

Chat Completions

Chat Completions(聊天补全) 是现代大语言模型(如 OpenAI 的 GPT-3.5、GPT-4、通义千问、Claude 等)提供的一种 API 接口,专门用于处理多轮对话任务。

  • 输入:消息列表,包含角色、内容等
  • 输出:模型的回复
// 输入示例
{"model": "gpt-3.5-turbo","messages": [{"role": "system", "content": "你是一个翻译助手,擅长中英文互译。"},{"role": "user", "content": "请将以下中文翻译成英文:'人工智能是未来的关键技术之一。'"},{"role": "assistant", "content": "'Artificial intelligence is one of the key technologies of the future.'"},{"role": "user", "content": "谢谢!"}],"temperature": 0.7
}
// 输出示例
{"choices": [{"message": {"role": "assistant","content": "不客气!如果你还有需要翻译的内容,请随时告诉我。"}}]
}

有三大角色:

  • system:系统指令,设定 AI 行为、身份或任务规则。
  • user:用户输入,代表用户说的话或提问。
  • assistant:模型输出,即 AI 的回答。
实现例子(Python代码,使用OpenAI API)
from openai import OpenAIclient = OpenAI(api_key="sk-xxxx", base_url="https://api.siliconflow.cn/v1")completion = client.chat.completions.create(model="deepseek-ai/DeepSeek-R1-0528-Qwen3-8B",messages=[{"role": "system", "content": "你是一个运维专家,你可以帮忙解决专业的技术运维问题"},{"role": "user", "content": "如何在Ubuntu上安装Python3,请用一句话总结"}]
)print(completion.choices[0].message.content)
  • 若要让模型“记忆”历史内容,就要把所有历史消息都带上每次请求的 messages 参数。

LangChain Memory

在处理大模型记忆的时候,直接管理上下文较为复杂,因为大模型由于Token的限制无法记住所有的对话,这里就可以引入 LangChain 这种长期记忆的管理方法。

类型描述是否持久化
ConversationBufferMemory缓冲记忆,顺序存储全部消息
ConversationBufferWindowMemory保留最近N条对话
ConversationTokenBufferMemoryToken长度限制的历史
ConversationSummaryMemory自动摘要历史对话
ConversationKGMemory提取实体和关系做知识图谱
RedisChatMessageHistory到 Redis/DB 持久存储
典型使用方式
  • ConversationBufferMemory …(省略具体代码)
  • 推荐用 LangGraph 高级实现,对多用户/会话支持更好

JSON Mode

要求模型稳定输出 JSON 格式,方便程序自动扩展。

示例:

from openai import OpenAIclient = OpenAI(base_url="https://api.siliconflow.cn/v1", api_key="sk-xxxx")response = client.chat.completions.create(model="deepseek-ai/DeepSeek-R1-0528-Qwen3-8B",response_format={"type": "json_object"},messages=[{"role": "system", "content": '你现在是一个 JSON 对象提取专家,请参考我的JSON定义输出JSON对象,示例:{"service_name":"","action":""},其中action可以是 get_log,restart,delete'},{"role": "user", "content": "帮我重启pay服务"}]
)
print(response.choices[0].message.content)

输出:{"service_name":"pay","action":"restart"}


Function Calling

Function Calling(函数调用) 是大型语言模型(LLM)的一项能力,允许模型根据用户的自然语言输入,识别并调用预定义的工具或 API 函数 ,从而执行特定任务。

  • 与外部系统交互
  • 执行计算或数据查询
  • 生成结构化的输出供后续处理

示例(OpenAI Function Calling)
(Python代码略,详见原文)

  • 模型识别工具,生成调用参数
  • 开发者解析参数并调用实际函数
  • 把结果作为对话历史继续投喂模型,实现多轮自动响应

Fine-tuning

Fine-tuning(微调) 是在预训练语言模型的基础上,结合特定领域或任务,用自有数据再训一轮,从而获得更优的表现。适合在对结果风格、专业领域表现、规则遵守有更高要求时使用。

流程:

  1. 准备原始数据(如日志内容及其优先级标注)
  2. 转成JSONL 格式
  3. 上传数据到模型平台,发起微调任务
  4. 用微调后模型进行推理

检索增强生成(RAG、Graph RAG)

RAG(Retrieval-Augmented Generation)

  • 结合信息检索与生成,模型回复时可以动态查阅外部知识库,提高准确性。

步骤

  1. 索引:文档加载→拆分→向量化→存储
  2. 检索与生成:实时检索相关分片,作为上下文交互 LLM

Graph RAG

  • 把文档拆解成实体和关系形成知识图谱,结合图数据库做推理。
  • 可以回答涉及关系与结构的问题。

本地部署常见的开源模型

为保障数据安全、降低使用成本,本地部署大模型成为越来越多企业的选择。

  • Ollama
  • LM Studio
  • FastChat
  • Open WebUI

过程简要

  1. 安装工具
  2. 拉取需要的模型
  3. (可选)自定义 System Prompt
  4. 用 API/WebUI 调用本地推理

总结

本文围绕 AIOps 智能运维 与 大语言模型(LLM) 的结合展开,介绍了 Prompt Engineering、Function Calling、RAG、Graph RAG、本地模型部署等关键技术的应用方式,并通过实际示例展示了如何将这些技术用于日志分析、故障定位、智能问答和自动化运维场景。

我们看到,Prompt 是引导模型输出的核心工具,而Function Calling 和 Memory 机制 则让模型具备了“执行能力”和“记忆能力”。RAG 和 Graph RAG 的引入,使得系统能够在不微调模型的前提下,灵活接入企业知识库,提升回答的准确性与逻辑性。此外,为保障数据安全、降低使用成本,本地部署开源模型 成为越来越多企业的选择。Ollama、FastChat、Text Generation WebUI 等工具,使得本地推理变得简单高效。


http://www.xdnf.cn/news/1119745.html

相关文章:

  • Faiss库
  • 017 进程控制 —— 终止进程
  • C语言-流程控制
  • 深入浅出Kafka Consumer源码解析:设计哲学与实现艺术
  • gitlab-ci.yml
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • 代码随想录算法训练营第四十九天|单调栈part2
  • PHP password_verify() 函数
  • vue vxe-tree 树组件加载大量节点数据,虚拟滚动的用法
  • 【AutoCAD全网最新版】AutoCAD 2026 保姆级下载安装注册使用详细图文教程
  • 借助DeepSeek编写输出漂亮表格的chdb客户端
  • [源力觉醒 创作者计划]_文心大模型4.5开源部署指南:从技术架构到实战落地
  • sfe_py的应力云图计算与显示step by step
  • 【LeetCode240.搜索二维矩阵Ⅱ】以及变式
  • iOS高级开发工程师面试——RunLoop
  • C++类模版与友元
  • 大数据领域开山鼻祖组件Hadoop核心架构设计
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GithubProfies(GitHub 个人资料)
  • 编译器 VS 解释器
  • 电脑升级Experience
  • Linux操作系统之信号:信号的产生
  • 【C++进阶】---- 多态
  • 鹧鸪云:别墅光储项目方案设计的最终选择
  • 【Linux系统】进程切换 | 进程调度——O(1)调度队列
  • Linux:3_基础开发⼯具
  • 【Linux】基本指令详解(一) 树状文件结构、家目录、绝对/相对路径、linux文件类型
  • 使用systemctl命令控制软件的启动和关闭
  • 打破空间边界!Nas-Cab用模块化设计重构个人存储逻辑
  • 各种开发语言主要语法对比
  • Codeforces Round 1019 (Div. 2) A-D