基于语义检索的LLM工具发现框架:从原理到工程实践

news2026/5/15 17:18:30
1. 项目概述与核心价值最近在折腾AI应用开发特别是想把手头的几个大语言模型LLM能力整合到自己的工具链里发现一个挺头疼的问题模型本身很强大但让它去精准调用外部工具比如查数据库、发邮件、调API却总是不尽如人意。要么是工具描述写得不清楚模型“看不懂”要么是工具太多模型在推理时选不准来回试错效率低下。这直接影响了智能体Agent的可靠性和用户体验。就在这个当口我注意到了GitHub上一个名为lyra-tool-discovery的项目。光看名字“Lyra”和“工具发现”就感觉它切中了要害。深入探究后我发现这远不止是一个简单的工具列表或封装库。它本质上是一套为LLM优化过的工具描述与发现框架。其核心目标是解决“如何让LLM更好地理解和使用工具”这一根本性问题。它不是替你写调用代码而是帮你把工具“包装”成LLM能轻易消化和准确检索的格式并通过智能的检索与排序机制确保在需要的时候LLM能快速找到最合适的那个工具。简单来说如果你的项目涉及构建AI智能体、聊天机器人、自动化工作流并且需要LLM可靠地调用一系列函数或API那么lyra-tool-discovery提供的思路和方案很可能就是你正在寻找的“最后一公里”解决方案。它适合有一定Python和LLM应用基础的开发者尤其是那些对智能体工具调用部分的稳定性、准确性有更高要求的团队。2. 核心设计思路从“硬编码”到“语义化发现”传统的LLM工具调用方式可以粗略分为两个阶段都存在明显瓶颈。2.1 传统方式的困境第一种是“硬编码”或“有限列表”模式。开发者预先在系统提示词System Prompt里以自然语言或某种结构化格式如JSON Schema列出所有可用工具的描述。当用户发出指令LLM根据这些描述决定调用哪个工具及其参数。这种方式的问题在于扩展性差每增加一个新工具就要修改提示词容易触及上下文长度限制。描述质量参差不齐工具描述如果写得不精准、不全面LLM就无法正确理解其功能和边界导致误调用。检索效率低当工具数量达到几十上百个时让LLM在冗长的描述列表中做“阅读理解”并选择不仅速度慢而且准确率会随着列表变长而显著下降。第二种是“基于关键字或函数名匹配”。这种方式过于机械无法处理语义相似但表述不同的用户请求。例如用户说“帮我查一下上个月的销售额”你的工具可能叫get_monthly_sales简单的关键字匹配可能失效而LLM却能理解其语义。2.2 Lyra的解决之道语义化工具发现框架lyra-tool-discovery的核心理念是将工具管理从“静态列表”升级为“动态语义检索系统”。它主要做了以下几件事工具描述的标准化与丰富化它定义了一套更完善的工具描述规范。不仅仅是名称、参数还包括更详细的功能说明、使用场景示例、以及最重要的——经过优化的文本嵌入Embedding。这个嵌入向量是后续快速语义检索的基石。构建工具向量库将所有工具的描述文本或关键特征通过嵌入模型转换为向量并存储到向量数据库如Chroma、Weaviate中。这相当于为你的工具集创建了一个“语义搜索引擎”的索引。请求的语义化检索当用户请求到来时先将请求内容本身也转换为向量然后在工具向量库中进行相似度搜索如余弦相似度快速找出功能描述与用户意图最匹配的Top-K个工具候选。精细化排序与筛选初步检索后可能还会结合工具的其他元数据如适用场景、调用成本、权限等级进行二次排序最终将最有可能的几个工具及其标准化描述提供给LLM。LLM此时只需要在一个精炼、高相关的候选集里做最终判断和参数提取任务难度和出错率大大降低。这个设计思路的优势非常明显解耦、可扩展、高效、准确。工具的增加和修改只需要更新向量库无需改动核心提示词语义检索能应对用户多样的表达方式LLM只需处理精炼后的候选推理质量更高。注意lyra-tool-discovery本身可能不包含一个开箱即用的、完整的向量数据库和嵌入模型服务。它更侧重于提供描述规范、检索接口和流程框架。你需要根据其设计接入自己的嵌入模型如OpenAI的text-embedding-3-small或开源的BGE、Sentence-Transformer模型和向量数据库来完成整个链路。3. 核心组件与实操要点解析理解思路后我们来看看如何具体落地。根据项目理念一个完整的工具发现系统通常包含以下几个核心组件我会结合常见实践来补充细节。3.1 工具描述规范让机器更好懂这是第一步也是最重要的一步。一个糟糕的描述即使有再好的检索系统也无济于事。lyra-tool-discovery倡导的描述可能包含以下字段name: 工具的唯一标识符如send_email。description:核心字段。用清晰、无歧义的自然语言描述工具的功能。例如“向指定的邮箱地址发送一封电子邮件。需要提供收件人、主题、正文内容。” 避免使用“处理邮件”这样模糊的说法。parameters: 遵循JSON Schema格式明确定义每个参数的名称、类型、是否必需、描述和示例。良好的参数描述能极大帮助LLM提取信息。{ type: object, properties: { recipient: { type: string, description: 收件人的电子邮件地址例如 userexample.com }, subject: { type: string, description: 邮件的主题行 }, body: { type: string, description: 邮件的正文内容支持纯文本 } }, required: [recipient, subject, body] }examples: 提供几个用户查询和对应工具调用的例子。这是极好的“上下文学习”材料。用户查询“给张三发封邮件告诉他会议改到下午三点。”对应调用send_email(recipientzhangsancompany.com, subject会议时间变更通知, body张三你好。原定会议已改至今日下午三点请知悉。)embedding_text: 这是一个关键优化点。不是简单地把name和description拼接起来做嵌入。而是可以构造一个更利于检索的文本例如“工具发送邮件。功能向指定邮箱地址发送电子邮件。参数收件人邮箱、邮件主题、正文内容。示例用于发送通知、报告、问候等。”这个字段是专门为向量检索生成的“摘要”。3.2 嵌入模型选型与向量化检索效果的好坏一半取决于描述质量另一半取决于嵌入模型。闭源方案OpenAI的text-embedding-3-small或text-embedding-3-large是当前效果和性价比的标杆且上下文长度支持高达8191 tokens足够容纳详细的工具描述。优点是省心、效果好。开源方案如果考虑数据隐私或成本可以选择本地部署的模型。通用嵌入BAAI/bge-large-zh-v1.5中文优势、thenlper/gte-base都是经过广泛验证的优质开源模型。专门优化有些社区项目会针对“工具描述与用户指令匹配”这个特定任务对开源模型进行微调Fine-tuning能获得比通用模型更好的效果。你可以关注是否有基于lyra理念的微调模型发布。实操心得对于工具发现场景嵌入模型的维度如1536, 1024和上下文长度比单纯的“榜单排名”更重要。确保你的模型能完整编码你构造的embedding_text。首次搭建时建议先用OpenAI的API快速验证流程效果达标后再考虑是否迁移到开源模型以优化长期成本。3.3 向量数据库的轻量级选型工具库的规模通常不会像文档知识库那样庞大上万级可能只有几十到几百个工具。因此对向量数据库的要求是轻量、易集成、速度快。ChromaPython原生内存/磁盘模式均可API简单非常适合作为入门选择和中小规模场景。可以直接在应用进程中运行无需额外服务。Weaviate功能更强大支持更多过滤和元数据操作有本地Docker运行方式。如果你预见到未来工具元数据查询条件会复杂可以考虑。Qdrant性能强劲同样支持Docker部署有丰富的客户端。适合对检索速度和稳定性要求更高的生产环境。甚至可以用内存字典Faiss如果工具数量极少100且更新不频繁完全可以用sentence-transformers生成向量后用Facebook的Faiss库在内存中进行相似度搜索这是最轻量的方案。对于lyra-tool-discovery预设的使用场景Chroma往往是平衡易用性和功能性的最佳起点。3.4 检索与排序策略这是“发现”逻辑的核心。简单相似度搜索如余弦相似度是基础但可以做得更精细。混合检索Hybrid Search除了语义向量搜索可以同时加入关键词如工具名、参数名的BM25搜索然后将两者的结果按权重合并。这能确保当用户查询中包含确切工具名时能被快速定位。元数据过滤在检索前或检索后利用工具的元数据进行筛选。例如category: 工具类别如“communication”,“database”,“calculation”。用户请求“发邮件”可以预先过滤类别为communication的工具。required_permission: 所需权限等级。根据当前用户权限过滤掉不可用的工具。is_deprecated: 是否已弃用。重排序Re-ranking初步检索出Top 10个工具后可以使用一个更精细但更耗资源的交叉编码器Cross-Encoder模型对“用户查询”和“每个工具描述”进行一对一的相关性打分得到更精确的排序。这对于最终提供给LLM的3-5个候选工具的质量提升非常明显。lyra-tool-discovery框架的价值就在于它定义了这些组件之间如何协作的标准接口让你可以像搭积木一样替换其中的某一部分比如换一个嵌入模型或增加一个重排序步骤而不需要重写整个工具调用逻辑。4. 完整实现流程与代码示例下面我将基于lyra-tool-discovery的核心思想展示一个从零开始的、完整的工具发现系统搭建流程。我们将使用 Chroma 作为向量库OpenAI Embeddings 作为嵌入模型。4.1 环境准备与依赖安装首先创建一个新的项目目录并安装必要的包。# 创建项目目录 mkdir lyra-tool-discovery-demo cd lyra-tool-discovery-demo python -m venv venv # 在Windows上使用 venv\Scripts\activate source venv/bin/activate # 安装核心依赖 pip install openai chromadb pydantic这里我们使用pydantic来定义严谨的工具描述数据模型这对于确保数据质量非常关键。4.2 定义工具描述数据模型在tool_model.py文件中我们定义工具的结构。from pydantic import BaseModel, Field from typing import List, Dict, Any, Optional class ToolParameter(BaseModel): 工具参数模型 name: str type: str # string, integer, boolean, etc. description: str required: bool True enum: Optional[List[str]] None # 可选值列表 class ToolDescription(BaseModel): 工具描述核心模型对应lyra的理念 name: str Field(..., description工具的唯一名称) description: str Field(..., description工具功能的清晰描述) parameters: List[ToolParameter] Field(..., description工具参数列表) examples: List[str] Field(default_factorylist, description使用示例列表) # 以下为用于检索的元数据 category: Optional[str] None embedding_text: Optional[str] None # 专门用于生成嵌入向量的文本 required_permission: str user def generate_embedding_text(self) - str: 生成用于向量化的优化文本。这是关键步骤 if self.embedding_text: return self.embedding_text # 如果未提供则根据规则自动生成 param_desc , .join([f{p.name} ({p.type}): {p.description} for p in self.parameters]) example_text .join(self.examples[:2]) # 取前两个示例 generated_text ( f工具名称{self.name}。 f功能描述{self.description}。 f所需参数{param_desc}。 f示例场景{example_text} ) return generated_text4.3 构建工具库并向量化在tool_manager.py中我们创建工具管理器负责工具的注册、存储和检索。import chromadb from chromadb.config import Settings from openai import OpenAI import hashlib from typing import List from tool_model import ToolDescription class ToolManager: def __init__(self, openai_api_key: str, persist_directory: str ./chroma_db): self.client OpenAI(api_keyopenai_api_key) # 初始化Chroma客户端持久化存储 self.chroma_client chromadb.PersistentClient( pathpersist_directory, settingsSettings(anonymized_telemetryFalse) ) # 获取或创建集合collection集合名可自定义 self.collection self.chroma_client.get_or_create_collection( namelyra_tools, metadata{description: Vector store for Lyra tool descriptions} ) self.tools_registry: Dict[str, ToolDescription] {} # 内存中保留完整工具对象 def _get_embedding(self, text: str) - List[float]: 调用OpenAI Embedding API生成向量 response self.client.embeddings.create( modeltext-embedding-3-small, inputtext ) return response.data[0].embedding def register_tool(self, tool: ToolDescription): 注册一个工具存储到内存registry并向量化后存入Chroma tool_id hashlib.md5(tool.name.encode()).hexdigest()[:8] # 生成简单ID self.tools_registry[tool_id] tool # 生成嵌入文本并获取向量 embedding_text tool.generate_embedding_text() vector self._get_embedding(embedding_text) # 准备元数据 metadata { name: tool.name, description: tool.description, category: tool.category or general, permission: tool.required_permission } # 存入Chroma self.collection.add( embeddings[vector], metadatas[metadata], ids[tool_id], documents[embedding_text] # 同时存储原始文本便于调试 ) print(f工具 {tool.name} 已注册ID: {tool_id}) def discover_tools(self, user_query: str, top_k: int 5, filter_category: str None) - List[ToolDescription]: 根据用户查询发现相关工具 # 1. 将用户查询也向量化 query_vector self._get_embedding(user_query) # 2. 构建查询条件 where_filter None if filter_category: where_filter {category: filter_category} # 3. 在Chroma中查询最相似的工具 results self.collection.query( query_embeddings[query_vector], n_resultstop_k, wherewhere_filter, include[metadatas, distances, documents] ) # 4. 将结果映射回完整的ToolDescription对象 discovered_tools [] if results and results[ids][0]: for tool_id, metadata in zip(results[ids][0], results[metadatas][0]): if tool_id in self.tools_registry: discovered_tools.append(self.tools_registry[tool_id]) else: # 理论上不应发生除非数据库不一致 print(f警告未在注册表中找到工具 ID {tool_id}) return discovered_tools4.4 集成与使用示例最后在main.py中我们演示整个流程。from tool_manager import ToolManager from tool_model import ToolDescription, ToolParameter import os # 1. 初始化管理器请替换为你的OpenAI API Key openai_api_key os.getenv(OPENAI_API_KEY, your-api-key-here) manager ToolManager(openai_api_keyopenai_api_key) # 2. 定义并注册几个示例工具 email_tool ToolDescription( namesend_email, description向指定的一个或多个邮箱地址发送电子邮件。需要提供收件人列表、邮件主题和正文。支持HTML格式。, parameters[ ToolParameter(namerecipients, typearray, description收件人邮箱地址列表例如 [ab.com, cd.com]), ToolParameter(namesubject, typestring, description邮件的主题行, requiredTrue), ToolParameter(namebody, typestring, description邮件的正文内容, requiredTrue), ToolParameter(nameis_html, typeboolean, description正文是否为HTML格式, requiredFalse) ], examples[ 给项目组所有人发封邮件通知下周一下午两点开会。, 向客户 supportcompany.com 发送一份产品更新说明的HTML邮件。 ], categorycommunication, required_permissionuser ) query_db_tool ToolDescription( namequery_sales_data, description从销售数据库中查询指定时间范围和地区的销售数据。返回销售额、订单数等汇总信息。, parameters[ ToolParameter(namestart_date, typestring, description开始日期格式 YYYY-MM-DD, requiredTrue), ToolParameter(nameend_date, typestring, description结束日期格式 YYYY-MM-DD, requiredTrue), ToolParameter(nameregion, typestring, description地区如 华北、华东默认为全国, requiredFalse) ], examples[ 查一下上个月华东区的销售情况。, 给我看看今年第一季度的总销售额。 ], categorydata_query, required_permissionanalyst ) manager.register_tool(email_tool) manager.register_tool(query_db_tool) # ... 可以注册更多工具 # 3. 模拟用户查询并进行工具发现 test_queries [ 我想给团队发个会议通知邮件。, 帮我分析下上个季度华南区的销售业绩。, 今天的天气怎么样, # 一个没有对应工具的查询 ] for query in test_queries: print(f\n用户查询: 「{query}」) discovered manager.discover_tools(query, top_k2) if discovered: print(f发现 {len(discovered)} 个可能相关的工具:) for tool in discovered: print(f - {tool.name}: {tool.description}) # 这里可以将工具的描述和参数schema传递给LLM让它做最终决定和参数填充 else: print(未找到直接相关的工具。可能需要引导用户或使用其他方式处理。)运行这个示例你会看到系统能够根据用户查询的语义从已注册的工具库中检索出最相关的工具即使查询中没有出现精确的工具名称。5. 常见问题、优化策略与避坑指南在实际搭建和使用过程中你肯定会遇到各种问题。下面是我总结的一些典型场景和解决方案。5.1 检索效果不理想怎么办问题用户说“订一张机票”但你的“购买航班”工具没有被检索出来。排查与解决检查embedding_text这是首要原因。工具描述是否足够丰富和准确“购买航班”工具的embedding_text是否包含了“订票”、“预订机票”、“出行”等同义词和场景描述优化描述文本是提升效果成本最低的方式。评估嵌入模型不同的嵌入模型对中文同义词、短句的理解能力不同。尝试换一个模型比如从text-embedding-ada-002升级到text-embedding-3-small或尝试BGE中文模型并对比效果。引入重排序在初步向量检索后加入一个交叉编码器进行精排。例如使用cross-encoder/ms-marco-MiniLM-L-6-v2这样的模型计算查询与每个候选工具描述的精细化相关分数。虽然会增加少量延迟但对最终Top 3的结果质量提升显著。混合检索在discover_tools方法中除了向量检索可以并行一个基于工具名、参数名、类别等字段的关键词检索如使用whoosh或Elasticsearch的简单匹配然后将两者结果融合。这能保证“名称精确匹配”的查询万无一失。5.2 工具数量增多后管理混乱问题工具达到上百个后注册、更新、查找冲突变得困难。解决策略分层分类在ToolDescription中强化category字段并可以引入tags标签列表。在检索时允许用户指定或系统自动推断类别进行前置过滤大幅缩小搜索范围。版本化管理为工具描述引入version字段。当更新一个工具的描述时不是直接覆盖而是创建新版本并标记旧版本为deprecated。向量库中存储最新有效版本的嵌入。这便于回滚和审计。配置文件化不要将工具定义硬编码在Python文件中。使用YAML或JSON文件来定义工具一个文件对应一个工具或一个类别。然后编写一个加载脚本扫描特定目录加载所有工具配置文件。这样便于协作和版本控制如Git。5.3 如何与LLM调用流程集成lyra-tool-discovery的输出是工具描述列表如何与LLM如GPT-4, Claude, 本地部署的Llama结合动态提示词构建这是最常用的方式。在收到用户请求后调用discover_tools获取Top K个候选工具。将这些工具的description和parameters(JSON Schema) 格式化成一段清晰的文本作为“系统提示词”的一部分或单独的工具说明部分提供给LLM。LLM基于这个精炼后的工具列表进行思考输出结构化的工具调用请求如遵循OpenAI的function calling格式。遵循行业标准将ToolDescription轻松转换为 OpenAI Function Calling 或 ReAct 框架要求的格式。许多LLM应用框架如LangChain, LlamaIndex都支持从Pydantic模型自动生成工具定义集成起来非常顺畅。# 示例转换为OpenAI函数调用格式 def to_openai_function(tool: ToolDescription) - dict: return { type: function, function: { name: tool.name, description: tool.description, parameters: { type: object, properties: {p.name: {type: p.type, description: p.description} for p in tool.parameters}, required: [p.name for p in tool.parameters if p.required] } } }流式处理与用户体验对于复杂请求可以设计多轮发现。LLM可能先调用一个“工具发现”函数根据初步发现的结果再请求更具体的参数或者发现需要组合多个工具形成工作流。5.4 性能与成本考量向量库索引Chroma默认会为集合创建索引。当工具数量超过几千虽然不常见可以考虑在collection.add时调整索引参数或定期优化索引。嵌入缓存工具的embedding_text在注册后通常不变。可以将其向量结果缓存起来例如存到本地文件或Redis避免每次启动服务都重复调用Embedding API特别是使用付费API时能节省大量成本。异步处理工具注册和查询的嵌入生成、向量数据库操作都是I/O密集型可以考虑使用asyncio和异步客户端如chromadb的异步接口、openai的异步客户端来提高并发处理能力尤其在Web服务场景下。5.5 一个关键的“避坑点”描述的一致性这是最容易忽略但影响巨大的问题。不同开发者编写的工具描述风格迥异有的详细有的简略有的用第二人称有的用第三人称。这种不一致性会严重干扰嵌入模型的理解导致检索结果不稳定。解决方案制定并严格执行《工具描述编写规范》。例如句式统一强制要求描述以“本工具用于…”或“这是一个…的工具”开头。要素齐全必须包含功能、输入、输出、典型场景四个部分。同义词补充在embedding_text中鼓励添加常见同义词和用户可能使用的口语化表达。人工审核或自动化检查在工具注册流程中加入一个检查环节利用简单的规则或另一个LLM来评估描述的质量和一致性不达标则打回修改。通过这套基于lyra-tool-discovery理念构建的系统你将拥有一个强大、灵活且可维护的LLM工具管理底座。它将工具调用从脆弱的“字符串匹配”或“冗长提示词记忆”转变为稳健的“语义检索精准投喂”模式这无疑是构建复杂、可靠AI智能体应用的关键一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2615545.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…