“我的AI是个健忘症?“三步打造会记住一切的智能助手:RAG→agentic RAG→agent memory

Agentic AI实战手册:从单体Agent到生产落地的工程化指南 Agentic AI不是更聪明的API,而是具备感知-认知-行动-学习闭环的自主智能体。其核心在于状态驱动的决策机制与可调试的模块化架构,而非简单调用LLM。当前主流框架如LangChain、LangGraph和AutoGen均围绕这一原理构建,但真正决定落地成败的是工程细节:工具幂等性设计、prompt工业化(含system prompt硬约束与error-correction示例)、结构化输出解析,以及基于真实反馈的经验回放式学习。它已广泛应用于客服自动化、工单处理、合规响应等企业级场景,尤其适合需人机 阅读详情

多 Collection 隔离 + 混合索引 + 动态 CRUD架构

最近在技术社区看到一个常见问题:为什么我的 AI 助手明明安装了向量数据库,但无法记住历史对话?

原因在于,采用RAG 架构的AI助手,最初只是为 LLM 提供外部知识查询能力,不是为动态记忆管理设计的。

那么拥有动态记忆的AI助手要如何搭建,RAG架构、agentic RAG、agent的演化路线是如何的,我们要如何对其进行选型以及记忆能力的配置?

本文将梳理从 RAG 到智能体记忆的演进路径,以及 Milvus 在每个阶段的核心使用方式。

01

第一阶段:RAG——只读的外部知识库

RAG 的本质是什么?

RAG(检索增强生成)本质就是给 LLM 配备外部知识库,让它回答问题前先查询资料。2020 年 Lewis 等人提出这个概念,用于解决 LLM 的知识截止日期问题。

RAG 的工作流程:先在离线阶段将文档切分成小块并转换为向量存入数据库,运行时将用户问题也转换为向量并检索最相似的 Top-K 文档,最后将检索结果和用户问题一起输入 LLM 生成答案。

不难发现,在实现 RAG 时,最大的技术挑战是:如何在百万级/亿级向量中实现毫秒级检索?

传统数据库在这个场景下存在明显短板,要么不支持向量索引,要么只采用简单的向量检索插件,在百万级数据上检索延迟巨大,无法满足实时性要求。

Milvus在内向量数据库则可以 提供专业的向量索引(HNSW、IVF_FLAT 等),做到百亿数据的毫秒级延迟。

Milvus 实现 RAG 的核心代码如下:

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import openai
# ===== 工具函数:统一的向量化接口 =====
def embed(text):
    """将文本转换为向量"""
    response = openai.Embedding.create(
        input=text,
        model="text-embedding-ada-002"
    )
    return response["data"][0]["embedding"]
# ===== 步骤1:连接Milvus并创建Collection =====
connections.connect(host="localhost", port="19530")
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="source", dtype=DataType.VARCHAR, max_length=512),
]
schema = CollectionSchema(fields=fields, description="RAG Knowledge Base")
collection = Collection(name="rag_knowledge", schema=schema)
# ===== 步骤2:创建索引 =====
index_params = {
    "index_type": "HNSW",
    "metric_type": "COSINE",
    "params": {"M": 16, "efConstruction": 256}
}
collection.create_index(field_name="embedding", index_params=index_params)
# ===== 步骤3:离线索引——批量插入文档 =====
def ingest_documents(documents):
    """批量插入文档到向量库"""
    texts = []
    embeddings = []
    sources = []
    for doc in documents:
        texts.append(doc["text"])
        embeddings.append(embed(doc["text"]))
        sources.append(doc["source"])
    data = [texts, embeddings, sources]
    collection.insert(data)
    collection.flush()  # 确保数据持久化
    print(f"✅ 已索引 {len(documents)} 条文档")
# ===== 步骤4:在线检索——RAG查询 =====
def rag_retrieval(query, top_k=5):
    """传统RAG检索:每次必检索"""
    collection.load()  # 加载到内存
    query_embedding = embed(query)
    search_params = {"metric_type": "COSINE", "params": {"ef": 100}}
    results = collection.search(
        data=[query_embedding],
        anns_field="embedding",
        param=search_params,
        limit=top_k,
        output_fields=["text", "source"]
    )
    return results[0]
# ===== 使用示例 =====
docs = [
    {"text": "Milvus是开源向量数据库,支持HNSW索引", "source": "docs/intro.md"},
    {"text": "RAG通过检索增强生成提升LLM能力", "source": "docs/rag.md"}
]
ingest_documents(docs)
results = rag_retrieval("什么是向量数据库?")
for hit in results:
    print(f"相似度: {hit.score:.3f} | 内容: {hit.entity.get('text')}")
通过以上架构示意图和代码,我们可以发现,在传统的simple RAG架构中,每次查询都强制检索,并且知识库在离线阶段构建后运行时无法更新,且所有知识来自同一向量库无法动态切换数据源。

这些问题的根源在于:RAG 把检索当作必选项,而不是可选的精细化分类的工具。

这些问题在简单问答场景影响不大,但在复杂智能体系统中会成为瓶颈。

那么能否让系统像人类一样,根据问题类型决定是否需要查资料?这就是agentic RAG 的核心思想。

02

第二阶段:agentic RAG —按需检索

传统simple RAG 每次查询都强制调用检索,不管是否真的需要额外知识。agentic RAG的突破是:把检索变成可选工具,Agent 自主决策是否需要检索、检索什么来源、结果是否可信。

相应的,在这个过程中,我们需要引入多 Collection 架构。

因为,单 Collection 架构存在明显问题:检索结果混杂不同领域内容,不同领域的向量混在同一语义空间导致召回准确率下降,且无法针对不同类型知识设置差异化检索策略。

多 Collection 方案的优势在于:每个领域独立索引(product_docs、api_reference、customer_cases等),Agent 根据问题类型精准路由,不同领域使用同的索引参数和过滤条件。

下面通过实际代码展示如何用 Milvus 实现这套多 Collection 架构。

核心要点是:为每个领域创建独立 Collection,Agent 根据问题类型动态路由检索。

from pymilvus import connections, Collection
connections.connect(host='localhost', port='19530')
# ===== 创建多个专业领域的Collection =====
class MultiSourceRAG:
    def __init__(self):
        self.collections = {
            "product_docs": Collection("product_docs"),      # 产品文档
            "api_reference": Collection("api_reference"),    # API参考
            "customer_cases": Collection("customer_cases"),  # 客户案例
            "tech_blogs": Collection("tech_blogs")           # 技术博客
        }
        # 加载所有Collection到内存
        for coll in self.collections.values():
            coll.load()
# ===== Agent决策:智能检索路由 =====
def smart_retrieve(question, agent_decision):
    """
    Agent决策示例:
    {
        "need_retrieval": True,
        "target_collections": ["api_reference", "tech_blogs"],
        "top_k": 5,
        "filters": {"publish_date": ">= 2024-01-01"}
    }
    """
    if not agent_decision["need_retrieval"]:
        return []  # Agent判断不需要检索
    rag = MultiSourceRAG()
    results = []
    for coll_name in agent_decision["target_collections"]:
        collection = rag.collections[coll_name]
        # 构建动态过滤表达式
        filter_expr = None
        if "filters" in agent_decision:
            filters = agent_decision["filters"]
            if "publish_date" in filters:
                filter_expr = f'publish_date {filters["publish_date"]}'
        # 执行检索
        search_params = {"metric_type": "IP", "params": {"nprobe": 16}}
        search_results = collection.search(
            data=[embed(question)],
            anns_field="embedding",
            param=search_params,
            limit=agent_decision["top_k"],
            expr=filter_expr,  # Milvus支持标量过滤
            output_fields=["text", "source", "publish_date"]
        )
        results.extend(search_results[0])
    return results
# ===== 检索质量评估 =====
def retrieve_with_quality_check(question, threshold=0.7):
    """Agent评估检索质量,决定下一步行动"""
    collection = Collection("product_docs")
    collection.load()
    results = collection.search(
        data=[embed(question)],
        anns_field="embedding",
        param={"metric_type": "IP", "params": {"nprobe": 16}},
        limit=5
    )
    # 过滤低质量结果
    high_quality_results = [
        hit for hit in results[0] 
        if hit.score >= threshold
    ]
    # Agent决策
    if not high_quality_results:
        return {"action": "FALLBACK_TO_WEB_SEARCH", "reason": "本地知识库召回质量不足"}
    return {"action": "USE_RESULTS", "data": high_quality_results}

尽管agentic RAG 在检索决策上实现了突破,但仍有一个核心问题未解决:

智能体 RAG 的核心问题未解决:知识库依然是只读的。Agent 可以决定什么时候读、读什么,但不能写入新知识、更新旧知识、删除过时知识。这引出了下一阶段:agent memory系统。

03

第三阶段:agent memory

Agent 记忆需要完整的 CRUD 能力:实时保存对话中的偏好和事件,检索历史会话中的相关记忆,修正用户提供的新信息,清理过期或无效记录。这要求底层存储系统支持运行时的写入和更新操作。

但是实践中,不同类型的记忆无法使用统一策略。比如,用户说"我喜欢简洁的回复"是长期偏好,需保留数月甚至数年;但"今天天气怎么样"这类对话只需保留几天。

如果混合存储,会导致:查询"用户沟通偏好"时结果混杂大量无关对话,检索精度下降;无法设置差异化过期策略,要么误删长期偏好,要么历史对话无限膨胀拖垮性能。

解决方案是按生命周期分类:程序性记忆 Collection 存储长期偏好(importance > 0.8);情景记忆 Collection 存储对话历史(30-90 天过期);语义记忆 Collection 存储事实知识(长期有效可修正)。

以下是借助Milvus 实现多 Collection 隔离 + 混合索引 + 动态 CRUD架构如何应用于agent memory的参考。

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
from datetime import datetime
connections.connect(host='localhost', port='19530')
# ===== Collection Schema定义 =====
def create_memory_collection(name, description):
    """创建标准化的记忆Collection"""
    fields = [
        FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
        FieldSchema(name="user_id", dtype=DataType.VARCHAR, max_length=64),
        FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=5000),
        FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
        FieldSchema(name="importance", dtype=DataType.FLOAT),
        FieldSchema(name="created_at", dtype=DataType.INT64),
        FieldSchema(name="metadata", dtype=DataType.JSON),
    ]
    schema = CollectionSchema(fields=fields, description=description)
    collection = Collection(name=name, schema=schema)
    # 创建向量索引
    collection.create_index(
        field_name="embedding",
        index_params={"index_type": "HNSW", "metric_type": "IP", "params": {"M": 16}}
    )
    # 创建标量索引(加速user_id过滤)
    collection.create_index(field_name="user_id", index_params={"index_type": "TRIE"})
    collection.load()
    return collection
# ===== 初始化三种记忆类型 =====
class AgentMemorySystem:
    def __init__(self):
        self.procedural_memory = create_memory_collection(
            "procedural_memory", "用户偏好与行为规则"
        )
        self.episodic_memory = create_memory_collection(
            "episodic_memory", "对话历史与事件记录"
        )
        self.semantic_memory = create_memory_collection(
            "semantic_memory", "事实性知识"
        )
memory_system = AgentMemorySystem()
核心操作:记忆写入(Create)
def store_memory(memory_type, user_id, content, importance=0.5, metadata=None):
    """实时写入记忆"""
    # 选择对应的Collection
    if memory_type == "procedural":
        collection = memory_system.procedural_memory
    elif memory_type == "episodic":
        collection = memory_system.episodic_memory
    else:
        collection = memory_system.semantic_memory
    # 准备数据
    data = [{
        "user_id": user_id,
        "content": content,
        "embedding": embed(content),
        "importance": importance,
        "created_at": int(datetime.now().timestamp()),
        "metadata": metadata or {}
    }]
    # 实时插入
    collection.insert(data)
    collection.flush()  # 确保持久化
    print(f"✅ 已存储{memory_type}记忆: {content[:50]}...")
# ===== 使用场景 =====
# 场景1:Agent从对话中提取用户偏好
store_memory(
    memory_type="procedural",
    user_id="user_123",
    content="用户喜欢简洁的回复,多用emoji",
    importance=0.8,
    metadata={"category": "communication_style"}
)
# 场景2:记录对话事件
store_memory(
    memory_type="episodic",
    user_id="user_123",
    content="用户提到10月30日要去巴黎旅行,需要推荐景点",
    importance=0.9,
    metadata={"event_type": "travel_plan", "date": "2024-10-30"}
)
# 场景3:存储事实性知识
store_memory(
    memory_type="semantic",
    user_id="user_123",
    content="埃菲尔铁塔位于法国巴黎,高330米,建于1889年",
    importance=0.7,
    metadata={"entity": "埃菲尔铁塔", "source": "wikipedia"}
)
核心操作:记忆检索(Read)
def retrieve_memories(user_id, query, memory_type="all", top_k=5, min_importance=0.3):
    """智能记忆检索:支持多类型+过滤"""
    query_embedding = embed(query)
    results = {}
    # 构建过滤表达式(用户隔离 + 重要性过滤)
    filter_expr = f'user_id == "{user_id}" && importance >= {min_importance}'
    search_params = {"metric_type": "IP", "params": {"ef": 100}}
    # 选择要检索的Collection
    collections_to_search = []
    if memory_type in ["all", "procedural"]:
        collections_to_search.append(("procedural", memory_system.procedural_memory))
    if memory_type in ["all", "episodic"]:
        collections_to_search.append(("episodic", memory_system.episodic_memory))
    if memory_type in ["all", "semantic"]:
        collections_to_search.append(("semantic", memory_system.semantic_memory))
    # 执行检索
    for mem_type, collection in collections_to_search:
        search_results = collection.search(
            data=[query_embedding],
            anns_field="embedding",
            param=search_params,
            limit=top_k,
            expr=filter_expr,
            output_fields=["content", "importance", "created_at", "metadata"]
        )
        results[mem_type] = search_results[0]
    return results
# ===== 使用场景 =====
memories = retrieve_memories(
    user_id="user_123",
    query="用户想了解巴黎旅游信息",
    memory_type="all",
    min_importance=0.7
)
print("🧠 召回的记忆:")
for mem_type, hits in memories.items():
    print(f"\n【{mem_type}】:")
    for hit in hits[:2]:
        print(f"  相似度: {hit.score:.3f} | {hit.entity.get('content')[:60]}...")
核心操作:记忆更新与删除(Update & Delete)
def update_memory(collection, memory_id, new_content, new_importance=None):
    """
    更新记忆(Milvus 2.3+支持upsert)
    注意:生产环境需考虑一致性问题
    当前"先删后插"方案存在风险:
    - 删除成功但插入失败 → 记忆丢失
    - 并发更新 → 数据竞争
    推荐:使用Milvus的upsert操作(原子性)
    """
    # 先删除旧记忆
    collection.delete(expr=f"id == {memory_id}")
    # 插入新记忆
    data = [{
        "content": new_content,
        "embedding": embed(new_content),
        "importance": new_importance or 0.5,
        "created_at": int(datetime.now().timestamp())
    }]
    collection.insert(data)
    collection.flush()
def forget_memory(collection, criteria):
    """
    选择性遗忘记忆
    策略示例:
    - 时间衰减:删除90天前的低重要性情景记忆
    - 置信度过滤:删除置信度<0.6的语义记忆
    """
    # 示例:删除过期的情景记忆
    if "older_than_days" in criteria:
        cutoff_time = int(datetime.now().timestamp()) - criteria["older_than_days"] * 86400
        filter_expr = f"created_at < {cutoff_time} && importance < {criteria.get('min_importance', 0.5)}"
        collection.delete(expr=filter_expr)
        print(f"🗑️ 已清理 {criteria['older_than_days']} 天前的低重要性记忆")
# ===== 使用场景 =====
# 场景1:用户修正信息
update_memory(
    collection=memory_system.episodic_memory,
    memory_id=12345,
    new_content="用户旅行时间改为11月15日",
    new_importance=0.9
)
# 场景2:定期清理过期记忆
forget_memory(
    collection=memory_system.episodic_memory,
    criteria={"older_than_days": 90, "min_importance": 0.4}
)

04

三个阶段的本质差异

以下是从 RAG 到记忆的技术演进总结

回顾整个演进过程,核心变化体现在两个维度:数据更新时机和操作权限。

传统 RAG 的知识库在离线阶段完成索引构建,运行时只支持查询操作。如果知识内容需要更新,必须停止服务重新构建索引。

agentic RAG 引入了检索决策机制。系统会先判断是否需要检索、以及从哪个数据源检索,避免了无效查询。但数据本身依然是只读的,运行时无法修改知识库内容。

Agent memory 阶段实现了关键突破:系统具备了运行时的写入能力。它可以在对话过程中创建新记忆、更新过期信息、删除无用记录。这种从只读到读写的转变,使得系统能够动态维护用户的个性化知识库。

回顾这三个阶段的演进,有个反直觉的发现:技术难度在下降,工程难度在上升。

传统 RAG 的核心是怎么检索得更准——索引算法、相似度计算。到了智能体记忆阶段,技术问题反而简单了(Milvus 把 CRUD 都封装好了),真正棘手的是工程决策:什么信息值得记?记多久?什么时候更新?什么时候忘掉?

实际项目中,很多团队没想清楚记忆策略。用户的随口抱怨要不要记?记错了怎么办?三个月不登录的用户,记忆要不要清理?

这些问题没有标准答案,完全取决于业务场景。真正的壁垒是对用户记忆管理的理解深度。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

零基础6个月掌握Agent开发:Python+RAG+LLM工程实战路线 Agent(智能体)是当前大模型落地的核心架构范式,其本质是将LLM作为能力引擎,通过Python进行任务编排、状态管理与工具调度。RAG(检索增强生成)为其提供可控知识边界与业务记忆,而Prompt Engineering则是定义LLM行为的结构化协议。三者协同构成可部署、可测试、可运维的生产级智能系统。本文聚焦中小型企业真实交付场景,以‘法律咨询预审’‘会议纪要生成’等典型应用为切口,详解如何用Python原生能力构建低依赖、高可控的Agent流水线,尤其适合无算法背景但具备逻辑思维的学习者快速切入LL 阅读详情

相关推荐

论文(一) Harness-1. 基于智能体的上下文工程:让大模型通过“不断升级攻略本”来实现自我进化(ACE)

将上下文视为不断演进的“战术手册”(Playbooks),通过生成、反思和策展(Curation)的模块化流程,来积累、精炼并组织策略。

weixin_40614311的博客 399

Agentic AI基础设施实践经验系列(三):Agent记忆模块的最佳实践

本文探讨了大语言模型在记忆处理方面的局限性,分析了Agent应用中记忆模块的必要性及其核心功能。文章系统介绍了短期记忆和长期记忆的差异,详细阐述了记忆管理的四个关键环节:记忆产生、策略、存储和检索。同时,对比了Mem0、Letta、LangMem等主流开源记忆框架的特点,并介绍了亚马逊云科技BedrockAgentCore提供的托管记忆解决方案。最后强调记忆机制对构建具有认知连续性的下一代智能体的重要性,为开发者提供了构建高效记忆系统的技术指导和实践方案。

亚马逊云科技专栏 1499

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品)

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品)

jks212454的博客 205

上下文工程:AI对话系统的记忆管理革命

在人工智能领域,上下文管理是提升大语言模型(LLM)实用性的关键技术。传统对话系统面临上下文窗口限制、成本压力和性能下降等挑战,而上下文工程通过动态信息管理方法论解决了这些问题。该技术包含检索增强生成(RAG)、长序列优化和智能记忆管理等核心组件,能够有效处理多轮对话、复杂任务和多Agent协作场景。在工程实践中,AWS Bedrock和AgentCore等平台提供了企业级上下文管理能力,支持分层存储、动态衰减等优化策略。随着Agentic AI的发展,上下文工程在工具集成、多模态融合等方面展现出更大价值,

weixin_33698823的博客 415

Cesium实战:全球海洋动态水面与自定义区域波浪效果实现

本文详细介绍了在Cesium中实现全球海洋动态水面与自定义区域波浪效果的实战方法。通过解析核心概念Primitive与Geometry,并深入讲解Water材质的关键参数调节,指导开发者快速创建逼真的动态海洋。文章重点阐述了如何利用多边形坐标定义不规则图形区域,实现精准的局部水域波浪效果,并提供了性能优化与视觉提升的实用技巧。

weixin_29256771的博客 501

第一次面试经历:集创北方数字IC前端面试(崩)总结

时间:2020年8月11日上午10点 公司:集创北方,做LED、LCD、OLED、AMOLED等显示器芯片的公司,应该主要是做显示驱动、图像处理、电源管理等这一块。 岗位:数字IC前端设计 城市:北京 形式:线上面试。感觉我俩是两个社畜,他说摄像头开不开都可以,我说那语音OK吗他说OK,于是直接语音问答。 项目经历:基于FPGA的车牌识别 & 先导存储器集成工艺开发(课题组) & 基于FPGA的贪吃蛇小游戏 反正是凉凉的,这时候准备还不足,前面都在复习项目没怎么刷过题。 过程如下: 自我介绍

coin的博客 6680

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 224

Veritas NetBackup 10.1 Windows安装指南:从账户配置到完整部署

本文详细介绍了Veritas NetBackup 10.1在Windows系统上的完整安装流程,从账户配置到部署验证。重点讲解了创建专用服务账户、安装组件选择、许可证输入等关键步骤,并提供了常见问题排查和进阶配置建议,帮助用户顺利完成企业级备份解决方案的部署。

weixin_26765287的博客 454

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 398

生物信息学避坑指南:Scissor算法参数alpha和cutoff的黄金设置法则

本文深入解析了生物信息学中Scissor算法的关键参数alpha和cutoff的黄金设置法则,帮助研究者有效整合bulk RNA与单细胞数据,识别单细胞亚群。通过实战验证的调参策略,避开常见陷阱,获得可靠的生物学发现,特别适用于肿瘤异质性研究和免疫细胞分型等场景。

weixin_33734785的博客 451

Rust 编译工具链配置指南:从 link.exe 缺失到完美解决

本文详细解析了Windows下Rust编译时常见的'link.exe not found'错误,提供了MSVC和MinGW-w64两种工具链的完整配置指南。从Visual Studio组件安装到环境变量设置,再到疑难排查技巧,帮助开发者彻底解决Rust编译工具链配置问题,提升开发效率。

earth的博客 319

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

cesium 综合教程200+【目录】(已包含186篇文章)

cesium示例教程100+旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。目录中有链接的为已有文章,没链接的为目标文章,不断更新中…

大剑师兰特的GIS世界 8893

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 246

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2584

训练YOLOv11 | Pytorch和Pycharm的安装教程适用W11系统(附详细的系统变量添加过程)

根据你之前下载的版本选择对应的选项即可,然后复制底下的绿色代码到Anaconda的命令行输入即可(这里要在你安装的python环境里进行安装,例如我的环境名字是PyTorch,那么就是activate PyTorch里进行安装)然后同之前一样会加载一会,然后会询问我们是否下载配件,我们输入Y等待即可(下载过程中我们要确保网络通常如果有波动可能会下载失败)。类似于我的电脑是Windows11选择上面红框内的选项即可点击后即下载,(注意这里下载的是zip文件)下载完成后复制下面几个文件。

Snu77的博客 1万+

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 500

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 201

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 558

AI前沿日报 · 2026-11-04 | 祛魅时刻:Astra“纯读权重“神话的崩塌

①Astra"裸权重通吃"被spaCy创始人Honnibal精准祛魅——仅1/3实验真裸读,数学能力提升依赖Python+50次迭代;②Simon Willison用Qwen 3.8-27B端侧复现权重空间编程;③Nvidia开源Auto-Ontology自动知识图谱;④$800开源全域抓取机器人Stringman;⑤OpenAI悄然重开Codex训练开关引信任危机;⑥DeepMind发布Gemini 4 Argon机器人基础模型;⑦美国科技巨头隐性AI债务达3.2万亿美元,6个月增90%。

johnsong2009的博客 573

大模型 Embedding 与向量相似度详解

Embedding 解决的问题:计算机不懂文字,但懂数字│▼文本 → 向量(1024维浮点数数组)│▼相似度解决的问题:怎么判断两个向量(文本)有多接近│▼余弦相似度:看向量方向的夹角,越接近0°越相似│▼最终效果:语义搜索——理解意思,而非字面匹配一句话总结:Embedding 把文字变成数字,余弦相似度比较数字的方向,两者结合实现了"理解语义"的搜索。

T3165919332的博客 90

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 278

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 640

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 338

语音识别与语音合成的技术原理及应用

语音识别 #语音合成 #人工智能 #大模型。语音识别与语音合成的技术原理及应用。一、语音识别的核心原理。二、语音合成的核心原理。三、工程落地的主要难点。五、需要关注的现实问题。

weixin_62919816的博客 210
上一篇: LangChain大模型操作数据库全攻略:从MCP到Tools再到SQL生成,一篇搞定大模型与数据库交互!
下一篇: AI黑科技:DRAG让RAG“懂“同义词,准确率飙升10.6%!代码已开源
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值