本地大模型记忆系统SA3P:基于向量数据库与嵌入模型的语义检索实践

news2026/5/6 9:54:21
1. 项目概述一个为本地大模型应用量身定制的“记忆中枢”如果你正在本地部署大语言模型无论是为了个人知识库、智能客服还是创意写作助手一个核心的痛点很快就会浮现模型没有记忆。每次对话都像初次见面你需要反复提供背景信息这不仅效率低下也完全不符合人类自然的交流方式。ccheshirecat/sa3p这个项目就是为了解决这个“健忘症”问题而生的。简单来说sa3p是一个专为本地大模型应用设计的记忆存储与检索系统。你可以把它想象成一个超级智能的“对话秘书”。它不参与模型本身的推理而是负责在后台默默工作记录你和模型每一次交互的上下文将这些海量的对话、文档信息打碎、理解并结构化地存储起来。当新问题到来时它能瞬间从“记忆库”中精准找出最相关的历史片段作为背景信息喂给大模型从而实现连续、有深度的对话。它的名字“SA3P”听起来很技术其核心思想却非常直观——让AI记住你理解你并基于对你的了解提供更贴切的回答。无论你是开发者想要构建一个更智能的本地AI应用还是极客玩家希望自己的个人AI助手更“懂你”这个项目都提供了至关重要的基础设施。2. 核心架构与设计哲学为什么是向量数据库与嵌入模型2.1 从“关键词匹配”到“语义理解”的范式转变传统的搜索或记忆系统比如基于数据库的查询依赖的是精确的关键词匹配。你输入“苹果”它只会找到字面上包含“苹果”的记录。但在人类语言和AI对话中问题要复杂得多。“我喜欢吃一种水果它很红乔布斯也喜欢”这句话里根本没有“苹果”这个词但我们人类能瞬间理解。sa3p要实现的就是这种“语义理解”级别的记忆检索。它的技术栈选择清晰地反映了这一目标向量数据库和文本嵌入模型。这是当前解决语义搜索问题最成熟、最高效的方案组合。文本嵌入模型的作用是将一段文本无论是一个句子、一段对话还是一整篇文档转换成一个高维空间中的点也就是一个“向量”。这个向量的神奇之处在于语义相似的文本它们的向量在空间中的位置也接近。比如“苹果公司发布新手机”和“iPhone 15 上市”这两个句子的向量就会靠得很近。2.2 技术选型背后的逻辑sa3p项目默认或典型地会采用如ChromaDB、Qdrant或Weaviate这类轻量级、高性能的向量数据库。为什么是它们首先开发友好与本地化。这些数据库通常可以纯本地运行无需复杂的服务端部署一个Python包就能启动完美契合本地大模型应用的场景。它们提供了简单的API让开发者能快速实现向量的存储、索引和查询。其次性能与精度平衡。它们内置了高效的近似最近邻搜索算法如HNSW。简单理解如果你要在亿万个点里找到离某个点最近的10个点精确计算距离是不现实的。HNSW这类算法通过构建一种“高速公路网络”式的索引能以极高的速度和可接受的精度找到近似最近邻这对于需要实时检索的对话应用至关重要。最后生态整合。这些向量数据库与主流的AI框架和嵌入模型有很好的集成sa3p可以相对轻松地接入不同的模型比如sentence-transformers库里的各种预训练模型或者直接使用OpenAI的嵌入API虽然这脱离了纯本地范畴。注意选择嵌入模型时需要在效果、速度和模型大小之间权衡。对于本地部署像all-MiniLM-L6-v2这类模型是常见选择它在效果和资源消耗上取得了很好的平衡。如果追求更高精度可以考虑更大的模型但这会消耗更多内存和计算时间。2.3 工作流全景图理解了核心组件我们来看sa3p是如何协同工作的记忆写入索引对话发生用户与AI模型进行了一轮问答。文本处理sa3p捕获这段对话文本。它可能会进行一些预处理比如清洗、分段将长文本切成语义完整的短片段。向量化预处理后的文本片段被送入嵌入模型生成对应的向量。存储将(向量, 原始文本, 元数据)作为一个整体存入向量数据库。元数据可能包括时间戳、对话ID、用户ID等便于后期筛选。记忆读取检索新问题到来用户提出了一个新问题。查询向量化将新问题同样通过嵌入模型转化为查询向量。语义搜索在向量数据库中寻找与查询向量最相似的若干个存储向量即最相关的历史记忆片段。上下文组装将检索到的原始文本片段按照相关性排序组装成一段连贯的提示上下文。交付推理将“历史上下文 新问题”一起提交给大语言模型模型便能基于“记忆”生成回答。这个流程使得大模型不再是“金鱼”而是一个有了“工作记忆”的智能体。3. 核心细节解析与实操要点3.1 记忆的“切片”艺术如何预处理文本原始对话或文档是一整块文本直接将其向量化存储效果很差。想象一下把一整章书变成一个向量当查询其中某个具体概念时这个“大向量”的匹配精度会很低。因此文本分块是sa3p中至关重要且充满技巧的一环。固定长度重叠分块这是最常用的方法。设定一个固定的块大小如500字符和重叠区如100字符。这样能确保上下文信息不会在块边界被生硬切断。重叠部分保证了语义的连续性。# 伪代码示例简单的重叠分块 text “这是一个很长的文档内容...” chunk_size 500 overlap 100 chunks [] start 0 while start len(text): end start chunk_size chunk text[start:end] chunks.append(chunk) start chunk_size - overlap # 移动起始点制造重叠基于语义的分块更高级的方法是利用模型本身进行分句或语义段落划分。例如使用句子分割器确保每个块是完整的句子集合。或者对于Markdown/HTML文档可以按照标题进行分块。这能产生质量更高的块但计算成本也更高。实操心得分块大小没有黄金标准。需要根据你的嵌入模型和具体任务进行试验。模型通常有最佳处理的文本长度如512个token。块太小会丢失上下文块太大会稀释关键信息。从512字符左右开始调整观察检索质量的变化。重叠区一般设为块大小的10%-25%。3.2 元数据为记忆打上“标签”仅仅存储文本和向量是不够的。高效的记忆系统还需要强大的过滤和筛选能力。这就是元数据的用武之地。在存储每个文本块时应该附加一组键值对作为元数据。常见的元数据包括source: 记忆来源如“与张三的对话”、“项目文档.pdf”。timestamp: 创建时间。session_id: 对话会话ID用于区分不同主题的聊天。user_id: 用户标识。type: 内容类型如“问题”“回答”“事实陈述”。在检索时你可以先进行元数据过滤再进行向量搜索。例如“只从‘项目文档.pdf’中寻找与‘数据库设计’相关的片段”。这能极大提升检索的精准度和效率。像ChromaDB这样的数据库原生支持带过滤的向量查询。3.3 检索策略与重排序从向量数据库返回的TOP-K个相似片段直接拼接起来就喂给模型吗通常不是。这里还有优化空间。多样性检索为了避免返回的片段都高度相似比如来自同一段话的不同部分可以使用MMR算法。它在保证相关性的同时最大化结果的多样性从而提供更全面的背景信息。重排序向量检索是“粗排”它基于嵌入空间的相似度。你还可以引入一个更精细但更耗资源的“精排”模型对粗排结果进行重新打分排序。例如使用一个交叉编码器模型它能够更精确地判断查询和每个片段之间的相关性。虽然慢但对于最终效果提升可能很明显。上下文窗口管理大模型有上下文长度限制。你需要将检索到的片段按照优先级相关性分数依次填入直到接近模型的令牌上限。这就要求sa3p具备令牌计数和智能截断的能力。4. 实操过程与核心环节实现让我们以一个简化但完整的流程看看如何将sa3p集成到一个基于LangChain的本地AI应用中。这里我们假设使用ChromaDB和sentence-transformers嵌入模型。4.1 环境搭建与初始化首先安装核心依赖。pip install chromadb sentence-transformers langchain然后初始化记忆系统的核心组件。import chromadb from sentence_transformers import SentenceTransformer from langchain.vectorstores import Chroma from langchain.embeddings import HuggingFaceEmbeddings # 1. 初始化嵌入模型 # 选择一个小型高效的模型适合本地运行 embed_model_name “all-MiniLM-L6-v2” embeddings HuggingFaceEmbeddings(model_nameembed_model_name) # 2. 初始化Chroma客户端并指定持久化目录 chroma_client chromadb.PersistentClient(path“./my_memory_db”) # 创建一个集合类似于数据库的表用于存储特定应用的记忆 collection_name “my_ai_assistant_memory” collection chroma_client.get_or_create_collection(namecollection_name) # 3. 用LangChain的包装器创建向量库对象方便后续操作 vectorstore Chroma( clientchroma_client, collection_namecollection_name, embedding_functionembeddings )4.2 记忆的写入与索引当一次对话结束后我们需要将对话内容存入记忆库。def save_conversation_to_memory(session_id, user_query, ai_response): “”” 将一轮对话保存到向量数据库。 “”” # 将问答组合成一段有意义的文本。也可以分开存储各有优劣。 text_to_store f“用户提问{user_query}\n助手回答{ai_response}” # 生成一个唯一ID可以用时间戳session_id组合 doc_id f“{session_id}_{int(time.time())}” # 准备元数据 metadata { “session_id”: session_id, “type”: “qa_pair”, “timestamp”: time.time() } # 添加到向量库 # 注意add_texts 方法内部会调用嵌入模型生成向量 vectorstore.add_texts( texts[text_to_store], metadatas[metadata], ids[doc_id] ) print(f“对话已存入记忆ID: {doc_id}”)4.3 记忆的检索与应用当新问题到来时我们从记忆库中检索相关历史并组装提示词。def get_relevant_memory(query, session_idNone, k5): “”” 根据查询检索相关记忆。 :param query: 用户的新问题 :param session_id: 可选如果提供则只检索该会话的记忆 :param k: 返回的记忆片段数量 :return: 拼接好的上下文字符串 “”” # 构建检索过滤器 filter_dict None if session_id: filter_dict {“session_id”: session_id} # 执行相似性搜索 docs_and_scores vectorstore.similarity_search_with_score( query, kk, filterfilter_dict ) # 组装上下文 context_parts [] for doc, score in docs_and_scores: # doc.page_content 是存储的原始文本 # score 是相似度分数距离分数越低越相似取决于后端 context_parts.append(doc.page_content) # 可选打印调试信息 print(f“[相似度: {score:.3f}] {doc.page_content[:100]}...”) # 将检索到的记忆用分隔符连接起来 memory_context “\n\n--- 相关历史对话 ---\n”.join(context_parts) return memory_context def generate_prompt_with_memory(user_query, session_id): “”” 生成结合了记忆的完整提示词。 “”” # 1. 检索记忆 memory get_relevant_memory(user_query, session_idsession_id) # 2. 组装系统指令和上下文 system_prompt “你是一个有帮助的AI助手。请根据以下相关历史对话如果存在和当前问题给出回答。” full_prompt f“{system_prompt}\n\n{memory}\n\n--- 当前问题 ---\n用户{user_query}\n助手” return full_prompt现在你只需要将full_prompt发送给你的本地大模型如通过llama.cpp,Ollama,vLLM等接口模型就能给出基于上下文的回答了。4.4 进阶实现一个简单的对话循环下面是一个极简的、集成了sa3p核心思想的对话循环示例。import time class SimpleAIAssistant: def __init__(self, vectorstore): self.vectorstore vectorstore self.current_session_id f“session_{int(time.time())}” # 生成一个会话ID # 这里需要接入你的本地LLM调用函数例如通过requests调用本地API # self.llm_call your_llm_function def chat_loop(self): print(f“对话开始会话ID: {self.current_session_id}”) print(“输入 ‘quit’ 退出”) while True: user_input input(“\n你 “) if user_input.lower() ‘quit’: break # 1. 检索相关记忆 context get_relevant_memory(user_input, self.current_session_id, k3) # 2. 构建提示词 prompt f“相关历史\n{context}\n\n请根据以上历史如果有回答以下问题\n{user_input}” # 3. 调用本地LLM (此处为伪代码) # ai_response self.llm_call(prompt) ai_response f“[模拟LLM响应] 基于你提到的历史我认为...针对‘{user_input}’” # 模拟响应 print(f“助手 {ai_response}”) # 4. 将本轮对话存入记忆 save_conversation_to_memory(self.current_session_id, user_input, ai_response) # 启动助手 assistant SimpleAIAssistant(vectorstore) assistant.chat_loop()这个简单的框架展示了sa3p思想的核心闭环检索 - 生成 - 存储。在实际项目中你需要将其与更稳定的后端服务、更复杂的提示工程以及真实的LLM API调用结合起来。5. 常见问题与排查技巧实录在实际部署和使用类似sa3p的记忆系统时你会遇到一些典型问题。以下是我在实践中总结的排查清单和经验。5.1 检索结果不相关或质量差这是最常见的问题。可能的原因和解决方案如下问题现象可能原因排查与解决思路返回的记忆片段完全无关1. 嵌入模型不匹配任务。2. 文本分块不合理块太大。3. 向量数据库索引未正确构建或损坏。1.更换嵌入模型尝试在sentence-transformers上选择针对你领域微调的模型如multi-qa-MiniLM-L6-cos-v1针对问答优化。2.调整分块减小分块大小如从1000字符降到300-500并确保使用重叠分块。3.重建索引清空集合重新添加所有文档。检查嵌入生成过程是否出错。返回的记忆总是那几段缺乏多样性1. 查询向量与少数片段过于相似导致分数碾压。2. 记忆库数据本身同质化严重。1.启用MMR在检索时使用最大边际相关性算法在similarity_search中设置fetch_k初始获取数大于k最终返回数并指定lambda_mult参数来平衡相关性与多样性。2.丰富数据源引入更多样化的对话或文档数据。检索不到任何内容空结果1. 检索时设置的过滤器filter太严格没有匹配项。2. 向量数据库连接或集合名称错误。1.放宽过滤器先尝试不加任何过滤器进行检索确认数据存在。2.检查连接确认collection_name拼写正确客户端路径无误。打印collection.count()查看集合中是否有数据。5.2 性能问题检索速度慢或内存占用高检索慢索引优化确保向量数据库使用了合适的索引如HNSW。在创建集合时可以指定索引参数如hnsw:space为cosine。限制搜索范围积极使用元数据过滤。在十万条记录中全局搜索和在某个会话的100条记录中搜索速度天差地别。嵌入模型更小的嵌入模型如all-MiniLM-L6-v2推理速度更快。如果精度可接受它是首选。内存占用高分块策略过小的分块会导致向量数量爆炸增加内存和索引压力。找到平衡点。持久化与加载对于非常大的记忆库考虑仅在需要时连接数据库而不是一直保持在内存中。Chroma的持久化模式在这方面做得不错。定期归档设计记忆的“冷热”分层。将非常久远的、不常访问的记忆导出存档从活跃的向量库中移除。5.3 记忆的“污染”与“遗忘”错误信息被记住如果AI某次产生了错误回答并被存入记忆下次类似问题可能再次引用这个错误信息导致错误固化。解决方案实现一个记忆的“评分”或“验证”机制。可以为每段记忆附加一个置信度分数或用户反馈如“点赞/点踩”。在检索时优先选择高置信度的记忆。或者提供手动删除或修正特定记忆条目的管理功能。信息过时某些事实性信息会随时间变化如产品价格、政策法规。解决方案为记忆条目增加有效期TTL元数据或者基于时间戳进行过滤。更复杂的系统可以定期运行“记忆刷新”任务用最新信息替换旧信息。隐私问题记忆库可能包含敏感对话。解决方案这是至关重要的。必须确保存储本地化、访问受控。可以在存储前对文本进行脱敏处理如自动替换电话号码、邮箱。实现严格的访问权限控制。并明确告知用户数据如何被使用和存储。5.4 与不同本地LLM的集成技巧sa3p本身是模型无关的但集成时需要一些适配。上下文长度不同的本地LLM如Llama 3, Qwen, Gemma上下文窗口不同4K, 8K, 128K…。你的检索系统必须知道这个限制并在组装提示词时确保“系统指令 记忆上下文 当前问题”的总长度不超过限制。需要实现一个准确的令牌计数器如使用tiktoken或模型对应的分词器。提示词格式不同模型对提示词格式有偏好。例如ChatML格式|im_start|user\n...|im_end|、Alpaca格式等。你需要将检索到的记忆上下文按照目标模型喜欢的格式嵌入到完整的提示词模板中。系统指令设计在系统指令中明确告诉模型“如何使用提供的上下文”。例如“你是一个助手。请严格依据以下‘相关历史对话’来回答问题。如果历史对话中没有相关信息请直接说明你不知道不要捏造信息。” 这可以引导模型更好地利用上下文减少幻觉。将sa3p这样的记忆系统成功集成到本地LLM应用中标志着你从“玩具级”的对话迈向了“应用级”的智能体。它解决了连贯性的核心难题为构建真正实用、个性化的AI助手铺平了道路。整个过程中最耗时的往往不是编码而是对分块策略、嵌入模型、检索参数的反复调试和优化。记住没有一个放之四海而皆准的配置最好的参数来自于对你自身数据和用例的持续实验与观察。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2587873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…