最近整理了一下自己的技术文章撰写记录,忽然发现一个有点惊讶的事实:在过去的 2025 年 4 月份,我已经输出了五六篇与 AI 大模型相关的技术内容,覆盖了 RAG、Ollama、Milvus 等方法和开源框架。而再往前看一年多的时间里,我也不过断断续续写了两三篇技术文章。
是我变了吗?也许个人确实有一点变化。但更关键的,是我所处的技术氛围变了。
以前的节奏更偏稳定,任务导向混乱,创新探索非常稀缺,每个团队的能力形成了一个又一个的孤岛。很多 AI 新技术的讨论停留在“看看”、“以后试试”,大家对大模型也多是远观式的接触,能够用聊天框进行沟通和写代码就已经算是使用 AI 了,跟不懂技术的人使用 AI 毫无区别;要是能够调个开源的接口,能问问 ChatGPT,就算是了解了 AI。即便 AI 大模型有新技术冒头,在原有的工作氛围下,也很难真正在团队中找到一个可以深聊、共创的空间。过去的技术氛围是偏稳的,项目也多是用熟不求新,甚至使用了一些错误的开源框架在做事情。虽然也挂着“AI”、“智能化”这样的口号,但实际落地的内容往往止步于一些传统模型调用,或者是基于既有框架的功能叠加,创新空间不大。一旦想研究点新东西,经常会被劝“先把业务做完”、“先进行项目交付”等。
在以前的环境中,大家的技术分享也流于形式,更多是一种 KPI 式的应付,毕竟在工作时间内技术专家也不允许组织和进行技术分享,只能在晚上加班和周末时间来进行义务分享。长期以往,每个人在进行分享的时候只是为了完成工作任务,而不是出于真正的热情与沉淀。大家的精力毕竟也是有限的,没有人有心情一直在额外的时间内完成一些 KPI 式的工作任务,而且这些工作任务甚至都不能算作工作量,而且在某些管理者眼里面 AI 也只能够作为锦上添花,算不上团队的核心交付。在这种工作氛围中,持续干技术类型的活也是持续让自己减值,而不是升值。
直到最近一个月,我主动进入了一个真正密度极高的技术环境。信息流是动态的、实时的、扎实的。在这个大环境下,不是谁在刻意地展示自己的工作成果,而是每个人都在不停地参与和使用开源模型。开源社区的演化轨迹、最新论文的细节实现、从 API 到落地系统的技术栈差异……几乎每天我都在打开一个新的窗口。很多以前我以为很遥远的东西,现在成了每天要接触、要思考、要尝试的日常工作。
近年来,大语言模型如 GPT、LLaMA、Claude、Gemini、DeepSeek 等在自然语言处理任务中展现出前所未有的能力,已经成为技术界与产业界关注的核心。从算法模型到软件产品,从科研论文到应用落地,大模型不仅改变了人们对人工智能的认知,也正在重塑整个技术生态。在任何行业都面临着这场来自于 AI 的挑战,无论是互联网、新能源汽车还是农业,都有着许多实际的场景等待 AI 的接入。对于有机器学习和深度学习基础,甚至在工业界具备小模型实践经验的算法工程师而言,进入大模型的世界,不仅是一场技术能力的升级,更是一场思维范式的转变,不及时转型大模型的话,可能未来在市场中的就业前景会比较差。
对于有小模型研发经验的工程师来说,大模型并不是从零开始的挑战。你原有的数据处理能力、模型评估习惯、工程部署经验,依然在大模型系统中非常有价值。唯一需要转变的,是工程思维的广度和系统设计的复杂度。在大模型时代,更多的是系统级 AI 架构思维,而不仅是模型本身的精调。与此同时,大模型也能反过来助力你的日常开发,从代码生成到接口设计、测试覆盖,模型本身可以成为你高效工作的伙伴。
在 Milvus 中,数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户,你可以创建多个数据库,为不同的应用程序或租户从逻辑上隔离数据。例如,创建一个数据库用于存储用户 A 的数据,另一个数据库用于存储用户 B 的数据。它支持Python、Go、Java、NodeJS等语言去操作数据库。
可以使用 Milvus RESTful API 或 SDK 列出所有现有数据库并查看其详细信息。同时,还可以管理数据库的属性,包括更改、删除等操作。
# 从 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") # 文本内容
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]
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") # 对应的文档内容
大模型(Large Language Models,LLMs)的发展经历了从小规模模型到如今大规模、深度学习技术不断突破的过程。最早的语言模型主要依赖规则和手工特征,虽然能够进行一定的语言理解和生成,但缺乏足够的灵活性和准确性。随着深度学习的兴起,尤其是深度神经网络的应用,大规模语言模型开始崭露头角。
从最初的GPT(Generative Pre-trained Transformer)到BERT(Bidirectional Encoder Representations from Transformers)再到如今的GPT-4、DeepSeek-R1等,语言模型的规模和能力迅速提升。大模型通常包含数十亿到数百亿个参数,通过海量数据进行预训练,能够捕捉到语言中的复杂关系和语境信息。大模型的预训练使其具备了强大的迁移学习能力,能够在多个任务上取得优秀的性能,无论是文本生成、问答、翻译还是推理任务。大模型的发展不仅在技术层面突破了许多原有的限制,还在应用上带来了巨大的变革。比如,基于大模型的自然语言处理技术已经广泛应用于智能助手、自动翻译、内容生成等领域,极大地提高了人机交互的效率和质量。从自然语言处理的发展历程来看,LLM已经是近期最热门的研究方向之一。
LLM 原始训练数据集之外的新数据称为外部数据。它可以来自多个数据来源,例如 API、数据库或文档存储库。数据可能以各种格式存在,例如文件、数据库记录或长篇文本。另一种称为嵌入语言模型的 AI 技术将数据转换为数字表示形式并将其存储在向量数据库中。这个过程会创建一个生成式人工智能模型可以理解的知识库。
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.
Gao Y, Xiong Y, Zhong Y, et al. Synergizing RAG and Reasoning: A Systematic Review[J]. arXiv preprint arXiv:2504.15909, 2025.
Li X, Jia P, Xu D, et al. A Survey of Personalization: From RAG to Agent[J]. arXiv preprint arXiv:2504.10147, 2025.
Arslan M, Ghanem H, Munawar S, et al. A Survey on RAG with LLMs[J]. Procedia Computer Science, 2024, 246: 3781-3790.
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 提供 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)
class Calculator:
"""This class performs basic arithmetic operations."""
pass
函数和方法:为每个函数和方法提供文档字符串,描述其作用、参数和返回值。
def add(a, b):
"""
Add two numbers and return the result.
Parameters:
a (int or float): The first number.
b (int or float): The second number.
Returns:
int or float: The sum of a and b.
"""
return a + b
独角戏固然精彩,然而软件系统的产品设计、开发、运维、迭代,从来都不是一人秀。曾有一位开发者与少数几位小伙伴默契配合,用心构建起一整套系统。从需求调研、架构设计到功能落地,最后实现了项目的交付,每一次的迭代、每一天的开发都倾注了他们的心血与智慧。在那段日子,代码仓库里留下了他们无数次提交的痕迹,客户端、数据库、服务端与 web 前端紧密协作,多种存储与数据库组件共同支撑业务平稳运行——这是一曲动人的合奏。