Category Archives: 大模型

《AI Agent 开发与应用:基于大模型的智能体构建》

在人工智能飞速发展的今天,智能体(Agent)无疑是技术前沿的重要组成部分。从个人生活助手到企业智能客服,智能体的应用已经逐步渗透到我们日常工作的方方面面。这本《AI Agent开发与应用:基于大模型的智能体构建》无疑为开发者、技术爱好者和学术研究者提供了一个系统的框架,不仅帮助我们理解智能体的内涵,更提供了从基础到高级的开发技巧与实用案例,是一本不可多得的理论与实践相结合的优秀书籍。

智能体的深远意义

首先,我们不妨从智能体的定义谈起。智能体(Agent)是一种能够自主进行感知、决策和执行任务的系统。无论是在个人层面的虚拟助手,还是在企业层面的自动化服务,智能体都已经成为智能化转型的重要推动力。在个人生活中,AI Agent扮演着无处不在的角色,如语音助手Siri、Alexa,它们能够理解语音命令,执行任务,甚至提供个性化推荐。而在企业层面,智能体同样是企业提升工作效率、降低运营成本的重要工具。例如,企业级智能客服可以通过自动化的方式解答客户咨询,节省了大量人力资源,提高了服务效率。

随着大模型(LLM)的兴起,智能体的能力得到了前所未有的增强。大语言模型赋予了智能体强大的自然语言理解与生成能力,使其能够更精准、更灵活地与用户进行多轮对话,并有效地处理复杂的任务。与此同时,智能体与API、数据库的深度集成,使其可以访问并处理海量的数据,快速响应用户需求。

《AI Agent开发与应用:基于大模型的智能体构建》概览

《AI Agent开发与应用:基于大模型的智能体构建》以深入浅出的方式,从智能体的基础理论出发,逐步引导读者进入智能体开发的世界。全书共分为三个部分,涵盖了智能体的基础原理、开发工具与技术框架、应用案例以及高阶开发技巧,内容丰富而详尽。

第1部分:初见智能体

在第一部分的前几章中,作者首先清晰地定义了智能体的概念,探讨了智能体的核心组件与架构,以及智能体如何与大语言模型(LLM)结合。这一部分的重点在于帮助读者全面理解智能体的工作原理,并掌握智能体的开发流程。通过对智能体类型的介绍,我们得以窥见智能体在各个行业中的广泛应用,尤其是大语言模型赋能智能体的强大能力,带来了更高效的任务自动化和更智能的决策支持。

第2部分:智能体基础应用开发

第二部分的内容主要通过实际的应用案例,帮助读者理解智能体在实际开发中的实现过程。比如,在出行订票系统和智能翻译系统的开发中,作者详细阐述了如何利用LangChain等技术框架构建一个多任务的智能体模型,以及如何处理复杂的多语言、多轮对话场景。通过这些实际案例的剖析,读者不仅能掌握智能体开发的基础,还能获得实际的编程技巧与开发经验。

第3部分:智能体深度开发

第三部分深入探讨了智能体在实际应用中的深度开发技巧。从智能邮件助理到智能面试助手,书中通过具体的功能设计与技术实现,展示了如何构建一个高效的智能体,帮助读者了解如何在智能体中集成LLM、如何优化多轮对话管理、如何进行个性化推送等复杂的应用场景。特别是对于智能体个性化学习与优化的探讨,提供了更高阶的开发技术,帮助开发者在实际工作中提升智能体的智能化水平。

人工智能对生活与工作的重塑

从本书的内容中,我们不难看出,AI Agent的开发不仅仅是为了实现单一任务的自动化,更是在构建一个全面、智能、高效的服务体系。无论是个人日常的智能助手,还是企业后台的自动化决策系统,AI Agent都能通过无缝连接与多任务处理,解放人力,提升效率,推动各行各业的智能化转型。

AI Agent的核心意义,在于其能够解构复杂任务,自动学习与适应用户需求,从而不断提升服务质量。通过自然语言处理、情感分析、行为预测等技术,智能体能够形成个性化、精准的服务方案,满足不同用户的需求。例如,智能面试助手能够通过简历分析与行为数据,自动评估候选人,提供更加客观的面试评价;智能客服则可以在电商平台中自动解答用户咨询,大幅降低人工成本的同时提升客户满意度。

总结

总体来说,《AI Agent开发与应用:基于大模型的智能体构建》不仅为开发者提供了完整的技术框架和实用的开发方法,还深入探讨了AI Agent在实际生活和工作中的应用场景。作者凌峰博士凭借其扎实的学术背景和丰富的开发经验,将这本书写得既富有理论深度,又紧密结合实践,为读者提供了全面的学习指南。

对于那些希望深入了解人工智能、特别是智能体开发的人来说,这本书无疑是一本宝贵的参考资料。它不仅是技术开发者的必读书籍,更适合那些想要进入AI应用领域,尤其是大模型应用的开发人员和研究者。通过本书的学习,读者不仅能掌握AI Agent的基础理论和应用技术,还能拓宽视野,掌握智能体在各行各业中的深度应用,助力实现数字化转型的愿景。

这本书的出版,标志着人工智能技术,尤其是智能体技术的进一步普及与深入,也为未来AI Agent的开发提供了丰富的思想启迪与实践经验,是一本值得反复阅读与实践的好书。

《大模型RAG应用开发:构建智能生成系统》

在人工智能的浪潮中,生成式模型已经从学术研究进入到实际应用的领域。而在这其中,检索增强生成(RAG)技术作为一种创新性的突破性方法,正在逐步改变我们对信息获取与内容生成的理解。对于开发者、数据科学家以及所有致力于人工智能应用开发的人来说,《大模型RAG应用开发:构建智能生成系统》是一本不可或缺的宝贵资源,它不仅深入浅出地解读了 RAG 技术的核心概念、工作原理,还通过细致的案例展示了如何将这一技术应用于各个行业,为智能生成系统的构建提供了丰富的实践指导。

RAG:智能生成的前沿之路

在深入了解这本书之前,我们首先需要清楚什么是 RAG 技术。RAG,全称“Retrieval-Augmented Generation”,是将传统生成模型与信息检索技术结合的一种新型架构。与传统的纯生成式模型不同,RAG通过检索与生成的协同工作,不仅能够提高生成内容的质量,还能在处理实时、动态的信息时展现出巨大的优势。通过检索相关的外部知识,RAG系统能够在生成内容时引入最新、最相关的上下文信息,极大提升生成模型的实际应用能力。

在传统的生成式AI中,模型主要依赖于预训练时学习到的知识。然而,随着数据的迅速变化和信息的不断更新,预训练模型的固有局限性显而易见。RAG的出现,正是对这一瓶颈的有效突破。通过集成检索模块,RAG不仅能够查询外部知识库,还能根据实时需求生成更为精确和符合时效性的内容,避免了传统生成模型无法处理最新信息的局限。

知识库的重要性

无论是个人知识库还是企业知识库,它们在RAG系统中都占据着至关重要的位置。在 RAG 的应用场景中,知识库不仅是信息检索的源泉,更是生成内容质量的保障。个人知识库可以帮助用户通过简洁、智能的方式快速获取自己曾经积累的知识,而企业知识库则通过整合全公司范围内的文档、报告、邮件等内容,为企业决策者提供可靠的信息支持,帮助企业提高工作效率。

对于开发者而言,理解和构建一个高效的知识库是开发RAG应用系统的基石。书中对如何构建与优化向量数据库进行了深入的阐述,特别是在数据向量化与FAISS开发方面,提供了极为详细的步骤与技术细节。从数据清洗、向量化到向量检索的实现,每一步都紧密结合RAG应用中的实际需求。这些内容不仅帮助读者更好地理解向量数据库的构建过程,还为那些需要进行大规模数据处理与检索的应用开发提供了宝贵的经验与方法。

书籍内容的深入解读

《大模型RAG应用开发:构建智能生成系统》一书的第一大亮点,就是其系统全面地讲解了RAG技术的开发流程。书中的第1至第3章,重点介绍了RAG开发的基础内容,包括 Python 开发环境的搭建、Faiss 常用工具与模块的使用以及智能体的基本概念。对于初学者来说,这些内容可以帮助他们从零开始建立 RAG 系统的基本框架,理解其背后的技术原理。

而从第4章开始,书籍进入了 RAG 应用的具体开发过程。如何构建高效的检索增强模型,如何在开发中引入 FAISS 和 Transformer 等工具,以及如何优化检索结果以提高生成内容的准确性和一致性,这些细致的步骤和技术详解无疑为开发者提供了极大的帮助。特别是在第9至第11章,书中通过企业文档问答系统、医疗文献检索系统和法律法规查询助手等实际案例,让读者能够深入理解 RAG 技术在不同领域的具体应用,为今后的开发与实践提供了极为宝贵的参考。

对行业的深远影响

随着大模型的不断演进,RAG 技术的应用场景也在不断扩展。从企业内部知识管理,到医疗、法律等专业领域的智能辅助,RAG 系统正在成为一种新的行业标准。在医疗文献检索系统的开发过程中,RAG 不仅帮助医生更快地获取准确的医学文献,还通过生成模块提供精确的答案,节省了大量的查询和信息处理时间;在法律法规查询助手的开发中,RAG 通过对法规文本的向量化处理,帮助用户快速查找到相关法规条款,并结合上下文生成具有法律效力的解释,极大提升了法律工作者的工作效率。

随着大模型和 RAG 技术的不断普及,未来更多行业可能会在知识检索与生成内容的结合上产生革命性的变化。RAG不仅能帮助企业高效管理知识库,还能实现实时信息检索与智能内容生成,为企业提供精准、及时的决策支持。

总结

《大模型 RAG 应用开发:构建智能生成系统》是一本既具备理论深度,又具备实践操作性的技术书籍。它不仅详细讲解了 RAG 技术的基础概念和开发流程,还通过丰富的案例和具体的技术实现,帮助读者深入理解RAG 在各行各业中的应用价值。对于 RAG 技术初学者、大模型研发人员,以及数据分析和挖掘工程师等读者来说,这本书无疑是一本不可多得的指导书。

无论是在个人知识库的建设,还是在企业级智能生成系统的开发中,RAG 技术都展示了其巨大的潜力。随着 AI 技术的快速发展,未来的应用场景将更加广泛,RAG 将继续为智能生成和知识检索的结合开辟新的天地,而这本书,则为我们提供了走向这一未来的最强指南。

时间序列新范式:通过合成数据将时间序列与大语言模型对齐,以增强理解和推理

1. ChatTS概述

ChatTS: Aligning Time Series with LLMs via Synthetic Data for Enhanced Understanding and Reasoning 这篇文章是清华大学、字节跳动与必示科技三方共同创作而成。

在实际的工作中,时间序列在运维领域中占据着非常重要的地位,尤其是近些年大语言模型(LLM)的发展,极大地推动了时间序列这一领域的发展。这篇论文介绍了一个叫做ChatTS的模型,它是专为时间序列分析设计的新型多模态大语言模型(MLLMs)。为缓解训练数据稀缺问题,作者们提出基于属性的合成时间序列生成方法,可自动生成具有详细属性描述的时序数据。同时,作者们创新性地提出时间序列演化式指令生成方法(Time Series Evol-Instruct),通过生成多样化时序问答对来增强模型的推理能力。ChatTS是首个以多元时间序列作为输入,并进行理解和推理的时间序列多模态大语言模型,且完全基于合成的数据集微调。作者们在包含真实数据的基准数据集上开展评估,涵盖6项对齐任务和4项推理任务。

实验结果表明,ChatTS在对齐任务中提升46.0%,在推理任务中提升25.8%,其代码的官方链接是: https://github.com/NetManAIOps/ChatTS,HuggingFace的官方链接是:https://huggingface.co/bytedance-research/ChatTS-14B/tree/main ,模型的权重都可以在HuggingFace上面直接下载并使用。

用一个实际的例子来说明这个情况,那就是用户可以针对某个KPI曲线进行提问,并咨询是否有其他曲线存在了波动,然后并提问根因,大语言模型(LLM)进行了回答。

从图2的描述来看,如果要将多条时间序列进行输入,其实可以至少有四种方法可以执行:

  1. Text-Based:将多条时间序列整理成具体的数值,然后一次性输入给大模型进行分析和输出;
  2. Agent-Based:不同的时间序列输入给不同的大模型,然后一次性汇总之后进行汇总大模型LLM的处理和输出;
  3. Multimodal Vision-Based:将时间序列处理成图片信息,然后通过多模态大模型进行处理和分析,然后输出结果;
  4. Multimodal TS-Based:将多条时间序列的数值直接输入大模型,开发一个Time Series Multimodal LLM并做输出。

ChatTS的亮点是将多维时间序列直接作为输入,然后进行推理和分析。目前是一个14B的模型,它是在QWen2.5-14B-Instruct的基础上进行微调的,其开源代码使用也很简单,可以参考下面的代码:

from transformers import AutoModelForCausalLM, AutoTokenizer, AutoProcessor
import torch
import numpy as np

# Load the model, tokenizer and processor
model = AutoModelForCausalLM.from_pretrained("./ckpt", trust_remote_code=True, device_map=0, torch_dtype='float16')
tokenizer = AutoTokenizer.from_pretrained("./ckpt", trust_remote_code=True)
processor = AutoProcessor.from_pretrained("./ckpt", trust_remote_code=True, tokenizer=tokenizer)
# Create time series and prompts
timeseries = np.sin(np.arange(256) / 10) * 5.0
# 构造异常的时间序列取值
timeseries[100:] -= 10.0
prompt = f"I have a time series length of 256: <ts><ts/>. Please analyze the local changes in this time series."
# Apply Chat Template
prompt = f"<|im_start|>system\nYou are a helpful assistant.<|im_end|><|im_start|>user\n{prompt}<|im_end|><|im_start|>assistant\n"
# Convert to tensor
inputs = processor(text=[prompt], timeseries=[timeseries], padding=True, return_tensors="pt")
# Move to GPU
inputs = {k: v.to(0) for k, v in inputs.items()}
# Model Generate
outputs = model.generate(**inputs, max_new_tokens=300)
print(tokenizer.decode(outputs[0][len(inputs['input_ids'][0]):], skip_special_tokens=True))

如果是使用vLLM推理的话,可以参考这份代码:

import chatts.vllm.chatts_vllm
from vllm import LLM, SamplingParams
# Load the model
language_model = LLM(model="./ckpt", trust_remote_code=True, max_model_len=ctx_length, tensor_parallel_size=1, gpu_memory_utilization=0.95, limit_mm_per_prompt={"timeseries": 50})
# Create time series (np.ndarray) and prompts (chat_templated applied)
ts1, ts2 = ...
prompt = ...
# Model Inference
outputs = language_model.generate([{
      "prompt": prompt,
      "multi_modal_data": {"timeseries": [ts1, ts2]}
  }], sampling_params=SamplingParams(max_tokens=300))

2 ChatTS方法论

2.1 模块划分

从论文的介绍来看,ChatTS的数据模块大概可以分成以下几个情况:

  1. Attribute Selector:属性选择器,主要用于精准的属性选择,方便生成满足这些属性的时间序列;属性包括趋势类(稳定趋势、上升趋势、下降趋势等),周期类(三角函数、正方形、无周期等),局部波动类,是否存在噪声等类别。
  2. Attribute-Based Time Series Generator:基于属性的时间序列生成器,可以使用规则的方法进行生成;
  3. Time Series Evol-Instruct:时间序列演化式指令,用于生成大量的、多样的、精准的时间序列,并且有相应的文本回答,属于一个(time series,text question-answer)的信息;
  4. 模型设计(model design):使用了多维时间序列作为数据的输入;
  5. 模型训练(model training):使用了监督微调(SFT,Supervised Fine-Tuning)的方法,在已有模型的基础上进行了微调;

整体的流程可以参考下图的方法:通过选择不同的属性,生成不同的样本数据,以及相应的问题和答案。

同样的,时间序列的相应指令可以参考下图:

2.2 模型微调

而在模型微调的时候,需要将时间序列和文本进行分别输入,按照一定的格式进行编码,其中包括对时间序列的解释,以及相应的问题和答案。

而ChatTS的样本训练大约是万这个量级,在现有模型的基础上即可微调出不错的结果。

ChatTS的训练可以在QWen2.5-14B-Instruct的基础上进行两阶段的微调,包括大尺度的微调训练(large-scale alignment training)和监督微调(SFT)。具体的问答案例可以参考图8的内容。

模态对齐训练阶段

在第一阶段,我们使用基于属性的合成时间序列数据进行大规模对齐训练,以建立大语言模型中文本与时序模态的初步对齐。此阶段使ChatTS能够有效实现文本描述与时序属性的语义映射。在模态对齐阶段,通过手工设计模板和LLM精炼构建了三个训练数据集:

  • UTS(单变量时间序列)数据集 :包含单变量时序基础属性描述任务(涵盖全局与局部属性分析);
  • MTS-Shape(多元形态)数据集 :由具有全局趋势相关性的多元数据构成,旨在增强模型分析多元相关性的能力;
  • MTS-Local(多元局部)数据集 :包含局部波动相关的多元数据,重点提升模型对多元时序局部特征的分析能力;

鉴于多元时序(MTS)具有更复杂的特征组合,我们将MTS与UTS的训练数据规模设定为约2:1的比例(具体训练数据规模对模型性能的影响详见第4.5节的数据集扩展研究)。

监督微调阶段

在第二阶段,通过监督微调(SFT)开发模型执行复杂问答与推理任务的能力。该阶段主要使用两类训练数据:

  • TSEvol生成数据集 :通过时间序列演化式指令生成方法(Time Series Evol-Instruct)构建,用于增强模型对时序问题的问答推理能力;
  • 指令遵循(IF)数据集 :基于预定义模板构建,专门训练模型遵循特定响应格式;

对于TSEvol方法,我们使用对齐训练阶段的数据集配合LLM生成的问答对作为种子数据。通过联合训练,使多模态大语言模型能够精准响应时序领域查询,并强化其处理上下文驱动的复杂推理任务的能力。在模态对齐和监督微调阶段,我们通过系列数值任务系统提升ChatTS的数值分析能力,包括:极值识别、分段均值计算、局部特征提取(如尖峰位置/幅度)、季节性与趋势振幅分析、以及单点原始数值解析。实验结果中的数值评估指标验证了ChatTS在时序数值分析方面的卓越性能。

训练配置

  • 数据格式:两阶段均采用问答对格式。在模态对齐阶段混入少量IF数据以缓解指令遵循能力退化;
  • 防止过拟合策略:SFT阶段混30%对齐训练数据集;
  • 时序长度覆盖:训练数据包含64-1024长度的时序序列,确保模型处理变长时序的能力;
  • 训练框架:基于DeepSpeed和LLaMA-Factory [65]进行全参数监督微调,基础模型选用Qwen2.5-14B-Instruct;
  • 推理环境:Qwen与ChatTS均采用DeepSpeed框架部署。

3 ChatTS评估方法

3.1 数据的评估

本节通过回答以下研究问题(research questions)全面评估ChatTS的性能:

  • RQ1:ChatTS与时序数据的对齐效果如何?
  • RQ2:ChatTS在时序推理任务中的表现如何?
  • RQ3:基于属性的合成数据与TSEvol方法是否有效?
  • RQ4:训练集规模如何影响模型性能?
  • RQ5:ChatTS的时序模态设计是否真正发挥作用?
  • RQ6:ChatTS的原生时序多模态能力是否优于代理型方法?

参照多模态大语言模型通用评估范式,我们将评估任务分为两类:

  1. 对齐任务(验证文本-时序语义映射):(1)单变量任务:趋势识别、季节性检测、噪声分析、局部波动分析(含分类与数值子任务)(2)多元任务:相关性分析、聚类分析(均为分类任务)
  2. 推理任务(验证时序逻辑推演能力) (1)归纳推理:问答任务,对单/多元时序物理意义进行归纳总结(2)演绎推理:判断题(T/F),基于预设条件与单变量时序进行逻辑推演(3)因果推理:选择题,根据单变量时序选择最可能诱因(4)比较推理(MCQ2):选择题,对比两组时序选择正确答案

评估指标可以使用相对准确率:

验证数据集采用以下数据:

从模型的数据效果来看,相对其他开源模型和API的使用结果来看,ChatTS都获得了不错的数据表现:

3.2 实战的评估

除了理论上的应用之外,ChatTS还可以用于各种实际的场景,例如形状与统计值分析:

可以进行数据库的失效分析:

还支持时间序列数据的细节分析:

4 ChatTS论文总结

针对时间序列理解与推理领域长期存在的跨模态数据稀缺难题,本文提出首个支持多元时序输入的多模态大语言模型ChatTS,开辟了基于合成数据的时序语义对齐新模式,核心贡献体现在三个维度:

  1. 首创属性驱动的时序合成引擎,通过参数化建模生成兼具多样性和精确标注的时序-文本对,突破真实数据标注成本限制;
  2. 开发时序演化式指令生成框架(TSEvol),融合属性组合推理与Evol-Instruct机制,构建出覆盖复杂推理场景的20.8万高质量QA对;
  3. 建立多维度评估体系,在包含真实场景的跨领域数据集上验证模型性能,在时序对齐任务(F1=0.823)和因果推理任务(Acc=78.4%)上分别实现46.0%和25.8%的绝对性能提升,显著超越GPT-4o等基线模型。本研究不仅证实了合成数据在跨模态学习中的可行性,更为时序分析范式从传统特征工程向语义理解跃迁提供了技术基础设施,相关代码、模型及数据集已在GitHub开源。

这些成果验证了该方法在弥合时间序列数据与自然语言理解鸿沟方面的有效性。作者们已开源源代码、训练模型权重及评估数据集以供复现和后续研究:https://github.com/NetManAIOps/ChatTS。

LangChain核心技术与LLM项目实践

作为一名正在学习大语言模型(LLM)技术的开发者,我一直在寻找能够帮助我深入理解并高效运用这些前沿技术的书籍。幸运的是,最近我偶然得到了《LangChain核心技术与LLM项目实践》这本书以及相应的其他书籍,经过一段时间的阅读,我发现这本书不仅内容丰富、技术全面,而且从基础到高级的层次设计让我在学习过程中逐渐从理论走向实战,真正收获颇丰。

从基础到高级,逐步推进

这本书以零基础为起点,循序渐进地展开内容。第一章通过对大语言模型的基本概念及其应用场景的介绍,为我打下了扎实的理论基础,尤其是对于LangChain的优势和广泛应用做了清晰的说明。作为初学者,能够从这里开始,逐步接触到模型的基本架构和其潜力,感受到了学习的信心。

随后的章节则将LangChain的各个功能模块一一拆解,层层推进。从如何导入模型、优化Prompt模板,到如何设计任务链、管理内存模块等,每一章都配有详实的代码示例和详细的应用场景分析。特别是第3章到第6章,通过提示词工程等大量的实战案例,我能够在动手实践中逐渐掌握如何将这些技术应用到实际的开发中,真正理解每一个核心技术的背后原理。

 

核心技术的深入剖析

本书的亮点之一是对LangChain核心技术的深入剖析。例如,第7章深入讲解了LangChain的表达式语言和并行处理技巧。通过代码示例,我学会了如何通过简洁的语法提高数据处理效率,这对处理大规模数据任务来说至关重要。而第8章则让我对Agent系统有了更深的理解,书中详细分析了不同类型的Agent系统及其如何处理多任务,使我能够构建更加智能化、自动化的应用。

尤其是在回调机制的讲解上,书中通过真实的案例帮助我掌握了如何自定义回调函数,实时监控任务进展并处理异常情况。这样的技术不仅提升了系统的灵活性,也使得开发过程中更加可控。通过这些深入的技术分析,我对LangChain的内在机制有了更为清晰的认识,也为将来在项目中的应用奠定了坚实的基础。

企业级智能应用的构建与优化

本书的第10章和第11章,更是让我看到了LangChain在企业级应用中的巨大潜力。特别是在模块化开发与系统集成领域,书中详细讲解了如何利用LangChain的模型I/O和数据检索技术来提升企业级解决方案的效率和可靠性。结合实际的企业应用场景,作者还提出了如何进行性能优化、复杂查询处理和任务链设计的高级技术,这对我来说无疑是一次眼界大开的技术洗礼。

从实践中获得真知灼见

《LangChain核心技术与LLM项目实践》的最大亮点在于最后的第12章,它将前11章的知识点与实战相结合,带领读者实现一个完整的企业级智能问答系统。通过这个完整的项目案例,我不仅学会了如何进行需求分析、架构设计,还从代码实现中感受到了如何将理论知识落地到实际应用。这个实战环节是我学习过程中最有价值的一部分,因为它不仅帮助我巩固了所学的技术,更让我从实践中发现了不少开发中的问题和解决方案。

一本不可多得的学习宝典

整体来说,《LangChain核心技术与LLM项目实践》是一本无论是对初学者还是对有一定经验的开发者都非常有价值的书籍。它系统地讲解了LangChain的核心技术,并通过大量的代码示例和实际场景,帮助读者将知识转化为实践能力。尤其是本书的章节安排十分合理,既注重理论的讲解,又兼顾了项目的实操,非常适合像我一样想深入学习并实践LangChain技术的开发者。如果你对大语言模型和LangChain有兴趣,或者正在从事相关技术的开发工作,那么这本书绝对是一本不容错过的佳作。通过它,你可以在学习过程中积累丰富的实践经验,为未来的智能化应用开发打下坚实的基础。

用 ima 搭建你的 AI 大脑:职场、创作、学习、教学的效率提升利器

在信息爆炸时代,真正的竞争力在于如何将碎片知识转化为可调用的智慧。使用 AI 智能工作台  ima.copilot,正以“个人知识库”为核心,重塑打工人和学生人群的工作流。ima 知识库不仅仅是存储,更是让知识流动、协作与增值的智能引擎,重塑信息时代的核心竞争力。

💼  一、职场人:告别文件沼泽,打造高效决策引擎

  • 痛点:职场人最常见的一种情况就是项目文档散落聊天工具/邮箱/本地/云盘,每次到使用的时候就找不到相关文件,同时关键信息在短时间内找不到也想不起来放在哪里了,然后每次不想找的时候,文件又再次自动出现了。
  • ima解法
    ✅ 一键聚合:微信公众号的文章、聊天文件、本地 PDF、Word、PPT 直接入个人知识库,自动解析摘要和核心内容;
    ✅ 智能问答:输入“2023年Q4商业报告核心结论”,ima 秒调知识库内容生成答案,并且根据知识库进行精确回答内容,有理有据;
    ✅ 团队协作:一个小的团队可以构建共享知识库,在同一个共享知识库中同步项目资料,通过严格的权限管理确保信息安全。

✨ 案例:某产品经理将竞品分析/用户反馈存入知识库,需求评审时直接提问调用数据,效率提升50%。

✍️ 二、自媒体人:从素材堆积到灵感喷发

  • 痛点:笔者已经写了数十年的博客,但是博客都散落在知乎、微信公众号、个人网站甚至 GitHub 上面。每次要想找某一篇博客的时候,都需要去各个平台上去看一眼,并且十年前写的知识并没有做很好的知识扭转,没有那种常见常新的感觉,就像是写完了之后就放在那里了而已。同时,对于自媒体创作者人而言,很容易出现的情况就是写作思路的枯竭,同时还收藏百篇爆文,在写作时仍无头绪。
  • ima 解法
    ✅ AI盘活素材:通过 ima 入库的公众号文章自动打标签,输入搜索主题自动关联案例,并会给出相应的答案和链接;
    ✅ 创作加速器:基于知识库生成提纲、润色文案,支持多语言翻译功能;
    ✅ 爆款分析:提问“标题技巧”,ima 从知识库中提炼方法论,自媒体创作人可以在现有的知识库中进行提炼和二次开发。

✨ 案例:博主将100+爆文存入 ima,创作时调用“金句库”,选题耗时减少70%。

🎓 三、学生党:把文献海洋变成结构化知识

  • 痛点:学生党的学习资料和论文资料杂乱,逻辑梳理耗神,而且文件夹的管理会混乱,很多时候也会出现找不到学习资料的情况。
  • ima 解法
    ✅ 文献秒读:上传 PDF 自动生成脑图/摘要,外文文献即时翻译;
    ✅ 精准问答:“对比AB测试理论差异”直接定位知识库相关内容;
    ✅ 复习利器:错题集存入知识库,考前智能生成测验题,可以有效地提升复习的效率和质量。

✨ 案例:研究生用 ima 管理文献,论文写作时提问调取关联观点,效率翻倍。

👩‍🏫 四、教师:从重复答疑到智慧教学

  • 痛点:每一个学生都是独立的个体,存在重复提问的现象,备课资料难共享。
  • ima 解法
    ✅ 教学资源库:课件/试卷/论文/外网资料统一入库,按标签进行合理的分类;
    ✅ AI助教:将知识库嵌入公众号,学生提问自动答疑(如“奖学金政策”、“考试准备技巧”、“错题库整理”);
    ✅ 集体备课:共享知识库同步教研资料,AI 自动生成教案/习题。

✨ 案例:高校教师用 ima 搭建课程知识库,学生咨询量下降 80%,备课时间节省 40%。


🔑 为什么 ima 能成为“越用越聪明”的 AI 大脑?

  • 动态进化:通过用户对个人知识库或者团队持续更新,AI 回答精准度随使用提升;
  • 跨端联动:PC 客户端深度创作 + 小程序碎片收集 + App 随时调用;
  • 双核驱动:混元大模型 + DeepSeek-R1 双引擎策略,专业与通用场景兼顾。

🌟 现在行动
1️⃣ 访问 ima.qq.com 下载客户端; 
2️⃣ 微信搜索“ima知识库”小程序,5秒导入微信收藏;
3️⃣ 创建你的第一个知识库,开启“提问即得答案”的智能时代!

提示词工程(Prompt Engineering)

1.  提示词工程简介

1.1 提示词工程的定义

提示词工程(Prompt Engineering)主要围绕如何有效地与人工智能(AI)模型进行互动,尤其是在生成式人工智能(如ChatGPT、GPT-4、DeepSeek等大语言模型)中的应用。简单来说,提示词工程是指如何设计、优化、调整输入给AI模型的提示词(Prompt),从而获得最有效、最准确的输出。对于AI模型来说,提示词就像是一把钥匙,它打开了模型的思维,帮助引导模型生成特定类型的回应或解决方案。

随着人工智能技术,尤其是自然语言处理(Natural Language Processing,NLP)领域的快速发展,提示词工程逐渐成为技术工作者、产品经理和研究人员需要掌握的技能之一。在实践中,优秀的提示词能够帮助用户更好地引导模型,获得高质量、符合需求的输出,从而提升工作效率,解决复杂的问题。

1.2 提示词工程的核心内容

提示词工程的核心内容包括但不限于以下几个方面:

  1. 提示词的设计与优化: 提示词工程的核心任务是设计出能够引导AI模型生成特定输出的有效提示词。不同的提示词结构、用词、语境都会对AI模型的输出产生不同影响。为了使AI模型生成准确、符合需求的内容,提示词设计需要精确、简洁,并尽可能涵盖输入内容的所有关键要素。例如,在询问一个开放式问题时,提示词应该包含足够的背景信息和问题的方向;而在进行任务指令时,提示词则需要明确告诉AI该做什么。通过不断地优化提示词,可以提高输出结果的质量和相关性。
  2. 语境和意图: 理解并传达问题的语境和意图是提示词工程中非常重要的一部分。AI模型的理解能力在很大程度上取决于用户提供的背景信息和上下文。因此,设计提示词时要确保其能够清晰地传达问题的意图,并提供相关的背景信息。例如,假如你希望AI生成一篇关于人工智能的文章,你应该在提示词中明确说明文章的主题、风格、长度等要求,而不仅仅是简单地说“写一篇人工智能的文章”。
  3. 语言模型的特性: 不同的语言模型有不同的特点和限制。例如,GPT-4在处理长文本时具有较强的能力,但它也可能在复杂的逻辑推理任务中出现一定的偏差。因此,提示词工程不仅仅是要清楚地定义任务,还要根据AI模型的特点进行调整和优化,以便获得最好的结果。
  4. 模型训练与迭代: 在实际应用中,提示词工程并非一蹴而就的任务。随着AI技术的发展,模型不断得到改进和更新,因此,提示词的设计和使用也需要不断地迭代和调整。这是因为新的AI模型可能对提示词的响应方式发生变化,原有的设计方式可能不再有效。

1.3 提示词工程的应用场景

  1. 内容创作: 提示词工程可以帮助内容创作者生成各种类型的文本,例如博客文章、社交媒体内容、产品文案等。通过优化提示词,创作者可以更精准地引导AI生成符合品牌风格、语气和受众需求的内容。比如,你希望生成一篇关于“未来科技”的博客文章,可以通过提供详细的提示词(例如文章的结构、重点、受众群体)来帮助AI提供更具创意的内容。
  2. 数据分析与报告生成: 数据科学家和分析师常常使用AI模型来快速生成报告、分析摘要或趋势预测。通过设计清晰明确的提示词,分析师可以让AI快速从大量数据中提取出关键信息,并生成相关的分析报告。
  3. 教育与培训: 在教育领域,提示词工程可以用于生成练习题、教材内容和解题思路等。例如,教师可以根据学生的学习进度和需求,设计提示词来生成个性化的学习材料和辅导内容,帮助学生巩固知识、提高理解力。
  4. 客户服务与支持: 在客服领域,提示词工程可以帮助AI生成精准的客户支持回答。企业可以根据常见问题和服务需求,设计适合的提示词,从而使AI能够快速提供精准的解决方案,提升客户体验。在客服场景下,AI 大语言模型可以给用户一些解决方案,相对之前检索问题的方式已经优化了很多。
  5. 代码生成与开发: 对于程序员而言,可以在开发过程中利用提示词工程来生成代码片段、调试方案、撰写测试用例和完善技术文档。例如,开发者可以通过提供详细的提示词(例如编程语言、功能需求)来帮助AI生成特定的代码,减少程序员的重复劳动,提高个人的开发效率。在某些场景下,程序员甚至可以跨界编程,例如前端程序员去撰写一部分后端代码,后端程序员来处理一些数据分析,数据分析工程师还可以来撰写简单地前端代码。但这只是特殊情况下的特殊处理方式,还是专业的人士干专业的事情会比较好。

1.4 提示词工程的发展历程

从提示词工程的发展历程来看,AI 模型经历过结构化的输入等一系列过程,直到现在的提示词工程的样式。

2.  提示词工程的使用

提示词工程的方法有很多,包括但不限于零样本学习、少样本学习、思维链、思维树、RAG、ReAct等内容。本文将介绍其中的部分知识,以启发大家在与大模型交互的过程中的提示词工程方法。

2.1 简单使用

如今的提示词工程的入门也十分简单,直接就可以通过对话的方式与 AI 进行沟通和交流。形如下述格式,用户写一段文本信息或者一句简短的话,模型就可以输出相应的内容。

如果用户觉得上述内容不够完善,有两种常见的方式进行解决。第一种是提供更多的信息(A clearer and more precise prompt),包括上下文的消息、网站最新消息和更加精确的指令,当 AI 接收到这些消息和指令的时候,输出的内容就会更加完善与精确;第二种方法是角色扮演(Role prompting example),就是假设你是一个某某方向的专家,并且在输入的时候告知 AI 模型,AI 模型就会自动承担这个专家的角色并进行内容的输出。

2.2 Zero-shot、One-shot、Few-shot

Zero-shot学习指的是模型在没有见过任何与特定任务相关的示例数据的情况下,直接执行该任务。简单来说,就是零样本学习。在Zero-shot学习中,模型依赖其在预训练阶段获得的知识,能够根据输入的指令或描述,完成没有直接训练过的任务。

One-shot学习指的是模型在处理任务时,仅需一个示例来理解任务并进行执行。换句话说,模型通过一个示例就能“学会”如何完成任务,并可以在此基础上继续进行类似任务的推理,就是单样本学习。

Few-shot学习指的是模型通过少量的训练示例来完成任务。通常,few-shot学习会提供比One-shot更多的示例(通常在3到10个之间),使得模型能够更好地理解任务的规律和要求,就是少样本学习

学习方式示例数任务依赖适用场景
Zero-shot无示例无需任何任务特定的训练数据适用于任务描述明确且模型具备足够语言理解能力的情况。常见于机器翻译、情感分析等任务。
One-shot1个示例只需要一个任务相关示例适用于能够通过单个示例就能明白任务要求的情境,适合小规模示例或人脸识别等任务。
Few-shot少量示例(3-10个)需要少量示例来理解任务适用于需要一些实例来更好推理的任务,适合文字分类、图像识别等问题。

下图表示了zero-shot和one-shot的提示词工程,AI 模型输出的答案是不一样的。

2.3 思维链Chain of Thought

2.3.1 思维链的定义

Chain of Thought(思维链) 是一种在人工智能尤其是大语言模型中使用的推理方法,目的是在通过逐步展开的推理过程来帮助模型解决复杂问题,特别是需要逻辑推理或多步骤计算的问题。传统的语言模型通常依赖于直接输入问题,并立即给出回答,但这有时会导致回答不够精确或存在错误。Chain of Thought方法则通过引导模型分步骤思考,逐渐推导出答案,从而提高推理的准确性和透明度。思维链(Chain of Thought)可以理解为逐步推理,它是通过将复杂问题拆解成多个小步骤,让模型逐步生成每个步骤的思考过程,最终得出正确的结论。这个过程类似于人类在解决问题时的思维过程:首先分析问题,考虑各种可能性,然后逐步推理出答案。

2.3.2 思维链的工作原理

  1. 问题分解:Chain of Thought方法要求模型将一个复杂问题分解成多个较为简单的子问题或推理步骤。每个步骤都帮助模型理清思路,逐步逼近最终答案。
  2. 逐步推理:每一步推理的结果会作为下一步推理的依据。这种逐步展开的推理过程能帮助模型减少直接回答时可能遇到的错误或遗漏。
  3. 最终输出:通过逐步推理,模型最终得出一个合理的答案,这个答案通常更符合逻辑,也更有说服力。

2.3.3 思维链的案例

假设我们有一个数学问题,我们用思维链的方式进行输入:

问题:如果今天是星期三,那么五天后是星期几?

传统的语言模型可能会直接给出“星期一”的答案,但它的推理过程可能并不清晰。使用Chain of Thought方法时,模型会像这样逐步推理:

  1. 第一步:今天是星期三。
  2. 第二步:明天是星期四。
  3. 第三步:后天是星期五。
  4. 第四步:再过两天是星期六。
  5. 第五步:再过一天是星期天。

最终,模型得出结论:五天后是星期一

通过这种逐步推理,模型的思维过程变得更加透明,也更容易让人理解。

下面是一个标准的提示词输入模式:

下面是一个思维链(Chain of Thought)的提示词输入模式,在提示词中明确输入按步骤思考和解决

2.4 思维树Tree of Thought

2.4.1 思维树的定义

Tree of Thought(思维树) 是一种新的推理方法,它在传统的Chain of Thought(思维链)基础上进一步扩展,旨在帮助大语言模型进行更复杂的推理和决策。与线性逐步推理的Chain of Thought不同,Tree of Thought通过将推理过程分支化,允许模型在多个可能的推理路径中进行探索,并根据不同的分支选择最佳路径,从而得到更加准确和丰富的答案。

Tree of Thought可以理解为一个多分支的推理过程,它在一个问题的解决过程中产生多个并行的推理路径,并通过评估这些路径来选择最优解。这种方法特别适合于复杂的决策问题、长时间推理过程或需要考虑多个可能性的问题。

相比之下,Chain of Thought是一种线性推理方法,每一步推理依赖于前一步的结果。而Tree of Thought通过“树形”结构,在推理过程中创建多个分支,允许模型在不同的路径中进行探索和评估。这种多路径的推理方式更贴近人类解决问题时的思维过程,人类在面对复杂问题时,往往会考虑多个解决方案,并根据实际情况选择最佳的路径。

2.4.2 思维树的工作原理

  1. 分支化推理: 在Tree of Thought中,模型会为每个推理步骤生成多个候选答案或路径。例如,在解决一个问题时,模型可能会产生不同的推理路径,每个路径代表着一种不同的推理思路。
  2. 路径评估: 一旦模型生成了多个推理路径,它会评估这些路径的有效性和正确性。评估可以基于已有的知识库、上下文信息或者特定的评价标准来进行。
  3. 选择最优路径: 在所有可能的推理路径中,模型会选择最符合问题要求的路径,从而得到最终的解答。这个过程类似于“树形搜索”,通过遍历不同的路径并根据评估进行选择。
  4. 输出结果: 最终,模型会根据选择的最佳路径输出问题的解答。

2.4.3 思维树的案例

假设我们有一个问题:

问题:一个农场有20只羊和30只鸡。每只羊有4条腿,每只鸡有2条腿。农场一共有多少条腿?

使用Chain of Thought的方法,模型可能会按以下步骤逐步推理:

  1. 每只羊有4条腿,20只羊一共是20 * 4 = 80条腿。
  2. 每只鸡有2条腿,30只鸡一共是30 * 2 = 60条腿。
  3. 80 + 60 = 140条腿。

这是一个线性推理的过程,步骤是顺序进行的。

但使用Tree of Thought时,模型可能会通过多个不同的推理路径来解决问题。比如:

  • 路径一:计算所有羊的腿数:20 * 4 = 80。计算所有鸡的腿数:30 * 2 = 60。最终加总得到腿数:80 + 60 = 140。
  • 路径二:计算每种动物的腿数,并进行逐步分组:羊有20只,每只羊有4条腿,总腿数为80。鸡有30只,每只鸡有2条腿,总腿数为60。结合不同的动物类型,总结出腿数为140。

Tree of Thought方法能够同时处理多个推理路径,然后比较这些路径的效果,最终选择一个最合适的答案。在复杂的推理任务中,模型可能会根据不同的推理方向探索多个分支,最终确定最佳解答。

2.5 知识的生成和RAG技术

LLM 继续得到改进,其中一种流行的技术是能够融合知识或信息,以帮助模型做出更准确的预测。

知识生成的案例,需要明确说出2个关键分析和3个关键影响因子等指令,AI模型就可以生成以下的对话内容:

而在知识生成的过程中,提供一个知识库在很多时候就是一种必要的措施。通过构建个人或者团队的知识库,可以有效地提升回答的能力,而检索信息增强(RAG)就是一种非常有效的方式,用一句话来总结就是:

RAG(中文为检索增强生成) = 检索技术 + LLM 提示

与通用的生成式AI最大的区别,就是RAG增加了知识库的检索技术,通过检索的方式极大地提升了回答的准确率。

而RAG常见的运作方式就包括以下几步,其中资料的质量就是非常关键的一步。

Step 1:资料收集,为AI检索奠定基础:首先,收集AI所需的学习资料,例如FAQ、产品型录、新人训练手册等,为后续的资料处理和检索打好基础。

Step 2:文本分块与向量化,资料转换为AI可读格式:当资料被汇入RAG系统后,会进行文字分块(Chunk),将长文本拆分为更小的单位(如段落或句子)。接着,这些文字区块透过嵌入模型(Embedding Model)转换成向量格式,使得AI能够理解资料的语意结构。

Step 3:问题分析与检索,精准找到关联资料:当用户在应用程式中提出问题时,AI会先分析搜索意图,再从向量资料库中检索与该问题高度相关的文字区块。

Step 4:生成回答,几秒内完成资讯传递:最后,生成式 AI 根据检索到的资料生成回答,并将答案回传到应用程式中,几秒内即可提供使用者所需的资讯。

2.6 自我一致性

自我一致性本质上是一种集成学习方法,通过多次执行 CoT 得到多个推理路径,然后在多个结果中投票选择最一致的答案。Xuezhi Wang等人后来又对其进行了优化,提出了推理增强集成(Rationale-Augmented Ensembles) 方法,通过改变示例顺序或使用模型生成的思维链(CoT)来替换人工编写的推理链,在多个样本试验中引入随机性,然后通过多数投票来聚合模型输出,得到最终答案。

从上图可以看出自我一致性方法整体包括三个步骤:

  1. 构造 CoT 示例数据;
  2. 通过大模型生成多个不同的推理路径(reasoning path);
  3. 使用多数投票(majority vote)的方法选出最一致的答案;

虽然这种方式有点大力出奇迹的感觉,但是它确实可以提高思维链在算术和常识推理等任务中的性能。在具体的使用过程中,还有两个问题值得注意:

  1. 在生成多个推理路径时,一般将模型的温度值设置为0.5,因为这个值如果设置过小会导致答案基本都一样,过大又会导致答案全都不一样,都会影响到最终的效果;
  2. 需要生成多少个推理路径(也就是采样次数)也是一个问题,从论文结果来看,候选样本数越多,最终效果越好,论文中一共采样了40次,但在实际应用中不可能这做,一般采样5次以上就能超过普通的思维链提示;

2.7 自动推理并使用工具(ART)

在大模型使用的时候,如果进行数据分析或者网页分析,可能会涉及到外部工具的使用。在这种时候,交替使用思维链和工具则是一种强大且稳健的方法。因为使用程序或者查询工具可以让结果更加精准,有效避免让大模型产生幻觉的情形。

ART(Automatic Reasoning and Tool-use)的工作原理如下:

  • 接到一个新任务的时候,从任务库中选择多步推理和使用工具的示范。
  • 在测试中,调用外部工具时,先暂停生成,将工具输出整合后继续接着生成。

ART引导模型总结示范,将新任务进行拆分并在恰当的地方使用工具。ART 采用的是零样本形式。ART还可以手动扩展,只要简单地更新任务和工具库就可以修正推理步骤中的错误或是添加新的工具。这个过程如下:

下面的例子充分展示了编程、思维链推理、搜索、算数、字符串操作的全部流程,在此期间使用了搜索引擎、大模型、Python等工具来完成任务。

2.8 ReAct(Reason+Act)

ReAct是Reasoning and Acting(Reason Act)缩写,意思是LLM可以逻辑推理(Reason),构建完成系列行动(Act),从而达成期望目标。ReAct框架允许大模型与外部工具交互获取额外的信息,从而给出更可靠和实际的行动。

大模型Agent功能,大模型会自己分析问题,选择合适的工具,最终解决问题。这个功能背后的原理是ReAct框架。ReAct方式的作用就是协调LLM模型和外部的信息获取,与其他功能交互。如果说LLM模型是大脑,那ReAct框架就是这大脑的手脚和五官。同时具备帮助LLM模型获取信息、输出内容与执行决策的能力,对于一个指定的任务目标,ReAct框架会自动补齐LLM应该具备的知识和相关信息,然后再让LLM模型做成决策,并执行LLM的决策。

ReAct流程里,关键是思维、行动、观察这三个概念:

  1. Thought:由LLM模型生成,是LLM产生行为和依据。可以根据LLM的思考,来衡量他要采取的行为是否合理。这是一个可用来判断本次决策是否合理的关键依据。相较于人类,thought的存在可以让LLM的决策变得更加有可解释性和可信度。
  2. Act:Act是指LLM判断本次需要执行的具体行为。Act一般由两部分组成:行为和对象。用编程的说法就是API名称和对应的入参。LLM模型最大的优势是,可以根据Thought的判断,选择需要使用的API并生成需要填入API的参数。从而保证了ReAct框架在执行层面的可行性。
  3. Obs:LLM框架对于外界输入的获取。它就像LLM的五官,将外界的反馈信息同步给LLM模型,协助LLM模型进一步地做分析或者决策。

一个完整的ReAct的行为,包含以下3个流程:

  1. 输入目标:任务的起点。可以是用户的手动输入,也可以是依靠触发器(比如系统故障报警)。
  2. 循环(Loop):LLM模型开始分析问题需要的步骤(Thought),按步骤执行Act,根据观察到的信息(Obs),循环执行这个过程。直到判断任务目标达成。
  3. 结束(Finish):任务最终执行成功,返回最终结果。

2.9 自我反思(Reflexion)

自我反思是一个通过语言反馈来强化基于语言的智能体的框架。自我反思是一种‘口头’强化的新范例,它将策略参数化为智能体的记忆编码与 LLM 的参数选择配对。

在高层次上,自我反思将来自环境的反馈(自由形式的语言或者标量)转换为语言反馈,也被称作 self-reflection,为下一轮中 LLM 智能体提供上下文。这有助于智能体快速有效地从之前的错误中学习,进而提升许多高级任务的性能。

下图展示了自我反思的智能体学习迭代优化其行为来解决决策、编程和推理等各种人物的例子。自我反思(Refelxion)通过引入自我评估、自我反思和记忆组件来拓展 ReAct 框架。

如下图所示,自我反思由三个不同的模型组成:

  1. 参与者(Actor):根据状态观测量生成文本和动作。参与者在环境中采取行动并接受观察结果,从而形成轨迹。思维链和ReAct被用作参与者模型。此外,还添加了记忆组件为智能体提供额外的上下文信息。
  2. 评估者(Evaluator):对参与者的输出进行评价。具体来说,它将生成的轨迹(也被称作短期记忆)作为输入并输出奖励分数。根据人物的不同,使用不同的奖励函数(决策任务使用LLM和基于规则的启发式奖励)。
  3. 自我反思(Self-Reflection):生成语言强化线索来帮助参与者实现自我完善。这个角色由大语言模型承担,能够为未来的试验提供宝贵的反馈。自我反思模型利用奖励信号、当前轨迹和其持久记忆生成具体且相关的反馈,并存储在记忆组件中。智能体利用这些经验(存储在长期记忆中)来快速改进决策。

自我反思的关键步骤是:

  1. 定义任务
  2. 生成轨迹
  3. 评估
  4. 执行自我反思
  5. 生成下一条轨迹。

3. 提示词的应用

3.1 生成数据

提示词(Prompt)在数据生成中的应用,极大地扩展了数据资源的灵活性与可获取性。通过精心设计的自然语言提示,大语言模型可以自动合成各类结构化与非结构化数据,例如问答对、用户评论、摘要文本、表格内容等,广泛用于数据增强、少样本学习和训练集扩充等场景。这种方式不仅节省了人工标注成本,还能够模拟罕见场景或边界样本,从而提升模型在实际环境中的泛化能力与鲁棒性。例如,输入“生成一些汽车售后的案例,表格输出即可。”,就可以得到以下的表格内容:

案例编号问题类型客户描述处理过程结果费用承担方
001发动机故障客户反映车辆启动困难,发动机抖动严重。检查点火系统、燃油泵和火花塞,发现点火线圈老化导致缺缸。更换点火线圈和火花塞。车辆恢复正常启动,抖动消失。厂商保修期内,费用全免
002电子系统故障中控屏幕频繁黑屏,倒车影像无法显示。升级车载系统软件并检测线路,确认屏幕主板故障。更换全新中控屏幕。电子系统功能恢复正常。保修期内,厂商承担
003事故维修车辆左前侧碰撞导致保险杠和大灯损坏。拆解检查后更换保险杠、大灯总成,校正前梁。车身结构恢复,外观和功能正常。保险公司理赔
004保养纠纷客户投诉保养后油耗异常升高,怀疑机油型号错误。重新检测机油标号,确认使用符合规格的机油;清洗节气门并重置ECU。油耗恢复正常,客户撤销投诉。4S店承担检测费用
005配件更换延迟订购的进口变速箱配件到货时间超过1个月,客户不满。协调厂商加急发货,提供代步车并补偿两次免费保养。配件更换完成,客户满意度提升。厂商承担物流和补偿费用
006召回服务厂商发布刹车助力泵召回通知。主动联系客户预约检修,免费更换改进版助力泵组件。安全隐患消除,客户对主动服务表示认可。厂商全额承担
007客户投诉服务态度客户投诉售后接待人员态度冷淡,未及时解决问题。核实后向客户道歉,对涉事员工培训,并赠送保养优惠券。客户接受解决方案,后续服务评分提高。4S店承担补偿费用
008保修争议客户车辆过保3天,厂商拒绝免费维修变速箱故障。协商后按保修期延长政策承担70%维修费,客户支付剩余30%。争议解决,客户认可处理方案。厂商与客户按比例分担
009软件升级失败车载系统升级后导致动力模式异常。回滚软件版本并重新升级,同步修复兼容性问题。系统运行正常,动力模式恢复。免费服务(厂商责任)
010混合动力电池故障车辆纯电模式续航骤降,电池组报警。检测确认单体电池损坏,更换整个电池组模块。续航恢复至标准值,故障码消除。电池质保期内,厂商承担

3.2 生成代码

在代码生成方面,提示词技术已成为智能编程助手的核心能力之一。开发者可通过自然语言描述需求,模型生成相应的函数、脚本、接口文档甚至是测试用例。例如,“用 Python 实现快速排序”这样的简单提示词,就能引导模型生成完整、可运行的排序程序。这种能力不仅适用于初学者的学习辅助,也在资深开发者的代码补全与重构工作中提供了高效支持,尤其在 API 使用、跨语言翻译和单元测试生成等任务中效果显著。

例如,我们要求LLM输出一段简单的Python代码,就可以得到如下的案例:

def fibonacci(n):
    # 生成斐波那契数列
    sequence = []
    a, b = 0, 1
    for _ in range(n):
        sequence.append(a)
        a, b = b, a + b
    return sequence

# 输入要生成的项数
n = int(input("请输入斐波那契数列的项数: "))
result = fibonacci(n)

# 打印结果
print(f"前 {n} 项斐波那契数列:")
print(result)

3.3 生成图片

生成图片是多模态提示词应用的典型代表。通过将文本提示转化为视觉内容,模型可以根据语义描述合成风格化或写实的图像。例如,输入“一个在夕阳下奔跑的机器人”,生成模型(如 DALL·E、Stable Diffusion)便能输出与该描述相符的图像。这类技术广泛应用于广告创意、角色设计、虚拟场景构建以及艺术创作等领域,同时也促进了图文协同理解的发展,使文本与图像之间的信息表达更加紧密和高效。

3.4 案例分析

提示词的高效应用往往依赖于上下文、格式和任务目标的精细控制,案例分析是理解其应用机制的重要方法。通过对实际应用场景中的提示词设计策略进行剖析,如 few-shot prompting、chain-of-thought prompting 或 instruction tuning,可以深入理解模型响应的形成逻辑与效果差异。案例往往涵盖从简单任务(如摘要生成)到复杂任务(如法律文书撰写或多轮对话)的提示设计,通过对比实验进一步揭示如何通过微调提示词优化输出质量,是推动提示工程从经验走向系统化设计的关键路径。

例如,输入“写一个简答的案例分析的例子,例如某一个职场人力划分的案例,帮忙写一个分析。”然后就可以得到如下的内容:

4.  参考资料

  1. 提示工程指南:https://www.promptingguide.ai/zh
  2. 提示词工程指南:https://github.com/yunwei37/Prompt-Engineering-Guide-zh-CN
  3. 提示词工程维基百科:https://en.wikipedia.org/wiki/Prompt_engineering
  4. 文生文Prompt指南:https://help.aliyun.com/zh/model-studio/use-cases/prompt-engineering-guide
  5. 提示工程概述:https://docs.anthropic.com/zh-CN/docs/build-with-claude/prompt-engineering/overview
  6. 提示工程指南:https://www.promptingguide.ai/zh
  7. 自动推理并使用工具:Paranjape, Bhargavi, et al. “Art: Automatic multi-step reasoning and tool-use for large language models.” arXiv preprint arXiv:2303.09014 (2023).
  8. ReAct:Yao, Shunyu, et al. “React: Synergizing reasoning and acting in language models.” International Conference on Learning Representations (ICLR). 2023.
  9. Reflexion:Shinn, Noah, et al. “Reflexion: Language agents with verbal reinforcement learning.” Advances in Neural Information Processing Systems 36 (2023): 8634-8652.

从小模型到大模型:算法工程师如何高效转型入门大模型技术

近年来,大语言模型如 GPT、LLaMA、Claude、Gemini、DeepSeek 等在自然语言处理任务中展现出前所未有的能力,已经成为技术界与产业界关注的核心。从算法模型到软件产品,从科研论文到应用落地,大模型不仅改变了人们对人工智能的认知,也正在重塑整个技术生态。在任何行业都面临着这场来自于 AI 的挑战,无论是互联网、新能源汽车还是农业,都有着许多实际的场景等待 AI 的接入。对于有机器学习和深度学习基础,甚至在工业界具备小模型实践经验的算法工程师而言,进入大模型的世界,不仅是一场技术能力的升级,更是一场思维范式的转变,不及时转型大模型的话,可能未来在市场中的就业前景会比较差。

有的人对大模型的理解还停留在“模型更大、训练更贵”这类直观感受上,实际上,大模型的发展远不止于此。它的核心在于能力泛化与范式重塑:过去我们依赖于大量小模型分别完成各类任务,如文本分类、情感分析、命名实体识别等,而如今一个统一的大模型通过预训练加提示学习,便可以泛化执行多个任务。而且使用不同的模型大小,往往会有不同的效果。如果是应对线上耗时极为敏感的业务,选择0.5B这类模型反而可能是较好选择;如果是需要接近人类的问答业务,那自然要选择算法效果最好的模型。这种变化不仅体现在架构设计上,也深刻影响着数据处理、系统部署与业务集成的方式。理解这一点,有助于我们更清晰地把握大模型带来的真正价值,以及入门所需要的新思维方式。

大模型的技术入门可以从实践出发。对于刚开始接触这一领域的工程师,最直接的方式是先从大模型的 API 使用开始,熟悉其基本能力。通过调用 OpenAI 或者国内主流模型服务,可以快速体验大模型在文本生成、问答、摘要、翻译等方面的表现。除此之外,还可以使用 Ollama 进行本地模型的部署和使用,如果本地电脑的配置较好,甚至还可以使用效果较好的模型。更进一步,程序员还可以尝试通过提示词工程(Prompt Engineering)技巧调整模型输出,比如使用 Zero-shot、One-shot、Few-shot、Role Prompting 或思维链(Chain-of-Thought)来提升任务完成效果。在这个过程中,如果有个人或者本地的知识库,则可以使用 LangChainLlamaIndex 等框架可以帮助更高效地构建 LLM 驱动的应用,如智能问答系统、RAG 检索增强模型等。

比如你可以从一个简单的任务开始:用开源模型或者 Ollama 来搭建一个本地的问答机器人。此时,你将面临模型选择(各种大小从0.5B到230B的模型)、环境(Windows、Mac、Linux)的模型部署、RAG 检索增强、对话记忆管理、响应优化等多个模块,每一步都能对应学习一类技术。完成一个完整的端到端的 Demo,所收获的理解深度远比看十篇教程来得扎实。随着项目难度的提升,你可以逐步加入更多工程化的能力,如服务的日志监控、模型热更新、服务的负载均衡、API 的接口设计等,将本地的问答机器人从做出来变成做得稳。

当作为程序员的你对模型应用有一定了解之后,则建议逐步深入底层原理与机制。Transformer 架构是理解大模型的基石,掌握 Attention 机制如何运作,有助于理解模型为何具备强大的上下文理解能力。进一步,可以学习大模型的训练流程,包括预训练、指令微调(Instruction Tuning)、RLHF(基于人类反馈的强化学习)等,这些流程构成了大模型从“会说话”到“懂你在说什么”的核心路径。此外,近年来轻量化微调技术如 LoRA、QLoRA、P-Tuning 等方法也非常值得了解,它们极大降低了模型微调的成本,为个人开发者和中小企业提供了更多地使用大模型的可能性。

在掌握理论和微调技术的基础上,工业部署能力将成为你的核心竞争力之一。大模型的推理开销巨大,因此推理优化至关重要。学习量化、剪枝等优化手段,可以帮助你在不牺牲太多效果的前提下,大幅提升推理效率。同时,vLLMTritonDeepSpeed 等微调和部署工具,能帮助你将大模型高效运行于生产环境。当前已经有不少开源模型,如 DeepSeek、Qwen、Baichuan、Mistral、LAMMA 等,都提供了成熟的推理和部署方案,完全可以在本地尝试构建属于你自己的大模型应用。

随着模型能力的增强,仅仅调用模型已经不能满足复杂的业务场景需求。智能体(Agent)架构成为大模型进一步落地的关键。从调用外部工具、维护任务记忆,到执行多轮推理和状态管理,Agent 模型已经逐步走向工程实用层面。学习 AutoGPTCrewAILangGraph 等框架,将帮助你构建具备任务自主性和长期记忆的复杂智能系统。如果你对前沿感兴趣,也可以探索多模态大模型、长文本处理、Agent 协同等领域,这些都代表着下一阶段技术演进的方向。

对于有小模型研发经验的工程师来说,大模型并不是从零开始的挑战。你原有的数据处理能力、模型评估习惯、工程部署经验,依然在大模型系统中非常有价值。唯一需要转变的,是工程思维的广度和系统设计的复杂度。在大模型时代,更多的是系统级 AI 架构思维,而不仅是模型本身的精调。与此同时,大模型也能反过来助力你的日常开发,从代码生成到接口设计、测试覆盖,模型本身可以成为你高效工作的伙伴。

在这样一个飞速演化的领域中,持续学习显得尤为重要。建议建立一套“输入—实践—输出”的闭环机制:通过订阅高质量技术博客、关注 arXiv 的热门论文和 GitHub 热门项目持续输入,结合业务的实战来做一个实用的小项目或复现案例进行实践,再将实践成果通过博客、文档或开源项目进行输出,这样的闭环能帮助你不断沉淀、持续提升。同时,当前大模型领域更新极快,如果只靠碎片学习(刷一两篇公众号、调试一两个脚本)是很难形成系统认知的。没有实践,就没有深度;没有输出,就没有沉淀。应当通过读论文、复现项目、搭建 Demo、写总结、录视频等方式,形成正向成长闭环,这样才能在快速变动的环境中稳定前进。

从小模型到大模型,是一次从点状技术向整体系统能力的跃迁。虽然学习曲线稍微有点陡峭,但对于有算法经验的你来说,这更是一次站在更高起点的技术升级机会。在 AI 的这次浪潮中,可以选择一个你感兴趣的方向,从实战切入并不断迭代,很快你就会在这场 AI 变革浪潮中找到属于自己的位置。

LlamaIndex:如何在大模型领域构建自己的知识库

LlamaIndex入门

LlamaIndex简介

LlamaIndex(原名 GPT Index)是一个开源的 Python 库,其擅长简化大规模文本数据的索引、存储和查询操作。它将语言模型与文本数据的高效索引结合起来,使得开发者可以轻松地为复杂的文本信息检索和问答任务构建解决方案。通过构建倒排索引或向量索引,LlamaIndex 可以处理大量的文档,并为每个查询提供上下文感知的答案,显著提高了大规模数据的查询效率和准确性。它特别适用于法律、医学、科研、公司内部知识库等领域中需要处理和分析大量文本数据的场景。

LlamaIndex 不仅支持多种数据源,如文本文件、网页和数据库,还能够与先进的向量数据库(如 Milvus或者Pinecone)进行集成,进一步提升查询速度和准确度。通过与大语言模型(如 Ollama、DeepSeek等开源模型或者GPT的API等)结合使用,LlamaIndex能够在复杂的问答系统、自动摘要、个性化推荐等应用中提供强大的文本理解和推理能力。无论是建立企业内部的知识库,还是创建智能客服系统,LlamaIndex 都能有效地处理大量文档,并提供实时、精准的查询结果。

LlamaIndex的安装

LlamaIndex可以通过pip进行安装,其命令是

pip install llama-index

还可以通过源代码进行安装,首先用git clone 代码

git clone https://github.com/jerryjliu/llama_index.git

然后执行:pip install -e . 或者 pip install -r requirements.txt 就可以安装成功。

LlamaIndex的使用

在docs这个文件夹中放入team_structure.txt这个文件,该文件的内容如下所示:

B公司人力资源部(HR)负责公司的招聘、培训、员工关系管理、绩效考核等职能。人力资源部的组织架构分为三个主要小组:招聘组、培训组和员工关系组。
招聘组负责公司各类职位的招聘,筛选候选人,组织面试并安排入职培训。招聘组目前有5名成员,主要负责技术岗位和管理岗位的招聘。
培训组负责公司内部员工的职业发展培训,组织新员工培训、领导力培训和技能提升课程。培训组目前有3名成员,分别负责技术培训、软技能培训和高管培训。
员工关系组负责员工关系的维护,解决员工与公司之间的各类问题,组织公司文化活动,提升员工满意度。员工关系组目前有4名成员。
人力资源部总监为李晓红,负责整体管理,向公司CEO汇报。每月与各小组负责人召开一次会议,评估部门目标和完成情况。
招聘组负责所有岗位的招聘,包括技术岗位、市场岗位、财务岗位等。技术岗位的招聘由王刚负责,市场岗位招聘由张婷负责,财务岗位招聘由刘峰负责。
培训组目前在进行年度员工培训计划,2025年的重点是提升员工的领导力和跨部门协作能力。
员工关系组正在策划一项关于员工福利的提升项目,预计将在2025年初开始实施。

于是,一个简单的搜索功能可以用以下代码来实现,只输出Top2相似的结果。

代码说明:

  1. 文档加载:代码使用 SimpleDirectoryReader 从指定的文件夹(例如 docs)中加载文本文件。这些文本文件可以是任何格式的文本文件(如 .txt)。SimpleDirectoryReader 会自动扫描指定文件夹中的所有文件并加载其内容。
  2. 创建索引:使用 VectorStoreIndex.from_documents(documents) 将加载的文档转化为向量索引。我们还在构造索引时应用了 SentenceSplitter,用于将文档拆分成小块以便更高效的处理。
  3. 查询引擎通过 index.as_query_engine() 创建一个查询引擎,可以在该引擎上执行查询并返回最相关的文档或文本块。
  4. 查询执行:代码通过 query_engine.query(query) 执行用户的查询,并返回与查询最相关的结果。在这个例子中,查询的是 “B公司人力资源部的组织架构是怎样的?”
  5. 输出:最后,代码会打印检索结果。
import logging
import sys
from llama_index.core import PromptTemplate, Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# Step 1 设置日志
# 设置日志记录的最小级别为 WARNING,避免输出 DEBUG 和 INFO 信息
logging.basicConfig(stream=sys.stdout, level=logging.WARNING)  # 只输出 WARNING 及以上级别的日志

# 如果你只想屏蔽来自 llama_index 的日志,也可以使用下面的代码来禁用它
logging.getLogger("llama_index").setLevel(logging.WARNING)  # 设置 llama_index 的日志级别为 WARNING

# Step 2 配置 LlamaIndex 使用本地的嵌入模型(可选)
Settings.llm = None
Settings.embed_model = HuggingFaceEmbedding(
    model_name="/Users/avilazhang/PycharmProjects/models/BAAI/bge-large-zh-v1.5"  # 使用 BGE 中文嵌入模型
)

# Step 3 定义文档路径,假设文档存储在名为 "docs" 的文件夹中
docs_directory = 'docs'

# Step 4 读取文档并构建索引
# 使用 SimpleDirectoryReader 读取文件夹中的所有文本文件
documents = SimpleDirectoryReader(docs_directory).load_data()  # 读取 docs 文件夹中的所有 txt 文件
index = VectorStoreIndex.from_documents(documents, transformations=[SentenceSplitter(chunk_size=256)])

# Step 5 存储向量索引
index.storage_context.persist(persist_dir='doc_emb')  # 保存向量索引到本地目录

# Step 6 构建查询引擎,搜索TopK。
query_engine = index.as_query_engine(similarity_top_k=2)

# Step 7 模拟用户查询并执行检索
query = "B公司招聘组负责什么内容?"
response = query_engine.query(query)

# Step 8 打印检索结果
print("检索结果:", response)

检索的结果如下图所示,只有两个文档信息,因为TopK的值等于2。

除此之外,LlamaIndex还支持在现有索引的基础上读取索引,并且新增索引。

RAG

RAG的整体流程

一个标准的RAG整体流程如下所示,可以从数据库、文档、API中获取数据并形成Index,然后query提问的时候可以通过Index获得相应的数据(relevant data),再把prompt、query和relevant data输入大模型,即可得到优化后的回答(response)。

所以,RAG的主要阶段就包括载入、索引、存储、提问、评估。

Embedding模型

llama_index同样可以存储index,并且llama_index可以读取数据库、pdf、txt等类型文档。可以使用嵌入模型来做数据的嵌入工作,并且计算其数据之间的相似度。

from sentence_transformers import SentenceTransformer

# 模型的本地地址,可以使用以下命令来进行下载到本地的某个地址
# modelscope download --model BAAI/bge-large-zh-v1.5 --local_dir /Users/avilazhang/PycharmProjects/models/BAAI/bge-large-zh-v1.5
# 嵌入模型
embedding_models = '/Users/avilazhang/PycharmProjects/models/BAAI/bge-large-zh-v1.5'

# 方法一:
sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]
model = SentenceTransformer(embedding_models)
embeddings_1 = model.encode(sentences_1, normalize_embeddings=True)
embeddings_2 = model.encode(sentences_2, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)
# [[0.8553333  0.8520634 ]
#  [0.87456274 0.8557937 ]]
 
 
# 方法二:
queries = ['query_1', 'query_2']
passages = ["样例文档-1", "样例文档-2"]
instruction = "为这个句子生成表示以用于检索相关文章:"

model = SentenceTransformer(embedding_models)
q_embeddings = model.encode([instruction+q for q in queries], normalize_embeddings=True)
p_embeddings = model.encode(passages, normalize_embeddings=True)
scores = q_embeddings @ p_embeddings.T
print(scores)
# [[0.3372506  0.20507795]
#  [0.22591084 0.38495794]]

LlamaIndex与Ollama

用LlamaIndex和Ollama可以构建模型的RAG的知识库并输出:

import logging
import sys
from llama_index.core import PromptTemplate, Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
import ollama
from llama_index.core import Document

# Step 1️⃣ 设置日志
# 设置日志记录的最小级别为 WARNING,避免输出 DEBUG 和 INFO 信息
logging.basicConfig(stream=sys.stdout, level=logging.WARNING)  # 只输出 WARNING 及以上级别的日志

# 如果你只想屏蔽来自 llama_index 的日志,也可以使用下面的代码来禁用它
logging.getLogger("llama_index").setLevel(logging.WARNING)  # 设置 llama_index 的日志级别为 WARNING


# Step 2️⃣ 定义 system prompt
SYSTEM_PROMPT = """You are a helpful AI assistant."""
query_wrapper_prompt = PromptTemplate(
    "[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

# Step 4️⃣ 配置 LlamaIndex 使用 BAAI/bge-base-zh-v1.5 作为嵌入模型
Settings.llm = None
Settings.embed_model = HuggingFaceEmbedding(
    model_name="/Users/avilazhang/PycharmProjects/models/BAAI/bge-large-zh-v1.5"  # 使用 BGE 中文嵌入模型
)

# Step 5️⃣ 定义 B公司人力资源部的组织架构及业务分工文档
docs = [
    "B公司人力资源部(HR)负责公司的招聘、培训、员工关系管理、绩效考核等职能。人力资源部的组织架构分为三个主要小组:招聘组、培训组和员工关系组。",
    "招聘组负责公司各类职位的招聘,筛选候选人,组织面试并安排入职培训。招聘组目前有5名成员,主要负责技术岗位和管理岗位的招聘。",
    "培训组负责公司内部员工的职业发展培训,组织新员工培训、领导力培训和技能提升课程。培训组目前有3名成员,分别负责技术培训、软技能培训和高管培训。",
    "员工关系组负责员工关系的维护,解决员工与公司之间的各类问题,组织公司文化活动,提升员工满意度。员工关系组目前有4名成员。",
    "人力资源部总监为李晓红,负责整体管理,向公司CEO汇报。每月与各小组负责人召开一次会议,评估部门目标和完成情况。",
    "招聘组负责所有岗位的招聘,包括技术岗位、市场岗位、财务岗位等。技术岗位的招聘由王刚负责,市场岗位招聘由张婷负责,财务岗位招聘由刘峰负责。",
    "培训组目前在进行年度员工培训计划,2025年的重点是提升员工的领导力和跨部门协作能力。",
    "员工关系组正在策划一项关于员工福利的提升项目,预计将在2025年初开始实施。"
]

# Step 6️⃣ 读取文档并构建索引
documents = [Document(text=doc) for doc in docs]  # 将文档转化为 LlamaIndex 的文档对象
index = VectorStoreIndex.from_documents(documents, transformations=[SentenceSplitter(chunk_size=256)])

# Step 7️⃣ 存储向量索引
index.storage_context.persist(persist_dir='doc_emb')  # 保存向量索引到本地目录

# Step 8️⃣ 构建查询引擎,搜索TopK。
query_engine = index.as_query_engine(similarity_top_k=5)

# Step 9️⃣ 模拟用户查询并执行检索
query = "B公司人力资源部的组织架构是怎样的?"
response = query_engine.query(query)

# Step 10️⃣ 打印检索结果
print("检索结果:", response)

# Step 11️⃣ 构造 Ollama 生成答案的 Prompt
prompt = f"""
请根据以下背景知识回答用户的问题:

【背景知识】
{response}

【问题】
{query}

【回答】
"""

# Step 12️⃣ 使用 Ollama DeepSeek-R1:32b 模型生成答案
print("🤖 正在生成回答...\n")

# 使用 Ollama 调用 DeepSeek-R1:32b 模型进行流式输出
stream = ollama.chat(
    model="deepseek-r1:32b",
    messages=[{"role": "user", "content": prompt}],
    stream=True
)

# Step 13️⃣ 流式输出结果
response_buffer = ""
for chunk in stream:
    delta = chunk.get("message", {}).get("content", "")
    print(delta, end="", flush=True)  # 实时输出
    response_buffer += delta

# Step 14️⃣ # 能流式输出最终生成的答案
print("\n\n生成的答案:", response_buffer)

用多条数据查询之后得到以下结论:

查询回答(来自 RAG + LLM)结论
B公司人力资源部的组织架构是怎样的?B公司的人力资源部负责公司的招聘、培训、员工关系管理以及绩效考核等职能。该部门的组织架构分为三个主要小组:招聘组、培训组和员工关系组。 1. 招聘组: 负责公司各类职位的招聘,包括技术岗位、市场岗位、财务岗位等。 招聘组目前有5名成员,分别由王刚负责技术岗位招聘,张婷负责市场岗位招聘,刘峰负责财务岗位招聘。 2. 培训组: 负责入职培训及其他类型的员工培训,提升员工的技能和工作表现。虽然背景信息中未详细说明该组的具体情况,但可以推断其在培养员工能力方面起着关键作用。 3. 员工关系组: 负责维护员工与公司之间的关系,解决各类问题,组织公司文化活动以提升员工满意度。 该组目前有4名成员,致力于促进积极的职场环境和增强团队凝聚力。 人力资源部的整体管理由总监李晓红负责,她定期召开会议评估部门目标的完成情况,并向公司CEO汇报。这种层级分明、分工明确的组织架构确保了人力资源各项职能的有效执行。 正确
B公司人力资源部2025年有哪些任务? B公司人力资源部在2025年的任务包括: 1. 年度员工培训计划:重点是提升员工的领导力和跨部门协作能力。这是由培训组负责的任务。 2. 员工福利提升项目:员工关系组正在策划并预计将在2025年初开始实施这一项目。 此外,虽然招聘组负责公司各类职位的招聘工作,但并未提到具体的2025年任务目标。人力资源部总监李晓红每月与各小组负责人召开会议,评估部门目标和完成情况,这也是其常规职责的一部分,但未特别指出为2025年的具体任务。 正确 
B公司人力资源部的招聘工作有哪些人在负责?我需要找到他们。 B公司人力资源部的招聘工作由以下人员负责: 1. 王刚 – 负责技术岗位招聘 2. 张婷 – 负责市场岗位招聘 3. 刘峰 – 负责财务岗位招聘  这三位人员分别负责各自领域的招聘工作,如果您需要联系他们,可以按照上述信息进行。正确
什么是生物学?根据提供的背景信息,未提及“生物学”的相关内容。如需了解生物学的定义,请参考可靠的科学资源或教科书。不太好,需要修改Prompt
网络监控是什么?网络监控是指通过各种技术和工具持续监测计算机网络的状态和活动,以便及时发现并解决潜在的安全威胁、性能问题或异常行为。其主要目的是确保网络安全、优化网络性能、预防未经授权的访问,并在出现问题时快速响应。 网络监控通常包括以下方面:1. 流量分析:监控数据流量以检测异常模式或潜在攻击。2. 入侵检测和防御:使用防火墙、入侵检测系统(IDS)等工具防止未经授权的访问。3. 性能管理:优化网络资源分配,确保服务质量和高可用性。4. 日志记录与分析:跟踪网络活动,便于审计和故障排查。 这些措施帮助企业保护敏感数据,维护业务连续性和客户信任。正确
请介绍下数学分析有哪些内容?根据提供的背景信息,数学分析的具体内容并未被提及。背景信息主要涉及公司人力资源部的组织结构和职责,包括招聘组、培训组和员工关系组的工作内容。如果您有关于数学分析的具体问题或需要其他帮助,请提供更多相关信息,我会尽力为您解答。不太好,需要修改Prompt

参考资料

  1. LlamaIndex:https://docs.llamaindex.ai/en/stable/
  2. GitHub链接:https://github.com/run-llama/llama_index
  3. 魔搭社区的嵌入模型:https://www.modelscope.cn/models/BAAI/bge-large-zh-v1.5/summary
  4. LlamaIndex中文文档:LlamaIndex 🦙 0.6.18
  5. Pinecore文档工具:Pinecone Database – Pinecone Docs

Milvus:高性能的向量数据库

Milvus简介

Milvus背景

在人工智能与大模型迅速发展的当下,向量数据库作为支撑语义搜索、图像识别、多模态理解等关键应用的底层基础设施,正扮演着越来越重要的角色。Milvus,作为当前最主流的开源向量数据库之一,专为处理大规模、高维向量的相似性检索而设计,具备高性能、高可扩展性和丰富的索引支持。无论是构建基于文本 embedding 的知识问答系统,还是处理亿级图像的相似性匹配任务,Milvus 都能以其强大的索引能力和灵活的接口,成为 AI 应用中的“记忆引擎”。它的出现,不仅填补了传统数据库在向量检索领域的空白,也为构建下一代智能应用提供了坚实的技术基石。

Milvus特点

Milvus支持的场景包括检索增强生成(RAG)、图像搜索、多模态搜索、混合搜索、GraphRAG等方向。非结构化数据(如文本、图像和音频)格式各异,蕴含丰富的潜在语义,因此分析起来极具挑战性。为了处理这种复杂性,Embeddings被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。在这个背景下,Milvus提供强大的数据建模功能,使用户能够将非结构化或多模式数据组织成结构化的Collections。它支持多种数据类型,适用于不同的属性模型,包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON,为您节省了维护多个数据库系统的精力。

Milvus 提供三种部署模式,涵盖各种数据规模–从 Jupyter Notebooks 中的本地原型到管理数百亿向量的大规模 Kubernetes 集群:

  1. Milvus Lite是一个 Python 库,可以轻松集成到您的应用程序中。作为 Milvus 的轻量级版本,它非常适合在 Jupyter Notebooks 中进行快速原型开发,或在资源有限的边缘设备上运行。对于新人学习而言,可以直接使用Milvus的Lite版本,轻松集成并使用。
  2. Milvus Standalone是单机服务器部署,所有组件都捆绑在一个 Docker 镜像中,方便部署。
  3. Milvus Distributed可部署在Kubernetes集群上,采用云原生架构,专为十亿规模甚至更大的场景而设计。该架构可确保关键组件的冗余。
Milvus的特点详细解释
向量搜索支持亿级向量的ANN(近似最近邻)TopK检索
混合搜索基于多个向量场进行 ANN 搜索。
范围搜索查找查询向量指定半径范围内的向量。
全文搜索基于 BM25 的全文搜索。
重排序(Rerankers)根据附加标准或辅助算法调整搜索结果顺序,完善初始 ANN 搜索结果。
获取根据主键检索数据。
查询使用特定的表达式检索数据。
多模型支持支持不同维度的向量(text/image embedding)
存储引擎支持多种存储后端(如本地磁盘、S3、MinIO)
横向扩展分布式架构,支持大规模扩容
高效搜索算法Milvus支持多种内存和磁盘索引/搜索算法,包括 IVF、HNSW、DiskANN 等
插件生态与Faiss、HNSW、ANN等索引算法对接
访问接口支持RESTful API、SDK(Python/Go/Java/Nodejs)/C#(微软提供)/gRPC API
向量管理支持批量导入、删除、版本管理等操作

Milvus的云原生和高度解耦的系统架构确保了系统可以随着数据的增长而不断扩展。可以借助 Kubernetes 或公共云轻松扩展。此外,Milvus 的各个组件都有很好的解耦,其中最关键的三项任务–搜索、数据插入和索引/压实–被设计为易于并行化的流程,复杂的逻辑被分离出来。这确保了相应的查询节点、数据节点和索引节点可以独立地向上和向下扩展,从而优化了性能和成本效率。

Milvus 高度解耦的系统架构

Milvus与AI的集成路径

Milvus与AI的结合方式主要集中在Embedding(嵌入)、Rerank(重排序)、RAG(检索增强生成)这三个方向上。

  1. Embeddings 模型集成:Embedding 模型将非结构化数据转换为其在高维数据空间中的数字表示,以便您能将其存储在 Milvus 中。目前,PyMilvus(Python SDK)集成了多个嵌入模型,以便您能快速将数据准备成向量嵌入。
  2. Reranker 模型集成:在信息检索和生成式人工智能领域,Reranker 是优化初始搜索结果顺序的重要工具。PyMilvus 也集成了几种 Rerankers 模型,以优化初始搜索返回结果的顺序。
  3. LangChain和其他人工智能工具集成:在 GenAI 时代,LangChain 等工具受到了应用程序开发人员的广泛关注。作为核心组件,Milvus 通常在此类工具中充当向量存储。

Milvus使用

Milvus的安装

开始之前,请确保本地环境中有Python 3.8+可用。安装pymilvus,其中包含 python 客户端库和 Milvus Lite。同时还可以把Milvus的model模型都安装上。

pip install -U pymilvus
pip install "pymilvus[model]"

安装好了之后可以通过pip list看到下面两个package安装成功。

如果有torch安装错误的提示,可以使用命令重新安装

conda install pytorch::pytorch torchvision torchaudio -c pytorch

并且可以使用代码来判断pytorch是否安装正常:

import torch
print(torch.__version__)
# 2.5.1

Milvus的数据库

在 Milvus 中,数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户,你可以创建多个数据库,为不同的应用程序或租户从逻辑上隔离数据。例如,创建一个数据库用于存储用户 A 的数据,另一个数据库用于存储用户 B 的数据。它支持Python、Go、Java、NodeJS等语言去操作数据库。

可以使用 Milvus RESTful API 或 SDK 列出所有现有数据库并查看其详细信息。同时,还可以管理数据库的属性,包括更改、删除等操作。

Milvus 数据库中,collection 和 schema 是用于组织和管理数据的两个核心概念,主要用于处理和存储高维向量数据。

Collection

在 Milvus 中,collection 是一个数据的集合,可以理解为一个数据库表格的概念,用来存储和管理向量数据及相关的元数据。它的作用是:

  1. 一个 collection 由多个向量数据(如图像、文本等的向量表示)构成;
  2. 每个 collection 可以包含多个字段(例如,ID、向量、标签等)。
  3. 你可以创建、插入、查询、删除和更新集合中的数据。

Collection 是一个二维表,具有固定的列和变化的行。每列代表一个字段,每行代表一个实体。下图显示了一个有 8 列和 6 个实体的 Collection。

通常在创建集合时,需要定义向量的维度(比如 128 维、256 维等)以及其他属性(如数据类型)。例如:

from pymilvus import Collection

# 创建一个名为 "example_collection" 的集合
collection = Collection("example_collection")

Schema

schema 是定义一个 collection 中各个字段的结构和数据类型的描述。它类似于传统数据库中的表结构(如字段名和数据类型)。它的作用是:

  1. schema 确定了 collection 中各个字段的数据类型(例如整数、浮动小数、向量等),以及这些字段是否为可查询的或索引字段。
  2. 对于向量数据,schema 还定义了向量字段的维度和索引方式。向量字段(如 embedding 或 vector)是存储向量数据的核心字段。其他常规字段(如整型、浮动小数、字符串等),用于存储与向量相关的附加信息(例如文本、标签等)。

例子:

from pymilvus import MilvusClient, DataType, Collection

# Step 1️⃣ 创建 Milvus 客户端并初始化 Collection
# MilvusClient 是与 Milvus 服务进行交互的客户端,连接到指定的数据库。
client = MilvusClient("milvus_rag_zh_demo_2.db")  # 假设使用一个本地数据库文件作为存储

# COLLECTION_NAME 是我们想要操作的集合名
COLLECTION_NAME = "zh_rag_demo_2"

# Step 2️⃣ 删除已有的 Collection(如果存在)
# 如果该集合已经存在,我们删除旧的集合以重新创建
if client.has_collection(COLLECTION_NAME):
    print(f"Collection '{COLLECTION_NAME}' already exists. Dropping it.")
    client.drop_collection(COLLECTION_NAME)  # 删除集合

# Step 3️⃣ 定义 Collection 的 Schema
# Collection Schema 用于定义集合中的字段,包括数据类型、维度等。
schema = MilvusClient.create_schema(
    auto_id=False,  # 不自动生成 ID(我们手动指定 ID)
    enable_dynamic_field=True,  # 启用动态字段支持
)

# Step 4️⃣ 添加字段到 Schema
# 每个字段需要指定字段名称、数据类型,以及其他一些属性(如是否是主键)
schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)  # 主键字段
schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)  # 向量字段,维度为5
schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)  # 字符串字段,最大长度为512

Milvus Lite 目前仅支持 Ubuntu 和 MacOS 操作系统。如果在 Windows 系统上运行上述代码,将会遇到此错误。另外,使用Milvus的时候,要确保Milvus已经在本地或者远程服务器运行,否则会报错。Milvus的启动和运行建议使用Docker的方式执行。

一个 Collections Schema 有一个主键、最多四个向量字段和几个标量字段。下图说明了如何将文章映射到模式字段列表。

搜索系统的数据模型设计包括分析业务需求,并将信息抽象为模式表达的数据模型。例如,搜索一段文本必须 “索引”,通过 “嵌入 “将字面字符串转换为向量,并启用向量搜索。除了这一基本要求外,可能还需要存储出版时间戳和作者等其他属性。有了这些元数据,就可以通过过滤来完善语义搜索,只返回特定日期之后或特定作者发表的文本。您还可以检索这些标量与主文本,以便在应用程序中呈现搜索结果。每个标量都应分配一个唯一标识符,以整数或字符串的形式组织这些文本片段。这些元素对于实现复杂的搜索逻辑至关重要。

Milvus与Embedding

在当今的信息检索和智能问答系统中,Embedding(向量表示)技术成为了连接自然语言与高效计算的桥梁。通过将文本、图像等非结构化数据转化为高维向量,我们可以实现更精确的语义匹配和内容理解。而Milvus作为一款开源的向量数据库,专为此类场景而生。它支持大规模向量的高效存储与相似度检索,为构建智能搜索引擎、推荐系统及 AI 应用提供了强大的基础设施。下面将结合实际案例,介绍如何利用 Embedding 技术与 Milvus 搭建一套完整的语义检索流程。

于是,在pymilvus中可以引入embedding的模型工具,用于未来的向量输出和检索:

# 从 pymilvus 中引入用于 embedding 的模型工具
from pymilvus import model

# 如果访问 huggingface 官方地址失败(如网络受限),可以取消下面的注释
# 设置环境变量,切换为 huggingface 镜像地址(例如清华、阿里等镜像)
# import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 初始化一个默认的 embedding 函数,会自动下载一个小型的句子向量模型:
# paraphrase-albert-small-v2(约 50MB),适合快速测试或演示用途。
embedding_fn = model.DefaultEmbeddingFunction()

# 定义待向量化的文本列表,每条文本都是一个独立的文档或知识片段。
docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

# 使用 embedding 函数将文本转化为向量(embedding)
# 得到的结果是一个 list,每条向量为一个 numpy 数组,维度为 768
vectors = embedding_fn.encode_documents(docs)

# 输出向量
print("vectors:", vectors)

# 输出向量维度信息(用于对齐 Milvus 中 Collection 的字段设计)
# embedding_fn.dim 表示当前模型生成的向量维度
# vectors[0].shape 表示第一条向量的维度
print("Dim:", embedding_fn.dim, vectors[0].shape)  # 预期输出 Dim: 768 (768,)

# 组织向量数据为结构化的格式,准备后续插入 Milvus:
# 每条记录包含:
# - id:唯一编号
# - vector:生成的 embedding 向量
# - text:原始文本内容(可用于展示/检索返回)
# - subject:人为指定的分类标签(这里用作 metadata 过滤的演示)
data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    for i in range(len(vectors))
]

# 打印生成数据的基本信息:
# - 实体数量
# - 每条记录包含哪些字段
# - 向量维度是多少
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))

除此之外,在模型选择方面,还可以选择 Sentence Transformers、BGE M3、SPLADE、instructor、nomic、mGTE、Model2Vec,另外OpenAI、gemini、Voyage、Jina AI、Cohere、Ministral AI的模型需要相应的API-KEY才能使用。

嵌入函数类型API 或开源
openai密集API
sentence transformer密集开源
SPLADE稀疏开源
bge-m3混合开源
远航密集型应用程序接口
jina密集API
cohere密集API
指导员密集开源
Mistral AI密集应用程序接口
Nomic密集API
mGTE混合型开源
Model2Vec混合型开源
双子座混合型私有

可以参考代码进行修改,在model这个部分进行修改即可:

# 从 pymilvus 中引入用于 embedding 的模型工具
from pymilvus import model

# 如果访问 huggingface 官方地址失败(如网络受限),可以取消下面的注释
# 设置环境变量,切换为 huggingface 镜像地址(例如清华、阿里等镜像)
# import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 初始化一个默认的 embedding 函数,会自动下载一个小型的句子向量模型:
# paraphrase-albert-small-v2(约 50MB),适合快速测试或演示用途。
# embedding_fn = model.DefaultEmbeddingFunction()

# sentence transformers 模型
embedding_fn = model.dense.SentenceTransformerEmbeddingFunction(
    model_name='all-MiniLM-L6-v2',  # Specify the model name
    device='cpu'  # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)

# # BGE M3 模型
# embedding_fn = model.hybrid.BGEM3EmbeddingFunction(
#     model_name='BAAI/bge-m3',  # Specify the model name
#     device='cpu',  # Specify the device to use, e.g., 'cpu' or 'cuda:0'
#     use_fp16=False  # Specify whether to use fp16. Set to `False` if `device` is `cpu`.
# )

# # splade 模型
# embedding_fn = model.sparse.SpladeEmbeddingFunction(
#     model_name="naver/splade-cocondenser-selfdistil",
#     device="cpu"
# )

# 定义待向量化的文本列表,每条文本都是一个独立的文档或知识片段。
docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

# 使用 embedding 函数将文本转化为向量(embedding)
# 得到的结果是一个 list,每条向量为一个 numpy 数组,维度为 768
vectors = embedding_fn.encode_documents(docs)

# 输出向量
print("vectors:", vectors)

# 输出向量维度信息(用于对齐 Milvus 中 Collection 的字段设计)
# embedding_fn.dim 表示当前模型生成的向量维度
# vectors[0].shape 表示第一条向量的维度
print("Dim:", embedding_fn.dim, vectors[0].shape)  # 预期输出 Dim: 768 (768,)

# 组织向量数据为结构化的格式,准备后续插入 Milvus:
# 每条记录包含:
# - id:唯一编号
# - vector:生成的 embedding 向量
# - text:原始文本内容(可用于展示/检索返回)
# - subject:人为指定的分类标签(这里用作 metadata 过滤的演示)
data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    for i in range(len(vectors))
]

# 打印生成数据的基本信息:
# - 实体数量
# - 每条记录包含哪些字段
# - 向量维度是多少
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))

下面代码的整体流程是:连接 Milvus 客户端并创建集合,初始化一个嵌入模型并将文本转化为向量,组织数据结构并插入到 Milvus,使用一个问题进行语义查询,获取最相似的文本内容。

# 引入必要的库:pymilvus 中的模型工具和客户端类
from pymilvus import model
from pymilvus import MilvusClient

# 初始化一个 Milvus 客户端,连接到本地或指定路径的数据库文件
client = MilvusClient("milvus_demo.db")

# 如果已存在名为 "demo_collection" 的集合,先删除(避免重复创建时报错)
if client.has_collection(collection_name="demo_collection"):
    client.drop_collection(collection_name="demo_collection")

# 创建一个新的集合(Collection),用于存储向量数据
# 参数说明:
# - collection_name:集合名称
# - dimension:向量的维度(本例使用的是 768 维)
client.create_collection(
    collection_name="demo_collection",
    dimension=768,
)

# ⚠️ 如果无法连接 huggingface 官方模型仓库(比如被墙),可以使用国内镜像站点:
# 设置 HF_ENDPOINT 环境变量来更改默认的 huggingface 地址,例如使用清华镜像:
# import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 初始化一个默认的 embedding 函数,会自动下载 paraphrase-albert-small-v2 模型
# 模型体积小,加载快,适合用于快速测试/演示
embedding_fn = model.DefaultEmbeddingFunction()

# (可选)你也可以使用更强的模型,例如 SentenceTransformer、BGE M3、Splade 等
# 下面是一些替代方案(按需取消注释):

# 使用 sentence-transformers 模型
# embedding_fn = model.dense.SentenceTransformerEmbeddingFunction(
#     model_name='all-MiniLM-L6-v2',
#     device='cpu'  # 或使用 'cuda:0' 来使用 GPU
# )

# 使用 BGE M3 多任务嵌入模型
# embedding_fn = model.hybrid.BGEM3EmbeddingFunction(
#     model_name='BAAI/bge-m3',
#     device='cpu',
#     use_fp16=False
# )

# 使用稀疏向量模型 Splade(适用于稀疏向量检索场景)
# embedding_fn = model.sparse.SpladeEmbeddingFunction(
#     model_name="naver/splade-cocondenser-selfdistil",
#     device="cpu"
# )

# 准备文本数据:这些将作为示例文档被嵌入为向量
docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

# 使用嵌入函数将文本转换为向量
# 返回值为一个列表,每个元素是一个 numpy 数组(维度为 768)
vectors = embedding_fn.encode_documents(docs)

# 打印生成的向量(可以注释掉以避免打印过多内容)
print("vectors:", vectors)

# 打印嵌入函数维度和实际向量维度(用于确认维度一致性)
print("Dim:", embedding_fn.dim, vectors[0].shape)

# 将向量数据组织为结构化格式,便于后续插入到 Milvus 中
# 每个字典代表一条记录,包括:
# - id:唯一编号
# - vector:对应的嵌入向量
# - text:原始文本
# - subject:可选分类标签(可用于后续过滤查询)
data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    for i in range(len(vectors))
]

# 打印数据结构信息:
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))

# 将数据插入到 Milvus 中的 demo_collection 集合
res = client.insert(collection_name="demo_collection", data=data)

# 打印插入结果(通常包含成功插入的数量等信息)
print("res:", res)

# 接下来执行向量搜索(即:语义检索)
# 使用同样的嵌入函数对查询语句进行编码,得到向量
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])

# ⚠️ 如果没有 embedding 函数,也可以使用随机向量模拟查询(仅限演示用)
# import random
# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]

# 在 demo_collection 中执行向量检索
res_search = client.search(
    collection_name="demo_collection",  # 检索目标集合
    data=query_vectors,  # 查询向量
    limit=2,  # 返回最相似的 2 条记录
    output_fields=["text", "subject"],  # 指定返回的字段(原始文本和标签)
)

# 打印检索结果(包括匹配文本和相似度等信息)
print("res_search:", res_search)

# 提取并打印搜索结果中的具体条目
print(list(res_search[0])[0])  # 第一个查询返回的第一条结果
print(list(res_search)[0][1])  # 第一个查询返回的第二条结果

同时,文件夹下会出现一个milvus_demo.db,用于保存向量数据。

如果画一个流程图的话,是按下面的流程来运行的。

由于Milvus Lite的所有数据都存储在本地文件中,因此即使在程序终止后,你也可以通过创建一个带有现有文件的MilvusClient ,将所有数据加载到内存中。例如,这将恢复 “milvus_demo.db “文件中的 Collections,并继续向其中写入数据。

from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")

如果想删除某个 Collections 中的所有数据,可以通过以下方法丢弃该Collections:

# Drop collection
client.drop_collection(collection_name="demo_collection")

Milvus与Rerankers

在现代语义检索系统中,检索流程通常被划分为两个阶段:初始召回(First-Stage Retrieval)与重排序(Re-ranking)。Milvus 作为一个开源、高性能的向量数据库,专为处理大规模高维向量检索任务而设计,广泛应用于初始召回阶段。其核心能力在于高效构建和查询向量索引(如 IVF、HNSW、DiskANN 等),支持近似最近邻(ANN)算法,以实现对查询向量在大规模语料中的快速相似度搜索。通过将文本、图像等非结构化数据嵌入为向量,Milvus 能够在亚秒级时间内返回与输入语义最接近的候选项,为后续精排阶段提供基础支撑。

而 Rerankers(重排序模型)主要作用于检索系统的第二阶段。它通常采用更精细的模型架构(如基于 Transformer 的 Cross-Encoder),以逐对方式对候选文本与查询进行交互式建模,从而输出更精准的相关性评分。尽管计算开销相较于向量检索更高,Rerankers 在精度上的提升对于提高系统整体性能具有关键意义。因此,将 Milvus 用于高效召回,再通过 Rerankers 对候选结果进行精细排序,已成为构建高质量语义检索系统的主流范式。

常见的Rerankers功能包括以下五种,有开源模型和应用程序接口。

Rerankers 功能应用程序接口或开源开源地址
BGE开源https://ollama.com/zyw0605688/bge-reranker-v2-m3
交叉编码器开源https://huggingface.co/cross-encoder/ms-marco-MiniLM-L6-v2
Voyage应用程序接口 
Cohere应用程序接口 
Jina AIAPI 

如果使用BGE的重排序模型来构建的话,可以使用以下代码的案例:

# 从 pymilvus.model.reranker 模块中引入 BGE 重排序模型函数
from pymilvus.model.reranker import BGERerankFunction

# ----------------------------------------------------------
# 初始化 Reranker(重排序器):
# 使用 BAAI(智源研究院)提供的 BGE-Reranker-v2-M3 模型。
# 该模型基于 Cross-Encoder 架构,通过对 query 和文档对进行语义交互建模,
# 输出相关性打分,用于对初始检索结果进行排序提升精度。
# ----------------------------------------------------------
bge_rf = BGERerankFunction(
    model_name="BAAI/bge-reranker-v2-m3",  # 模型名称,默认即为该模型
    device="cpu"  # 计算设备,可改为 'cuda:0' 使用 GPU 加速
)

# ----------------------------------------------------------
# 定义一个查询(query),用于检索历史相关信息。
# ----------------------------------------------------------
query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"

# ----------------------------------------------------------
# 定义候选文档列表(documents):
# 模拟从 Milvus 检索返回的初步候选文本片段(Top-K),
# 接下来将使用 Reranker 进一步对它们进行精排。
# 文档集合里面有四个元素,从0到3编号。
# ----------------------------------------------------------
documents = [
    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
]

# ----------------------------------------------------------
# 执行重排序操作:
# 将 query 与每个文档组合进行相关性评分,输出按分值降序排列的 Top-K 文档。
# top_k 参数指定只保留得分最高的前 K 条(这里设为 3)。
# 返回结果为一个包含 RerankResult 对象的列表,每个对象包含:
# - index:原文档在输入列表中的索引位置
# - score:query 与该文档的语义相关性打分(越高越相关)
# - text:文档原文内容
# ----------------------------------------------------------
results = bge_rf(
    query=query,
    documents=documents,
    top_k=3,  # 返回得分最高的前 3 条
)

# ----------------------------------------------------------
# 遍历输出精排结果:
# 展示每条候选文档的原始索引、得分(保留 6 位小数)、文本内容。
# 注意结果已按 score 排序,score 越高代表与 query 越匹配。
# ----------------------------------------------------------
for result in results:
    print(f"Index: {result.index}")  # 文本在原始 documents 中的位置
    print(f"Score: {result.score:.6f}")  # 重排序得分
    print(f"Text: {result.text}\n")  # 文本内容


如果将query和document修改成中文,同样可以找到结果。查询是:

query = "1956年标志着人工智能正式诞生的事件是什么?"

候选文档是:

documents = [
    "1950年,图灵发表了著名论文《计算机器与智能》,提出了图灵测试,这是人工智能哲学的重要基石。",
    "1956年达特茅斯会议被广泛认为是人工智能作为一个学科诞生的标志,在这次会议上,“人工智能”这一术语首次被提出,并确立了研究目标。",
    "1951年,英国数学家图灵开发了一个可以下棋的程序,展示了早期的人工智能应用。",
    "1955年,艾伦·纽厄尔与赫伯特·西蒙等人发明了“逻辑理论家”程序,这是第一个能够自动证明定理的人工智能系统。"
]

其搜索的结果是:

如果需要使用交叉编码器,那么可以参考HuggingFace上面的链接(https://huggingface.co/cross-encoder/ms-marco-MiniLM-L6-v2),输入以下代码即可计算两个文档之间的相似度。

from sentence_transformers import CrossEncoder

model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L6-v2')
scores = model.predict([
    ("How many people live in Berlin?", "Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers."),
    ("How many people live in Berlin?", "Berlin is well known for its museums."),
])
print(scores)

# [ 8.607141 -4.320079]

还可以用以下多种模型进行选择:

Model-NameNDCG@10 (TREC DL 19)MRR@10 (MS Marco Dev)Docs / Sec
Version 2 models   
cross-encoder/ms-marco-TinyBERT-L2-v269.8432.569000
cross-encoder/ms-marco-MiniLM-L2-v271.0134.854100
cross-encoder/ms-marco-MiniLM-L4-v273.0437.72500
cross-encoder/ms-marco-MiniLM-L6-v274.339.011800
cross-encoder/ms-marco-MiniLM-L12-v274.3139.02960
Version 1 models   
cross-encoder/ms-marco-TinyBERT-L267.4330.159000
cross-encoder/ms-marco-TinyBERT-L468.0934.52900
cross-encoder/ms-marco-TinyBERT-L669.5736.13680
cross-encoder/ms-marco-electra-base71.9936.41340
Other models   
nboost/pt-tinybert-msmarco63.6328.82900
nboost/pt-bert-base-uncased-msmarco70.9434.75340
nboost/pt-bert-large-msmarco73.3636.48100
Capreolus/electra-base-msmarco71.2336.89340
amberoad/bert-multilingual-passage-reranking-msmarco68.435.54330
sebastian-hofstaetter/distilbert-cat-margin_mse-T2-msmarco72.8237.88720

下面我们使用cross-encoder/ms-marco-MiniLM-L12-v2模型来进行相似度的计算:

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
from sentence_transformers import CrossEncoder

# 方法一:
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L12-v2')
scores = model.predict([
    ("How many people live in Berlin?", "Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers."),
    ("How many people live in Berlin?", "Berlin is well known for its museums."),
])
print(scores)

# 方法二:
model = AutoModelForSequenceClassification.from_pretrained('cross-encoder/ms-marco-MiniLM-L12-v2')
tokenizer = AutoTokenizer.from_pretrained('cross-encoder/ms-marco-MiniLM-L12-v2')

features = tokenizer(['How many people live in Berlin?', 'How many people live in Berlin?'], ['Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.', 'Berlin is well known for its museums.'],  padding=True, truncation=True, return_tensors="pt")

model.eval()
with torch.no_grad():
    scores = model(**features).logits
    print(scores)

如果要进行重排序的话,可以参考下面的文档:

# 从 pymilvus.model.reranker 模块中导入交叉编码器重排序函数
from pymilvus.model.reranker import CrossEncoderRerankFunction

# ✅ 步骤 1:定义交叉编码器(Cross Encoder)重排序函数
# 该函数内部会自动下载 Hugging Face 上的模型并用于 rerank
ce_rf = CrossEncoderRerankFunction(
    model_name="cross-encoder/ms-marco-MiniLM-L12-v2",  # 使用指定的 cross-encoder 模型(支持语义匹配任务)
    device="cpu"  # 指定模型运行设备,如 'cpu' 或 'cuda:0'(GPU)
)

# ✅ 步骤 2:定义用户查询(Query)
query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
# 中文翻译:1956年哪一事件标志着人工智能作为一门学科的正式诞生?

# ✅ 步骤 3:准备待重排序的候选文档(Documents)
# 每个字符串都是一个候选答案,Cross Encoder 会将它们与 Query 组合成一个个句对进行评分
documents = [
    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    # 图灵1950年的论文,提出图灵测试,为AI发展奠定哲学基础

    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    # 1956年达特茅斯会议,被广泛认为是AI的诞生标志

    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    # 图灵在1951年开发了下棋程序,展示早期AI在博弈中的应用

    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    # 1955年“逻辑理论家”程序是首个能解逻辑问题的AI程序
]

# ✅ 步骤 4:调用重排序函数进行语义匹配排序(Reranking)
# Cross Encoder 会对 (query, document) 成对输入进行语义评分,返回得分最高的 top_k 条
results = ce_rf(
    query=query,
    documents=documents,
    top_k=3,  # 返回得分最高的前 3 个文档
)

# ✅ 步骤 5:遍历结果,输出每条结果的索引、分数、文本内容
# Cross Encoder 输出的是基于语义匹配的相关性打分,越高越相关
for result in results:
    print(f"Index: {result.index}")       # 文档在原始列表中的索引
    print(f"Score: {result.score:.6f}")   # Cross Encoder 计算出的相关性得分
    print(f"Text: {result.text}\n")       # 对应的文档内容

Milvus与RAG

RAG简介

Retrieval-Augmented Generation(RAG)是一种结合了生成模型与外部知识库的问答与文本生成框架,它通过引入检索机制增强了语言模型的上下文感知能力与事实一致性。传统的预训练语言模型(如 GPT、BERT 等)虽然在多种自然语言任务中表现优异,但其生成内容完全依赖于固定参数中的知识,难以动态更新、覆盖长尾信息或应对实时变化。RAG 模型通过“检索-生成”的两阶段流程克服了这一局限:首先基于输入查询从外部文档库中检索相关文本段落(通常以嵌入向量为索引),然后将检索结果与原始查询共同输入生成模型,从而生成更丰富、准确且可溯源的回答。

Milvus 作为一款专注于向量检索的高性能数据库,在 RAG 框架中扮演着关键的知识检索组件。它能够高效地存储和检索大规模嵌入文档,利用近似最近邻(ANN)算法快速定位与查询语义最接近的上下文。通过将文本数据嵌入为高维向量并存入 Milvus,RAG 系统可以在每次生成任务中实时访问结构化外部知识,从而动态增强语言模型的生成能力。

RAG 与 Milvus 的集成,使得模型生成不仅更具上下文相关性,同时具有良好的可扩展性与知识更新能力。该组合为构建高质量的问答系统、智能客服、科研助手等提供了坚实的技术基础,并代表了当前生成式 AI 系统从封闭式向开放式知识访问的演进方向。

一个简单的模式就是如下图所示的案例:

Retrieval-Augmented Generation(RAG)框架通过将外部知识检索与语言模型的生成能力结合,有效增强了模型的事实一致性与动态更新能力。本文所采用的 RAG 系统主要包括三个核心阶段:文档嵌入与索引构建、在线查询与检索生成、以及可选的重排序增强。

一、文档嵌入与索引构建

首先,系统从原始知识库中收集结构化或非结构化的文档内容。通过分段与预处理操作,每个文档被切分为若干语义清晰的片段。这些片段随后输入至预训练的文本嵌入模型(如 Sentence Transfomers、BGE M3、Instructor、Model2Vec等),将文本转化为固定维度的语义向量。所有向量及其对应的文本片段被统一存储于向量数据库 Milvus 中。Milvus 支持高效的向量索引构建(如 HNSW、ANN、DiskANN 等),为大规模语义检索提供底层支撑。

二、在线检索与生成

当用户提交自然语言查询后,系统首先将查询文本通过同样的嵌入模型转化为查询向量。随后,该向量被用于在 Milvus 中进行近似最近邻检索,系统返回与查询语义最接近的 Top-K 文本片段。此阶段主要实现高召回率的候选过滤,是整个生成流程的语义支撑部分。

三、重排序与上下文拼接(可选增强)

为进一步提升检索结果的相关性,系统可引入 Reranker 模块对 Milvus 返回的候选片段进行重排序。Reranker 通常采用基于 Transformer 的 Cross-Encoder 架构逐对计算候选段与查询之间的交互得分,以获得更高精度的排序结果。或者BGE的Reranker模型来获取排序结果。排序后的文本被选取若干条,并与原始用户查询共同拼接为生成模型的输入上下文。

四、语言模型生成回答

最终,上下文与用户查询被输入至大型语言模型(如GPT、LLaMA、ChatGLM、DeepSeek等),模型基于输入内容生成语言自然、语义准确、并融合外部知识的响应文本。该流程实现了生成式AI系统与结构化外部知识库之间的协同融合,兼具生成能力与知识可控性。

RAG与Milvus的示例

用Milvus以及相应的embedding和rerankers可以获得相应知识库的问答功能。现在给一个demo示例,假设我们有一个公司A的组织架构和部门内容介绍(纯属虚构,如有雷同,纯属巧合),我们将其放入知识库中,形成一个docs的文档数据,然后把这些数据放入Milvus的数据库中,再通过Client去检索和重排,得到数据context_text之后将其作为背景知识放入输入的数据prompt中,最后用Ollama的流式输出得到结果。

from pymilvus import MilvusClient
from pymilvus import model
from pymilvus.model.reranker import CrossEncoderRerankFunction
from sentence_transformers import SentenceTransformer
import ollama
import time

# Step 1️⃣ 创建 Milvus 客户端并初始化 Collection
client = MilvusClient("milvus_rag_zh.db")
COLLECTION_NAME = "zh_rag_demo"

# 若已存在,删除原 Collection
if client.has_collection(COLLECTION_NAME):
    client.drop_collection(COLLECTION_NAME)

# 创建新的向量集合,维度要和选用的 embedding 模型一致
client.create_collection(
    collection_name=COLLECTION_NAME,
    dimension=768,  # 使用默认模型生成的是 768 维向量
)

# Step 2️⃣ 中文句向量模型加载,用于对文档和查询编码
embedding_model = model.DefaultEmbeddingFunction()


# 准备中文知识库文档(可视为 RAG 的数据库),伪造的数据,如有雷同,纯属巧合。
docs = [
    "A公司由五个一级部门组成:战略规划部、产品研发部、市场销售部、人力资源部与财务管理部。",
    "战略规划部负责公司整体战略制定与年度业务目标设定,由高级副总裁王蕾领导。",
    "产品研发部下设三个小组:智能算法组、后端架构组、移动客户端组,分别由赵新宇、韩飞和李倩倩负责。",
    "人力资源部目前有6名成员,涵盖招聘、培训、绩效、薪酬等模块,负责人为HR总监陈蓉。",
    "市场销售部主要负责B端客户开拓与服务,目前设有北京、上海、深圳三个销售大区。",
    "财务管理部由CFO黄志明牵头,下设预算组、税务组与资金组,分别管理不同的财务职责。",
    "A公司CEO为沈立峰,CTO为冯启航,两人每季度召开一次高管战略会,协调部门合作。",
    "智能算法组正在负责天眼项目的模型迭代,预计Q3完成V2版本部署。",
    "后端架构组正在推动服务中台的容器化改造,目前已完成40%的微服务迁移。",
    "移动客户端组刚完成v6.2.0版本的迭代,新增了消息推送与报表订阅功能。"
]

# 将中文文档编码为向量(embedding)
vectors = embedding_model.encode_documents(docs)

# 组织结构化数据,插入到 Milvus 中
data_to_insert = [
    {"id": i, "vector": vectors[i], "text": docs[i], "tag": "公司组织架构"}
    for i in range(len(docs))
]

client.insert(collection_name=COLLECTION_NAME, data=data_to_insert)

# Step 3️⃣ 用户输入查询(中文)
query = "谁是A公司的CTO?"

# 查询向量化
query_vector = embedding_model.encode_documents([query])

# Step 4️⃣ 从 Milvus 中基于向量检索 Top-K 最相关文档
search_results = client.search(
    collection_name=COLLECTION_NAME,
    data=query_vector,
    limit=5,
    output_fields=["text"]
)

# print(search_results)
# print(list(search_results[0]))

# 提取原始文本内容
retrieved_texts = [doc["entity"]["text"] for doc in list(search_results[0])]

# Step 5️⃣ 使用 CrossEncoder 进行重排序,提升相关性排名
reranker = CrossEncoderRerankFunction(
    model_name="cross-encoder/ms-marco-MiniLM-L12-v2",
    device="cpu"
)

reranked = reranker(
    query=query,
    documents=retrieved_texts,
    top_k=3  # 可以根据需要调整返回数量
)

# 拼接重排序后的文档,作为 LLM 的上下文
context_text = "\n".join([r.text for r in reranked])

# Step 6️⃣ 构造 prompt,准备传入 LLM 生成回答
prompt = f"""
请根据以下背景知识回答用户提出的问题:

【背景知识】
{context_text}

【问题】
{query}

【回答】
"""

# Step 7️⃣ 使用 Ollama + DeepSeek 模型生成回答(流式输出)
print("🤖 正在生成回答...\n")

# 调用 Ollama SDK,使用 streaming=True 获取流式输出
stream = ollama.chat(
    model="deepseek-r1:32b",
    messages=[{"role": "user", "content": prompt}],
    stream=True
)

# Step 8️⃣ 打印流式输出结果
response_buffer = ""
for chunk in stream:
    delta = chunk.get("message", {}).get("content", "")
    print(delta, end="", flush=True)  # 实时输出
    response_buffer += delta

通过更换query的内容,可以获得以下结论:

  1. 向量嵌入和Rerank存在优化空间,包括模型的选型、参数配置等内容,否则知识库无法精确找出相关知识;
  2. 找出的个性化词条作为输入是不会影响外部公开问题的正常回答的。
查询回答(来自 RAG + LLM)结论
谁是A公司的CTO?冯启航是A公司的CTO。正确
A公司哪个小组负责天眼项目?A公司的天眼项目负责人尚未明确,但根据背景知识,该项目可能由产品研发部的其中一个小组负责。具体来说: 1. 智能算法组:负责AI和数据分析相关的工作。2. 后端架构组:负责应用程序的后台结构。3. 移动客户端组:负责移动端应用开发。 如需确定具体负责人,请提供更多项目细节。错误,原因是搜索的时候没有找到天眼项目这个信息。
A公司中产品研发部下有哪些组?A公司中产品研发部下有智能算法组、后端架构组和移动客户端组三个小组。正确
A公司的预算组是哪位负责?根据提供的背景知识,无法确定A公司预算组的具体负责人。虽然预算管理通常由财务管理部负责,但背景信息中并未提及该部门的负责人或相关细节。因此,基于现有信息,我们不能确定预算组的负责人是谁。 【答案】根据提供的背景知识,无法确定A公司的预算组是由谁负责,因为相关信息未提及。错误,原因是搜索的时候没有找到预算组这个信息。关键字的搜索不够好。 
王蕾负责什么?王蕾是公司的高级副总裁,负责领导战略规划部,主要职责包括制定公司整体战略和设定年度业务目标。正确
什么是数学分析?数学分析是研究函数的性质及其变化规律的一个重要学科,主要涵盖微积分、实变函数、复变函数等内容,广泛应用于物理学、工程学和经济学等领域。正确,没有受到知识库的影响
物理学有哪些研究方向?物理学是一门广泛而深入的科学,涵盖了许多不同的研究方向和分支领域。以下是一些主要的研究方向: 1. 经典力学:研究物体在宏观尺度下的运动和相互作用,包括牛顿力学、拉格朗日力学和哈密顿力学。正确,没有受到知识库的影响

同时,可以查看Collection的数据库信息。

from pymilvus import MilvusClient

# 创建 Milvus 客户端并连接数据库
client = MilvusClient("milvus_rag_zh.db")
COLLECTION_NAME = "zh_rag_demo"

# 获取集合的collection信息。要查看数据库中的所有集合,你可以使用 list_collections() 方法,它将返回当前数据库中的所有集合名称。
collection_list = client.list_collections()
print("List of Collections:", collection_list)

# 查看集合的统计信息,要查看集合中包含的实体数量,你可以使用 get_collection_stats() 方法。它将返回集合的统计信息,其中包括存储的向量数量(即实体数量)。
collection_stats = client.get_collection_stats(COLLECTION_NAME)
print("Collection Stats:", collection_stats)

# 还可以获取特定 Collection 的详细信息
desc_collection = client.describe_collection(collection_name=COLLECTION_NAME)
print("Describe Collection:", desc_collection)

Milvus总结

综上所述,Milvus 是一个开源的高性能向量数据库,专为处理大规模、高维度数据的存储与检索而设计。它支持多种数据类型的高效索引和快速检索,特别适用于机器学习、人工智能和数据分析领域中的相似性搜索任务。Milvus 能够处理从文本、图像到视频等多种格式的向量数据,并且具有出色的扩展性,能够应对大数据量的挑战。通过提供如 IVF、HNSW、Annoy 等多种索引方式,Milvus 能显著提升高维向量检索的速度和效率,是实现高效数据检索和实时分析的重要工具。

参考资料

  1. Milvus的官网:https://milvus.io/zh
  2. Milvus的GitHub:https://github.com/milvus-io/milvus
  3. 用Python操作Milvus向量数据库的简明教程:https://www.dboop.com/ops/用python操作milvus向量数据库的简明教程/#创建索引

RAG与大模型的结合:让LLM更智能的关键

1.  RAG的定义

大模型(Large Language Models,LLMs)的发展经历了从小规模模型到如今大规模、深度学习技术不断突破的过程。最早的语言模型主要依赖规则和手工特征,虽然能够进行一定的语言理解和生成,但缺乏足够的灵活性和准确性。随着深度学习的兴起,尤其是深度神经网络的应用,大规模语言模型开始崭露头角。

从最初的GPT(Generative Pre-trained Transformer)到BERT(Bidirectional Encoder Representations from Transformers)再到如今的GPT-4、DeepSeek-R1等,语言模型的规模和能力迅速提升。大模型通常包含数十亿到数百亿个参数,通过海量数据进行预训练,能够捕捉到语言中的复杂关系和语境信息。大模型的预训练使其具备了强大的迁移学习能力,能够在多个任务上取得优秀的性能,无论是文本生成、问答、翻译还是推理任务。大模型的发展不仅在技术层面突破了许多原有的限制,还在应用上带来了巨大的变革。比如,基于大模型的自然语言处理技术已经广泛应用于智能助手、自动翻译、内容生成等领域,极大地提高了人机交互的效率和质量。从自然语言处理的发展历程来看,LLM已经是近期最热门的研究方向之一。

同时,大模型的研究方向是非常宽泛的,包括但不限于LLM本身,还包括提示词工程,检索增强生成及其各种变形,Agent LLM,LLM 应用框架等方向。

检索增强生成(Retrieval-augmented generation,RAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练,使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输出。在 LLM 本就强大的功能基础上,RAG 将其扩展为能访问特定领域或组织的内部知识库,所有这些都无需重新训练模型。这是一种经济高效地改进 LLM 输出的方法,让它在各种情境下都能保持相关性、准确性和实用性。下图展示了有RAG和没有RAG的两种完全不同的答案。

2.  RAG的重要性

LLM 是一项关键的人工智能(AI)技术,为智能聊天机器人和其他自然语言处理(Natural Language Processing,NLP)应用程序提供支持。目标是通过交叉引用权威知识来源,创建能够在各种环境中回答用户问题的机器人。不幸的是,LLM 技术的本质在 LLM 响应中引入了不可预测性。此外,LLM 训练数据是静态的,并引入了其所掌握知识的截止日期。

LLM 面临的已知挑战包括

  • 在没有答案的情况下提供虚假信息。
  • 当用户需要特定的当前响应时,提供过时或通用的信息。
  • 从非权威来源创建响应。
  • 由于术语混淆,不同的培训来源使用相同的术语来谈论不同的事情,因此会产生不准确的响应。

可以将大语言模型看作是一个过于热情的新员工,他拒绝随时了解时事,但总是会绝对自信地回答每一个问题。不幸的是,这种态度会对用户的信任产生负面影响,这是您不希望聊天机器人效仿的!

RAG 是解决其中一些挑战的一种方法,它会重定向 LLM,从权威的、预先确定的知识来源中检索相关信息。组织可以更好地控制生成的文本输出,并且用户可以深入了解 LLM 如何生成响应。

上图呈现了一个简单的RA-LLMs框架。

3.  RAG的优势

3.1 经济高效

聊天机器人开发通常从基础的大模型开始。基础模型是在广泛的广义和未标记数据上训练的 API 可访问 LLM。针对组织或领域特定信息重新训练的计算和财务成本很高。RAG 是一种将新数据引入 LLM 的更加经济高效的方法。它使生成式人工智能技术更广泛地获得和使用。

3.2 信息的及时性

即使 LLM 的原始训练数据来源适合您的需求,但保持相关性也具有挑战性。RAG 允许开发人员为生成模型提供最新的研究、统计数据或新闻。他们可以使用 RAG 将 LLM 直接连接到实时社交媒体提要、新闻网站或其他经常更新的信息来源。然后,LLM 可以向用户提供最新信息。

3.3 增强信任度

RAG 允许 LLM 通过来源归属来呈现准确的信息。输出可以包括对来源的引文或引用。如果需要进一步说明或更详细的信息,用户也可以自己查找源文档。这可以增加对您的生成式人工智能解决方案的信任和信心。

3.4 增加控制权

借助 RAG,开发人员可以更高效地测试和改进他们的聊天应用程序。他们可以控制和更改 LLM 的信息来源,以适应不断变化的需求或跨职能使用。开发人员还可以将敏感信息的检索限制在不同的授权级别内,并确保 LLM 生成适当的响应。此外,如果 LLM 针对特定问题引用了错误的信息来源,他们还可以进行故障排除并进行修复。组织可以更自信地为更广泛的应用程序实施生成式人工智能技术。

4.  RAG的工作原理

如果没有 RAG,LLM 会接受用户输入,并根据它所接受训练的信息或它已经知道的信息创建响应。RAG 引入了一个信息检索组件,该组件利用用户输入首先从新数据源提取信息。用户查询和相关信息都提供给 LLM。LLM 使用新知识及其训练数据来创建更好的响应。下图显示了将 RAG 与 LLM 配合使用的概念流程。

4.1 创建外部数据

LLM 原始训练数据集之外的新数据称为外部数据。它可以来自多个数据来源,例如 API、数据库或文档存储库。数据可能以各种格式存在,例如文件、数据库记录或长篇文本。另一种称为嵌入语言模型的 AI 技术将数据转换为数字表示形式并将其存储在向量数据库中。这个过程会创建一个生成式人工智能模型可以理解的知识库。

4.2 检索相关信息

下一步是执行相关性搜索。用户查询将转换为向量表示形式,并与向量数据库匹配。例如,考虑一个可以回答组织的人力资源问题的智能聊天机器人。如果员工搜索:“我有多少年假?”,系统将检索年假政策文件以及员工个人过去的休假记录。这些特定文件将被退回,因为它们与员工输入的内容高度相关。相关性是使用数学向量计算和表示法计算和建立的。

4.3 增强LLM提示

接下来,RAG 模型通过在上下文中添加检索到的相关数据来增强用户输入(或提示)。此步骤使用提示工程技术与 LLM 进行有效沟通。增强提示允许大型语言模型为用户查询生成准确的答案。

4.4 更新外部数据

下一个问题可能是——如果外部数据过时了怎么办? 要维护当前信息以供检索,请异步更新文档并更新文档的嵌入表示形式。您可以通过自动化实时流程或定期批处理来执行此操作。这是数据分析中常见的挑战——可以使用不同的数据科学方法进行变更管理。

5.  检索增强生成和语义搜索

5.1 两者的定义

RAG(Retrieval-Augmented Generation):RAG的核心目标是通过检索外部知识(通常是文档、数据库、或其他文本资源)来增强生成式模型的回答能力。RAG结合了信息检索(retrieval)和生成模型(generation),它首先从大规模的文本库中检索相关内容,再利用生成模型(例如大型语言模型)结合这些内容生成最终的回答。这种方法特别适合用于生成需要依赖大量背景知识的文本,像是问答、文档摘要等任务。

语义搜索(Semantic Search):语义搜索的核心任务是通过理解查询的语义信息来找到与查询最相关的文档或片段。与传统的基于关键词的搜索方法不同,语义搜索基于向量表示和深度学习技术,能够理解查询和文档之间的深层语义关系,从而提供更相关的搜索结果。它通常用于搜索引擎中,目的是提高搜索结果的准确性和相关性。

5.2 两者的相关性

语义搜索可以提高 RAG 结果,适用于想要在其 LLM 应用程序中添加大量外部知识源的组织。现代企业在各种系统中存储大量信息,例如手册、常见问题、研究报告、客户服务指南和人力资源文档存储库等。上下文检索在规模上具有挑战性,因此会降低生成输出质量。

语义搜索技术可以扫描包含不同信息的大型数据库,并更准确地检索数据。例如,他们可以回答诸如 “去年在机械维修上花了多少钱?”之类的问题,方法是将问题映射到相关文档并返回特定文本而不是搜索结果。然后,开发人员可以使用该答案为 LLM 提供更多上下文。

RAG 中的传统或关键字搜索解决方案对知识密集型任务产生的结果有限。开发人员在手动准备数据时还必须处理单词嵌入、文档分块和其他复杂问题。相比之下,语义搜索技术可以完成知识库准备的所有工作,因此开发人员不必这样做。它们还生成语义相关的段落和按相关性排序的标记词,以最大限度地提高 RAG 有效载荷的质量。

6.  RAG的发展历程

6.1 RAG的成长树

大模型涉及的主要阶段包括预训练、微调和推理。随着大型语言模型(LLMs)的出现,RAG的研究最初集中于利用LLMs强大的上下文学习能力,主要集中在推理阶段。随后,研究逐渐深入,逐步与LLMs的微调过程结合。研究人员还在探索通过检索增强技术,在预训练阶段提升语言模型的能力。下图是RAG(检索增强生成)研究的技术发展路线图。

RAG过程在问答任务中的一个典型实例。它主要包括三个步骤:

  1. 索引:将文档拆分成若干块,编码成向量,并存储在向量数据库中。
  2. 检索:根据语义相似性,检索与问题最相关的前k个文档块。
  3. 生成:将原始问题和检索到的文档块一起输入到大型语言模型(LLM)中,生成最终答案。

6.2 RAG的三种形式

RAG可以分成三种形式,下图是RAG三种形式的比较:

(左)朴素RAG主要包括三个部分:索引、检索和生成。

(中)先进RAG提出了围绕预检索和后检索的多种优化策略,其过程类似于简单RAG,仍然遵循链式结构。

(右)模块化RAG继承并发展自前述范式,整体展示出更大的灵活性。其特点在于引入了多个具体的功能模块,并可以替换现有模块。整体过程不再局限于顺序的检索和生成,还包括迭代式和自适应检索等方法。

6.2.1 朴素的RAG

Naive RAG(朴素的检索增强生成模型)是最早的研究范式之一,它在 ChatGPT 被广泛采用后迅速获得了关注。Naive RAG 采用传统的 检索-生成(Retrieve-Generate)流程,主要包括三个步骤:索引、检索和生成。这一流程也被称为“检索-阅读”(Retrieve-Read)框架。

1. 索引(Indexing)

索引阶段首先是清洗和提取原始数据,这些数据通常来自不同的格式,如 PDF、HTML、Word 或 Markdown 文件,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本会被分割成较小的块(chunk)。这些文本块会使用嵌入模型(embedding model)转化为向量表示,并存储在向量数据库中。这一步对于后续检索阶段的高效相似度搜索至关重要。

2. 检索(Retrieval)

当用户提出查询时,RAG 系统使用在索引阶段相同的编码模型将查询转换为向量表示。然后,它计算查询向量与索引中每个文本块的向量之间的相似度分数。系统会优先检索与查询最相关的 Top K 个文本块,这些文本块会作为扩展上下文,供后续生成阶段使用。

3. 生成(Generation)

在生成阶段,用户提出的查询和检索到的相关文档会被组合成一个一致的提示(prompt),输入到一个大语言模型(LLM)中,任务是生成一个回应。模型生成回应的方式可以根据具体任务的要求而变化,模型可能会利用其内在的参数知识,也可以限制其回答只基于提供的文档内容。如果是多轮对话,现有的对话历史也可以被整合到提示中,以便模型能够进行多轮对话交互。

Naive RAG 的挑战和缺点

尽管 Naive RAG 有其优势,但它也存在一些显著的缺点和挑战:

1. 检索挑战

检索阶段通常面临精确度和召回率的挑战,可能会导致选择到与查询不相关或不对齐的文本块,或者无法检索到关键的有用信息。

2. 生成困难

在生成回答时,模型可能会面临 幻觉(Hallucination) 的问题,即生成的内容与检索到的上下文无关,甚至会出现生成的内容完全不准确的情况。生成的回答可能会出现无关、毒性或偏见的问题,影响回答的质量和可靠性。

3. 增强问题

将检索到的信息与不同任务进行整合时可能会遇到困难,有时会导致输出内容不连贯或不一致。检索到的信息可能存在冗余,例如从多个来源检索到类似的信息,从而导致重复的响应。此外,确定不同段落的意义和相关性,并确保输出的风格和语气一致,也是一个难点。

4. 复杂问题的处理

在面对复杂问题时,单次检索可能不足以获得足够的上下文信息。生成模型可能过于依赖检索到的增强信息,导致输出的内容仅仅是检索内容的重复,而缺乏深入的分析或综合信息。

6.2.2 增强的RAG

Advanced RAG(高级检索增强生成模型)通过引入特定的改进,旨在克服 Naive RAG 的局限性,重点提升检索质量。与朴素的 RAG 方法不同,Advanced RAG 采用了预检索(Pre-Retrieval)和后检索(Post-Retrieval)策略来优化检索过程,进一步改善了索引和检索的效率。

1. 预检索过程(Pre-Retrieval)

在预检索阶段,重点是优化索引结构和原始查询。通过提升索引的质量和优化查询,提升检索的精度和相关性。

优化索引

  • 增强数据粒度:提高数据分割的细致程度,使得每个数据块(Chuck)更具针对性,便于后续的精确检索。
  • 优化索引结构:调整数据存储和索引的方式,使其更加高效,支持快速检索。
  • 添加元数据:在索引中加入额外的信息(如时间戳、来源等元数据),提高检索时的上下文理解能力。
  • 对齐优化:确保数据之间的一致性和对齐,使得索引的构建更加精确。
  • 混合检索:结合不同的检索方法,进一步提高检索的多样性和精准性。

优化查询

  • 查询重写(Query Rewriting):通过重写用户的查询,使其更简洁、清晰,便于检索模型理解。
  • 查询转换(Query Routing):将用户的查询转换成更加结构化或易于理解的格式,以提高检索效果。
  • 查询扩展(Query Expansion):通过扩展查询的关键词,涵盖更多可能的相关信息,提高检索的全面性。

2. 后检索过程(Post-Retrieval)

在检索到相关内容后,后检索阶段的任务是将检索到的内容有效整合与用户的查询进行融合,从而生成准确的响应。

  • 重排(Re-ranking):对检索到的内容进行重排序,将最相关的文本块移至提示的边缘,以增强模型对关键内容的关注度。这个策略已经在一些框架中得到了应用,如 LlamaIndexLangChainHayStack
  • 摘要(Summary)与上下文压缩(Context Compression):提炼出关键的信息,直接将所有相关文档输入到大语言模型(LLM)中,可能会导致信息过载,使得模型难以集中注意力在关键信息上。因此,后检索阶段的重点是选择最重要的信息,强调关键部分,并压缩上下文,去除不必要的冗余内容。
  • 融合(Fusion):将各种信息融合到一起。

3. 优化策略

Advanced RAG 采用了多种优化方法,旨在提升整个检索过程的效果,特别是在检索的精确性和生成的相关性方面:

  • 增强检索质量:通过预检索和后检索策略,Advanced RAG 可以显著提高检索到的信息质量,使得生成的答案更加准确和相关。
  • 减少信息过载:后检索阶段通过重排和压缩上下文,减少了不相关信息的干扰,使得生成过程更加高效。

6.2.3 模块化的RAG

Modular RAG(模块化检索增强生成模型)在之前的 Naive RAGAdvanced RAG 基础上进一步发展,提供了更高的适应性和灵活性。它通过引入不同的模块来改进模型的各个部分,从而提高检索和处理能力。与传统的顺序处理方式不同,模块化 RAG 支持更加灵活的模块替换与配置,适应不同的任务需求。

1. 新模块(New Modules)

Modular RAG 框架引入了一些额外的专用组件,以增强其检索和处理能力。以下是一些关键的新模块:

  • Search 模块:适应特定场景,支持跨多个数据源(如搜索引擎、数据库和知识图谱)的直接检索。通过大语言模型(LLM)生成的代码和查询语言,实现对各种信息源的访问。
  • RAG Fusion 模块:解决传统检索的局限性,采用多查询策略,将用户的查询扩展为多种视角。通过并行的向量搜索和智能重排序,挖掘显式和转化性知识。
  • Memory 模块:利用 LLM 的记忆功能引导检索,创建一个无限制的记忆池。通过迭代自我增强,使文本与数据分布更加对齐,从而提高检索的准确性。
  • Routing 模块:在 RAG 系统中引导不同数据源的检索,选择最优的路径进行查询。无论是总结、特定数据库检索,还是合并多个信息流,Routing 模块都能进行灵活处理。
  • Predict 模块:通过生成上下文来减少冗余和噪音,直接通过 LLM 生成相关且准确的内容,从而提升信息的相关性和质量。
  • Task Adapter 模块:为不同的下游任务定制 RAG。通过少量示例生成任务特定的检索器,自动进行零-shot 输入的提示检索,支持更广泛的应用场景。

这些模块不仅使检索过程更加流畅,而且显著提升了检索信息的质量和相关性,适应了各种任务和查询,提供了更高的精度和灵活性。

2. 新模式(New Patterns)

Modular RAG 提供了极大的适应性,允许根据特定的挑战替换或重新配置模块。这使得 Modular RAG 超越了 Naive 和 Advanced RAG 固定结构的限制,能够根据任务需求灵活调整模块的交互流程。

  • Rewrite-Retrieve-Read 模型:利用 LLM 的能力通过重写模块和语言模型反馈机制优化查询,提升任务性能。
  • Generate-Read 模型:替代传统的检索过程,使用 LLM 生成的内容作为上下文,减少对传统检索的依赖。
  • Recite-Read 模型:强调从模型权重中检索知识,提升模型处理知识密集型任务的能力。
  • 混合检索策略(Hybrid Retrieval):综合关键字检索、语义检索和向量检索,适应多样化的查询需求。通过子查询和假设文档嵌入(HyDE),提高检索的相关性,专注于生成答案与实际文档之间的嵌入相似性。
  • 模块化模块流(Modular RAG Flow):通过 FLARE 和 Self-RAG 等技术,支持适应性检索,依据不同场景评估检索的必要性。这种灵活的架构不仅可以提高检索效率,还可以更容易地与其他技术(如微调或强化学习)进行集成。

3. 模块化 RAG 的优势

Modular RAG 提供了比 Naive 和 Advanced RAG 更加灵活的架构,能够动态调整模块交互和流向。其优点包括:

  • 灵活的模块替换:可以根据具体任务需求替换或重构模块,适应不同的应用场景。
  • 增强的信息检索能力:通过多种检索策略(如混合检索、并行检索等),提高了信息检索的精确性和全面性。
  • 自我增强和记忆功能:通过 Memory 模块,LLM 可以不断优化检索过程,提供更为精准的上下文信息。
  • 跨任务适应性:通过 Task Adapter 模块,RAG 可以根据不同的下游任务自动调整,以满足多种任务需求。

6.3 RAG与微调(Fine-Tuning)

RAG与其他模型优化方法在“是否需要外部知识”和“是否需要模型适应”方面的比较。提示工程(Prompt Engineering)对模型和外部知识的修改要求较低,主要侧重于利用大型语言模型(LLMs)本身的能力。而微调则涉及对模型的进一步训练。在RAG的早期阶段(简单RAG),对模型修改的需求较低。随着研究的进展,模块化RAG与微调技术的结合变得更加紧密。

6.4 检索(Retrieval)

RAG(检索增强生成模型)依赖外部知识来增强大语言模型(LLM)的能力,而检索源的类型和检索单元的粒度都会影响最终的生成结果。

1. 数据结构(Data Structure)

检索源的演变:最初,文本是主要的检索来源,随后扩展到半结构化数据(如PDF)和结构化数据(如知识图谱, KG)。除了从外部源进行检索外,近期的研究趋势还包括利用LLM自身生成的内容进行检索和增强。

检索单元的粒度:检索单元的粒度也会影响检索的效果。粗粒度的检索单元(如文档或句子)理论上可以提供更相关的信息,但也可能包含冗余内容,干扰下游任务。而细粒度的检索单元(如词语或短语)增加了检索的负担,且不能保证语义的完整性。选择合适的检索粒度是一种简单有效的策略,可以提升密集检索器的性能。

  • 文本中的粒度:从细粒度到粗粒度,粒度包括词语、短语、句子、命题、段落、文档等。DenseX 提出了使用命题作为检索单元的概念,命题被定义为文本中的原子表达,每个命题都封装了一个独特的事实信息,形式简洁、独立,旨在提高检索的精度和相关性。
  • 知识图谱中的粒度:在知识图谱中,检索粒度包括实体、三元组和子图等。粒度的选择也可以根据下游任务调整,如在推荐任务中检索物品ID,或者在问答任务中检索句子对等。

2. 索引优化(Indexing Optimization)

在索引阶段,文档会被处理、分段并转化为嵌入向量,存储在向量数据库中。索引的质量决定了检索阶段是否能获取到正确的上下文。

分段策略(Chunking Strategy):最常见的做法是将文档按照固定的令牌数进行分段(例如 100、256、512 等)。较大的分段能够捕捉更多上下文,但也会产生更多噪音,需要更长的处理时间和更高的成本。较小的分段可能无法完整传达必要的上下文,但噪音较少。为了解决这一问题,采用递归分割和滑动窗口的方法进行优化,使得不同的检索过程能够跨多个分段获取全局相关信息。

元数据附加(Metadata Attachments):分段可以通过附加元数据(如页码、文件名、作者、时间戳等)来丰富,从而在检索时基于元数据进行过滤,限制检索范围。元数据的不同权重可以在检索过程中实现时间感知 RAG,确保所用知识的时效性。

结构化索引(Structural Index):建立文档的层级结构可以有效提高检索效率。通过构建层级索引,RAG 系统可以快速检索和处理相关数据。知识图谱索引能够帮助保持一致性,并减少检索时的误差。此外,知识图谱还能将信息检索过程转化为 LLM 能够理解的指令,增强知识检索的精度和生成的上下文连贯性。

3. 查询优化(Query Optimization)

传统的 Naive RAG 依赖于用户原始查询进行检索,然而用户提问不够精确或清晰时,检索效果会受到影响。特别是,当查询本身很复杂,或者语言不够规范时,RAG 系统容易出现问题。

查询扩展(Query Expansion)

  • 多查询(Multi-Query):通过 LLM 进行查询扩展,将一个查询转化为多个并行查询,提供更丰富的上下文,确保生成答案的相关性。
  • 子查询(Sub-Query):将复杂的查询分解为一系列更简单的子问题,通过组合这些子查询来完整回答原始问题。这种方法类似于查询扩展,能提供更好的上下文。
  • 验证链(Chain-of-Verification,CoVe):扩展后的查询通过 LLM 进行验证,从而减少幻觉现象,提高检索结果的可靠性。

查询转化(Query Transformation)

  • 查询重写(Query Rewrite):LLM 可以重写查询,帮助生成更符合检索需求的问题。在实际应用中,像 BEQUE 就利用查询重写增强了对于长尾查询的召回效果。
  • 假设文档生成(HyDE):通过 LLM 生成假设性文档(即假设答案),在检索过程中计算查询和假设问题之间的相似度,从而缩小查询和答案之间的语义差距。
  • 退后提示(Step-back Prompting):将原始查询抽象成高层次概念问题,用于生成更有针对性的检索结果。

查询路由(Query Routing):基于查询的不同特点,路由到不同的 RAG 管道中,适应多样化的场景需求。

  • 元数据路由(Metadata Router):从查询中提取关键词(如实体),然后基于元数据进行过滤,缩小搜索范围。
  • 语义路由(Semantic Router):利用查询的语义信息进行路由,结合元数据和语义的混合路由方法,以提升查询路由效果。

4. 嵌入(Embedding)

在 RAG 系统中,通过计算查询和文档段落嵌入的相似度(例如余弦相似度)来实现检索。嵌入模型的语义表示能力在其中起着关键作用。

混合检索(Mix/Hybrid Retrieval):稀疏检索模型和密集检索模型可以互补,通过结合两者的优势,提升检索的多样性和准确性。例如,可以使用稀疏模型提供初步的搜索结果,再通过密集检索模型进行精细化检索。

微调嵌入模型(Fine-tuning Embedding Model):在某些领域,特别是在专业领域(如医疗、法律等)中,微调嵌入模型是必需的,以减少与预训练语料库的差异。通过使用 LLM 的结果作为监督信号进行微调,可以提高模型的性能。

5. 适配器(Adapter)

在微调模型时,可能会遇到一些问题,例如 API 集成或计算资源限制。因此,某些方法采用外部适配器来帮助对齐。

轻量级适配器(UPRISE):通过训练一个轻量级的提示检索器,自动从预构建的提示池中检索适合给定零-shot 任务输入的提示,从而优化 LLM 的多任务能力。

增强适配器(AAR):设计了一种通用适配器,能够适应多个下游任务,并提高在特定任务上的性能。

6.5 增强生成(Augmented Generation)

在RAG(检索增强生成)领域,标准的做法通常是先进行一次性检索,然后进行生成。这种方式可能导致效率低下,尤其对于需要多步推理的复杂问题,它提供的信息范围有限。为了解决这一问题,许多研究对检索过程进行了优化。除了最常见的单次检索,RAG还包括三种类型的检索增强过程。

(左) 迭代检索涉及在检索和生成之间交替进行,使每一步都能从知识库中获得更丰富、更有针对性的上下文。

(中)递归检索则通过逐步细化用户查询,将问题分解为子问题,然后通过检索和生成不断解决复杂问题。

(右)自适应检索侧重于使RAG系统能够自主判断是否需要外部知识检索,并决定何时停止检索和生成,通常使用LLM生成的特殊标记进行控制。

6.5.1 迭代检索(Iterative Retrieval)

迭代检索是一种基于初始查询和迄今为止生成的文本,反复检索知识库的方法,为LLM(大语言模型)提供更全面的知识基础。这种方法已被证明能够增强后续生成答案的鲁棒性,通过多次检索迭代,提供更多的上下文信息。然而,迭代检索可能会受到语义不连续性和冗余信息累积的影响。ITER-RETGEN提出了一种协同方法,将“检索增强生成”与“生成增强检索”结合起来,用于需要复现特定信息的任务。该模型利用生成的内容作为检索相关知识的上下文基础,从而在后续的迭代中生成更为精准的答案。

6.5.2 递归检索(Recursive Retrieval)

递归检索在信息检索和自然语言处理(NLP)中常用于提高搜索结果的深度和相关性。这个过程涉及基于先前搜索结果不断优化查询。递归检索旨在通过反馈循环逐渐接近最相关的信息,从而改善搜索体验。IRCoT使用了思维链(chain-of-thought)来指导检索过程,并基于获得的检索结果优化思维链。ToC则创建了一个澄清树,系统地优化查询中模糊的部分。递归检索尤其适用于复杂的搜索场景,其中用户需求从一开始就不完全明确,或者所需信息非常专业或细致。递归过程允许系统不断学习和适应用户需求,从而通常能提高搜索结果的满意度。

为了应对特定的数据场景,递归检索与多跳检索技术可以结合使用。递归检索涉及结构化索引,以分层方式处理和检索数据,这可能包括在执行检索之前对文档或长PDF进行总结。随后,基于这些摘要进行二次检索,体现了递归过程的特点。与此相对,多跳检索则旨在深入挖掘图结构数据源,提取相互关联的信息。

6.5.3 自适应检索(Adaptive Retrieval)

自适应检索方法通过允许LLM主动决定最佳的检索时机和内容,优化了RAG框架,从而提高了信息来源的效率和相关性。例如,Flare和Self-RAG就是通过这种方法来优化检索过程。随着这一趋势的发展,越来越多的LLM开始在其操作中主动做出判断,例如在模型代理(如AutoGPT、Toolformer和Graph-Toolformer)中也能看到这种趋势。Graph-Toolformer 就是将检索过程分为多个步骤,LLM主动使用检索器、应用Self-Ask技术,并采用少样本提示来发起搜索查询。这种主动的策略使得LLM能够决定何时需要检索信息,类似于代理在使用工具时的判断。

WebGPT引入了强化学习框架,训练GPT-3模型在文本生成过程中自主使用搜索引擎。它通过特殊的标记来导航这一过程,包括搜索引擎查询、浏览结果和引用参考文献,从而通过外部搜索引擎扩展GPT-3的能力。Flare则通过监控生成过程的置信度(如生成词汇的概率)来自动化检索时机,当概率低于某个阈值时,激活检索系统收集相关信息,从而优化检索周期。Self-RAG引入了“反思标记”,让模型能够自我反思其输出。这些标记有两种类型:“检索”和“批评”。模型可以自主决定何时启动检索,或者通过预设阈值触发检索过程。在检索过程中,生成器通过在多个段落中进行碎片级束搜索,得出最连贯的序列。批评分数用于更新细分分数,并且可以在推理过程中调整这些权重,从而量身定制模型的行为。Self-RAG的设计避免了额外分类器或依赖自然语言推理(NLI)模型,从而简化了何时启用检索机制的决策过程,提高了模型在生成准确回答时的自主判断能力。下图是Self-RAG的整体架构图。

6.6 RAG生态系统

综上所述,RAG生态系统如下图所示:

RAG的评价指标如下,其中包含了一些基准线(benchmark)和工具(tool)。

6.7 RAG的未来发展方向

RAG的未来发展方向包括:

  • RAG与长文本:长文本往往超出了传统模型能够处理的上下文长度。许多模型有输入长度的限制,当文本长度过长时,可能会出现截断现象。这会影响模型对全文的理解,尤其是当重要信息被截断时,系统可能无法提供完整的答案。长文本中的不同部分可能涉及不同的主题、背景或情节,如何确保检索到的信息与当前生成的内容保持一致性至关重要。
  • RAG的健壮性:RAG可能会面临检索过程中引入的噪声,例如与查询无关的文档或片段,或是检索到的文本含有误导性信息。噪声数据会影响生成结果的准确性和相关性。有时需要处理用户提出的模糊、含糊不清的查询,这些查询可能没有明确的意图或是包含多重意思。在这种情况下,RAG系统需要有效地推理和生成相关答案。
  • RAG的扩展规律(Scaling Law):随着数据集的增大,检索过程的复杂度会显著提升。需要优化检索算法和数据结构,以保持检索效率。通常,扩大检索规模可以提高生成结果的质量,但同时也可能增加不相关信息的干扰。
  • 生产级RAG:指已经优化并可以在实际环境中稳定运行的RAG系统。这类系统不仅要求具有高效的检索和生成能力,还需要具备可扩展性、低延迟和高可靠性等特点。
  • 混合方法:混合方法是指将多种不同的技术或模型结合起来,以优化RAG系统的性能。常见的混合方法包括将稀疏检索(例如BM25)与密集检索(例如BERT架构)结合,或者将规则驱动的系统与深度学习模型结合使用。
  • 多模态的RAG:图片、音频、视频、代码等作为知识库和信息输入也是存在着一定的挑战。

7.  参考资料

  1. Gao Y, Xiong Y, Gao X, et al. Retrieval-augmented generation for large language models: A survey[J]. arXiv preprint arXiv:2312.10997, 2023, 2.
  2. Gao Y, Xiong Y, Zhong Y, et al. Synergizing RAG and Reasoning: A Systematic Review[J]. arXiv preprint arXiv:2504.15909, 2025.
  3. Li X, Jia P, Xu D, et al. A Survey of Personalization: From RAG to Agent[J]. arXiv preprint arXiv:2504.10147, 2025.
  4. Arslan M, Ghanem H, Munawar S, et al. A Survey on RAG with LLMs[J]. Procedia Computer Science, 2024, 246: 3781-3790.
  5. Fan, Wenqi, et al. “A survey on rag meeting llms: Towards retrieval-augmented large language models.” Proceedings of the 30th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. 2024.

GPT4All:本地部署的开源大语言模型

1.  GPT4All简介

1.1 开源项目

GPT4All 是由 Nomic AI 开发的一个开源项目,旨在让用户能够在个人设备上本地运行大型语言模型(LLM),无需依赖云服务。 这一项目自发布以来,已成为 GitHub 上增长最快的开源项目之一,拥有超过 7 万个 GitHub 星标。

1.2 适用场景

使用GPT4All的话有以下优势:

  • 隐私保护:处理敏感数据时,确保信息不外泄。
  • 离线使用:在没有网络连接的环境中使用 AI。
  • 教育与研究:用于教学、研究或学习目的。
  • 定制化需求:根据特定需求定制 AI 模型。

2.  核心特点

2.1. 完全本地运行,无需互联网连接

GPT4All 允许用户在 Windows、macOS 和 Linux 等操作系统上本地运行 LLM。 用户可以下载模型文件(通常为 1GB 至 8GB),并在没有网络连接的情况下使用 AI 聊天。

2.2 支持多种硬件平台

该项目支持多种硬件平台,包括支持 AVX 指令集的 CPU,以及 Apple M 系列芯片、AMD 和 NVIDIA GPU 等。 这使得用户能够在不同的设备上体验本地 LLM。

2.3 隐私优先

GPT4All 强调数据隐私,默认情况下,用户的对话数据不会离开本地设备。 如果用户选择使用远程模型或参与数据共享,系统会明确提示并征得同意。

2.4 丰富的模型支持

GPT4All 支持多种开源模型,包括 LLaMa、Mistral、DeepSeek R1、Nous-Hermes 等。 用户可以根据需求选择不同的模型进行本地部署。详情可以参考链接:https://github.com/nomic-ai/gpt4all/blob/main/gpt4all-chat/metadata/models3.json

2.5 集成本地文档支持

GPT4All 提供 LocalDocs 功能,允许用户将本地文档(如 PDF、TXT、Markdown 等)导入系统,与 AI 进行交互。 这对于处理敏感或私密信息非常有用。

3.  快速上手指南

3.1 下载并安装软件

访问下载适用于您操作系统(Windows、Mac、Linux)的安装包。

3.2 添加模型

启动应用程序后,点击“+ Add Model”按钮,选择并下载您需要的模型。

3.3 开始聊天

下载模型后,进入“Chats”界面,选择已加载的模型,开始与 AI 进行对话。并且还提供上传本地文件资料的功能,实现知识库的搜索。

3.4 使用Python的SDK

3.4.1 大语言模型

GPT4All 提供了 Python SDK,方便开发者将其集成到自己的项目中。 此外,项目采用 MIT 开源许可证,允许用户进行自定义和二次开发。

安装方法:

pip install gpt4all

使用方法:

可以按照官方提供的模板进行使用,如果模型没有提前下载的话,在第一次使用的时候,代码会自动下载模型。

from gpt4all import GPT4All
model = GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf") # downloads / loads a 4.66GB LLM
with model.chat_session():
    print(model.generate("How can I run LLMs efficiently on my laptop?", max_tokens=1024))

如果想要进行流式输出或者一次性输出,可以使用streaming这个参数进行控制,参考代码:

from gpt4all import GPT4All

def output_with_stream_control(prompt: str, model_name: str = "Meta-Llama-3-8B-Instruct.Q4_0.gguf", max_tokens: int = 1024, streaming: bool = False):
    model = GPT4All(model_name)  # 加载指定模型

    # 创建一个对话会话
    with model.chat_session() as session:
        response_buffer = ""

        if streaming:
            # 启用流式输出
            for chunk in model.generate(prompt, max_tokens=max_tokens, streaming=streaming):
                response_buffer += chunk
                print(chunk, end='', flush=True)  # 实时输出生成的文本
            print("\n\n生成的完整答案:", response_buffer)
        else:
            # 批量输出(等待完整生成后返回)
            response_buffer = model.generate(prompt, max_tokens=max_tokens, streaming=streaming)
            print("\n生成的完整答案:", response_buffer)

        return response_buffer

if __name__ == "__main__":
    prompt = "用中文回答,什么是化学?"
    result = output_with_stream_control(prompt, streaming=False)
    print('result:', result)

模型的选择范围很多,当前支持的部分模型可以参考表格:

GPT4All model nameFilesizeRAM RequiredParametersQuantizationDeveloperLicenseMD5 Sum (Unique Hash)
Meta-Llama-3-8B-Instruct.Q4_0.gguf4.66 GB8 GB8 Billionq4_0MetaLlama 3 Licensec87ad09e1e4c8f9c35a5fcef52b6f1c9
Nous-Hermes-2-Mistral-7B-DPO.Q4_0.gguf4.11 GB8 GB7 Billionq4_0Mistral & Nous ResearchApache 2.0Coa5f6b4eabd3992da4d7fb7f020f921eb
Phi-3-mini-4k-instruct.Q4_0.gguf2.18 GB4 GB3.8 billionq4_0MicrosoftMITf8347badde9bfc2efbe89124d78ddaf5
orca-mini-3b-gguf2-q4_0.gguf1.98 GB4 GB3 billionq4_0MicrosoftCC-BY-NC-SA-4.00e769317b90ac30d6e09486d61fefa26
gpt4all-13b-snoozy-q4_0.gguf7.37 GB16 GB13 billionq4_0Nomic AIGPL40388eb2f8d16bb5d08c96fdfaac6b2c

同时,SDK的所有参数可以参考链接:https://docs.gpt4all.io/gpt4all_python/ref.html#gpt4all.gpt4all.GPT4All.list_models

3.4.2 嵌入模型

除了大语言模型之外,它还提供三种嵌入模型,其本地调用的使用案例如下所示:

from nomic import embed
embeddings = embed.text(["String 1", "String 2"], inference_mode="local")['embeddings']
print("Number of embeddings created:", len(embeddings))
print("Number of dimensions per embedding:", len(embeddings[0]))

其嵌入模型有三个:

NameUsing with nomicEmbed4All model nameContext LengthEmbedding DimensionsFile Size
Nomic Embed v1embed.text(strings, model=”nomic-embed-text-v1″, inference_mode=”local”)Embed4All(“nomic-embed-text-v1.f16.gguf”)2048768262 MiB
Nomic Embed v1.5embed.text(strings, model=”nomic-embed-text-v1.5″, inference_mode=”local”)Embed4All(“nomic-embed-text-v1.5.f16.gguf”)204864-768262 MiB
SBertn/aEmbed4All(“all-MiniLM-L6-v2.gguf2.f16.gguf”)51238444 MiB

4.  参考资料:

  1. GPT4All的GitHub地址:https://github.com/nomic-ai/gpt4all
  2. GPT4All的文档:https://docs.gpt4all.io/
  3. nomic的官网:https://www.nomic.ai/
  4. 模型的选择范围:https://github.com/nomic-ai/gpt4all/blob/main/gpt4all-chat/metadata/models3.json

Ollama简介:让大模型走进每个开发者的工具箱

Ollama的介绍

Ollama 是一款强大的人工智能语言大模型(LLM)平台,专注于为开发者和企业提供高效、可定制的文本生成和自然语言处理能力。通过集成先进的深度学习技术,Ollama 能够在本地帮助用户生成高质量的文章、解答复杂问题、提供自动化客服支持等。无论是内容创作、数据分析,还是智能客服系统,Ollama 都能提供灵活的解决方案,并支持跨平台应用。凭借其易用的接口、快速的响应速度和强大的定制化功能,Ollama 已成为越来越多开发者和企业的首选工具,为他们在复杂任务中提供智能化的辅助和支持。


不仅如此,Ollama还提供了一些非常简单的方式来下载、运行、加载和使用各种预训练的开源大语言模型,支持文本生成、知识问答等常见的自然语言处理功能。在Ollama的加持下,NLP不再是只有深度学习背景的开发者才能够接触的领域。

Ollama的入门

在GitHub的官网上,可以找到Ollama的链接是:https://github.com/ollama/ollama。同时,它可以支持MAC、Windows、Linux的使用,并且Linux的下载和安装命令如下:

curl -fsSL https://ollama.com/install.sh | sh

除此之外,Ollama还支持通过Docker的方式进行部署。在使用Ollama的之前,需要将其安装在电脑上,根据不同的操作系统,可以选择不同的安装方式。

下载与安装

Windows系统

打开浏览器,访问 Ollama 官方网站:https://ollama.com/download,下载适用于 Windows 的安装程序。下载地址为:https://ollama.com/download/OllamaSetup.exe。下载完成后,双击安装程序并按照提示完成安装。打开命令提示符或 PowerShell,输入以下命令验证安装是否成功:

ollama --version

如果上述命令显示版本号,则表示安装成功。

Mac系统

打开浏览器,访问 Ollama 官方网站:https://ollama.com/download,下载适用于 macOS 的安装程序。下载地址为:https://ollama.com/download/Ollama-darwin.zip。下载完成后,双击安装包并按照提示完成安装。安装完成后,通过以下命令验证:

ollama --version

如果上述命令显示版本号,例如ollama version is 0.6.5,则表示安装成功。如果显示zsh: command not found: ollama,则表示没有安装成功。

Linux系统

在Linux系统上,可以一键安装ollama,输入以下命令即可:

curl -fsSL https://ollama.com/install.sh | bash

安装完成后,通过以下命令验证:

ollama --version

如果上述命令显示版本号,则表示安装成功。

部分模型

在GitHub的官网上,我们可以看到Ollama可以支持和下载的模型种类是非常多的,包括Gemma、DeepSeek、Llama、LLaVA等,并且不同的大小也可以通过参数来进行选择。通常来说,模型的参数越多,模型的大小也就越大。更全的模型库可以参考链接:https://ollama.com/library

模型参数大小下载并运行
Gemma 31B815MBollama run gemma3:1b
Gemma 34B3.3GBollama run gemma3
Gemma 312B8.1GBollama run gemma3:12b
Gemma 327B17GBollama run gemma3:27b
QwQ32B20GBollama run qwq
DeepSeek-R17B4.7GBollama run deepseek-r1
DeepSeek-R1671B404GBollama run deepseek-r1:671b
Llama 3.370B43GBollama run llama3.3
Llama 3.23B2.0GBollama run llama3.2
Llama 3.21B1.3GBollama run llama3.2:1b
Llama 3.2 Vision11B7.9GBollama run llama3.2-vision
Llama 3.2 Vision90B55GBollama run llama3.2-vision:90b
Llama 3.18B4.7GBollama run llama3.1
Llama 3.1405B231GBollama run llama3.1:405b
Phi 414B9.1GBollama run phi4
Phi 4 Mini3.8B2.5GBollama run phi4-mini
Mistral7B4.1GBollama run mistral
Moondream 21.4B829MBollama run moondream
Neural Chat7B4.1GBollama run neural-chat
Starling7B4.1GBollama run starling-lm
Code Llama7B3.8GBollama run codellama
Llama 2 Uncensored7B3.8GBollama run llama2-uncensored
LLaVA7B4.5GBollama run llava
Granite-3.28B4.9GBollama run granite3.2

DeepSeek-r1会有不同的模型参数和大小,最少的模型参数是1.5b,最大的模型参数是671b。这些可以在Ollama的官网上找到,并且可以基于本地电脑的配置下载到本地电脑进行运行。在运行模型的时候,请注意mac的内存情况,以及参考Ollama官方提供的建议:You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models.

Ollama的使用

模型下载

使用帮助命令可以查到ollama的常见命令如下:

ollama -h

目前以操作deepseek-r1:7b模型为例,当你只需要下载模型的时候,需要使用命令:

ollama pull deepseek-r1:7b

当你需要下载模型并且运行的时候,需要使用命令,同时就会进入对话功能,正常的使用即可。退出的时候可以使用ctrl+d或者/bye即可。

ollama run deepseek-r1:7b

如果想查看该模型的细节,可以用show命令进行展示。

ollama show deepseek-r1:7b

当你想查看Ollama安装了多少大模型的时候,可以使用命令:

ollama list

在mac上执行ollama serve,会出现Error: listen tcp 127.0.0.1:11434: bind: address already in use的错误。原因是:Mac安装Ollama后,启动Ollama后会本地监听本地TCP的11434端口,但这个监听仅仅是本地层面的监听,无法被本地以外的主机访问,也就是无法被同网段的主机访问。如果其他主机需要访问的话,需要采用docker部署的方式,重新修改一个新的端口即可,同时对外开放相应的端口。

模型交互

命令行交互

在mac上启动命令行,可以将模型直接启动起来,进入对话模式。

ollama run deepseek-r1:7b

在交互模式下,输入/bye或按下Ctrl+d退出即可。

单次命令交互

通过管道将输入传递给相应的模型,模型进行输出,例如输入“什么是数学?”就可以用以下命令:

echo "什么是数学?" | ollama run deepseek-r1:7b

使用命令行参数

甚至还可以直接在命令行中传递输入以下内容,直接获得结果。

ollama run deepseek-r1:7b "撰写一份周报的模板"

使用文件交互,例如有一个文件是input_text_1.txt,内容是“什么是化学?”,那么通过这个符号<以及路径和文件就可以输入给模型,并且得到输出的结果。

ollama run deepseek-r1:7b </Users/zr9558/Documents/Datasets/text/input_text_1.txt 

自定义提示词

通过 Modelfile 定义自定义提示词或系统指令,使模型在交互中遵循特定规则。创建自定义模型,编写一个 Modelfile:

FROM deepseek-r1:7b SYSTEM "你是一个编程助手,专门帮助用户编写代码。"

创建自定义模型:

ollama create runoob-model -f ./Modelfile

运行自定义模型:

ollama run runoob-model

发送请求交互

通过curl命令可以看到当前端口启动的模型:

curl http://localhost:11434/api/tags

通过curl命令和相应的参数配置,可以实现发送请求给本地mac启动的模型。

curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "prompt": "什么是生物学?主要研究哪些方向?",
  "stream": false
}'

还可以增加更为复杂的参数进行curl请求,其中options里面就是模型的参数选择。

curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "prompt": "什么是生物学?主要研究哪些方向?",
  "stream": false,
  "options": {
    "temperature": 0.7,
    "max_tokens": 100
  }
}'

如果选择stream是true,则用流式进行输出,那么则是逐行输出,每一行的输出是就是词语或者汉字字符,把每一行的response汇总到一起就是最终的输出。

curl http://localhost:11434/api/generate -d '{
  "model": "gemma3:27b",
  "prompt": "用一句话介绍数学是什么?",
  "stream": true
}'

Python 交互

ollama提供了多种方式与Python代码进行交互,包括request,ollama SDK等。

requests 交互

可以直接使用Python的requests模块发送请求,并获得相应的结果。

import requests

# 生成文本
response = requests.post(
    "http://localhost:11434/api/generate",
    json={
        "model": "gemma3:27b",
        "prompt": "用一句话介绍什么是线性代数",
        "stream": False
    }
)
print(response.json())

另外,还可以这样去写代码:

import requests
response = requests.post(
    "http://localhost:11434/api/chat",
    json={
        "model": "gemma3:27b",
        "messages": [
            {
                "role": "user",
                "content": "用一句话描述什么是实变函数"
            }
        ],
        "stream": False
    }
)
print(response.json())

Ollama 交互

Ollama有python的SDK,可以使用python的版本,其GitHub源码链接是https://github.com/ollama/ollama-python。使用pip就可以完成安装:

pip install ollama

然后在Mac的PyCharm中使用以下代码,就可以发送请求给模型,进行结果的一次性返回:

from ollama import chat
from ollama import ChatResponse

response: ChatResponse = chat(model='gemma3:27b', messages=[
  {
    'role': 'user',
    'content': '用一句话介绍什么是泛函分析',
  },
])
# 打印响应内容
print(response['message']['content'])

print('-'*40)

# 或者直接访问响应对象的字段
print(response.message.content)

如果要做流式输出,则可以采用以下方法:

from ollama import chat

stream = chat(
    model='deepseek-r1:32b',
    messages=[{'role': 'user', 'content': '什么是数学分析?'}],
    stream=True,
)

# 逐块打印响应内容
for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)


ollama的chat 方法可以与模型进行对话生成,发送用户消息并获取模型响应:

import ollama

print(ollama.chat(model='gemma3:27b', messages=[{'role': 'user', 'content': '用一句话介绍:数学中的动力系统是什么?'}]))

输出以下内容:

model=’gemma3:27b’ created_at=’2025-04-15T02:56:36.041842Z’ done=True done_reason=’stop’ total_duration=3464291750 load_duration=48093500 prompt_eval_count=20 prompt_eval_duration=433924792 eval_count=22 eval_duration=2981754125 message=Message(role=’assistant’, content=’数学中的动力系统研究的是随时间变化的系统,尤其是系统状态如何随时间演变。\n’, images=None, tool_calls=None)

如果只需要输出message中content 的部分,则可以这样修改代码:

import ollama

print(ollama.chat(model='gemma3:27b', messages=[{'role': 'user', 'content': '用一句话介绍:数学中的动力系统是什么?'}]).message.content)

ollama的generate方法用于文本生成任务。与chat方法类似,但是它只需要一个prompt参数。同时,如果只需要查看response的时候,就可以参考以下代码:

import ollama

print(ollama.generate(model='gemma3:27b', prompt='用一句话介绍:数学中的常微分方程是什么?'))

print(ollama.generate(model='gemma3:27b', prompt='用一句话介绍:数学中的常微分方程是什么?').response)

ollama的list方法可以列出所有可用的模型:

import ollama print(ollama.list())

ollama的show方法可以显示指定模型的详细信息:

import ollama print(ollama.show('deepseek-r1:32b'))

ollama的embed方法可以输出文本嵌入:

import ollama

print(ollama.embed(model='deepseek-r1:32b', input='The sky is blue because of rayleigh scattering'))

print(ollama.embed(model='deepseek-r1:32b', input='The sky is blue because of rayleigh scattering').embeddings)

另外,ollama还有create(创建新模型)、copy(复制)、delete(删除)、pull(拉取)、push(推送到远端)等常用的方法。另外,还可以使用ps命令查看运行的模型:

import ollama
print(ollama.ps())

客户端

还可以创建自定义客户端,来进一步控制请求配置,比如设置自定义的 headers 或指定本地服务的 URL。通过 Client,用户可以自定义请求的设置(如请求头、URL 等),并发送请求。

from ollama import Client

client = Client(
    host='http://localhost:11434',
    headers={'x-some-header': 'some-value'}
)

response = client.chat(model='gemma3:27b', messages=[
    {
        'role': 'user',
        'content': '什么是生物学',
    },
])
print(response['message']['content'])

如果用户希望异步执行请求,可以使用AsyncClient类,适用于需要并发的场景。异步客户端支持与传统的同步请求一样的功能,唯一的区别是请求是异步执行的,可以提高性能,尤其是在高并发场景下。

import asyncio
from ollama import AsyncClient

async def chat():
    message = {'role': 'user', 'content': '用简单的语句描述工作中的日报有哪些内容?'}
    response = await AsyncClient().chat(model='gemma3:27b', messages=[message])
    print(response['message']['content'])

asyncio.run(chat())

如果用户需要异步地处理流式响应,可以通过将stream=True设置为异步生成器来实现。

import asyncio
from ollama import AsyncClient

async def chat():
    message = {'role': 'user', 'content': '用简单的语句描述工作中的日报有哪些内容?'}
    async for part in await AsyncClient().chat(model='gemma3:27b', messages=[message], stream=True):
        print(part['message']['content'], end='', flush=True)

asyncio.run(chat())

文章总结

Ollama 是一个本地大模型运行框架,致力于让开发者在个人设备上快速部署和使用各类开源大语言模型(如 LLaMA、Mistral、Gemma、DeepSeek等)。它通过极简的 CLI 命令(如 ollama run llama3),帮助用户在无需复杂环境配置的情况下,一键拉起本地模型。Ollama 提供了统一的模型管理、会话API和内存管理机制,是开发者测试、原型开发、本地私有化部署的理想工具,也适合作为RAG、Agent框架中的模型后端接入点。

参考资料

  1. 官网链接:https://ollama.comhttps://ollama.org.cn
  2. GitHub地址:https://github.com/ollama/ollama
  3. Ollama中文文档:https://ollama.readthedocs.io/quickstart/
  4. Ollama教程:https://www.runoob.com/ollama/ollama-tutorial.html
  5. Ollama中文文档:https://ollama.readthedocs.io
  6. LlamaFactory:https://www.llamafactory.cn