news 2026/3/15 5:11:29

基于Phi-3-mini-4k-instruct的智能客服系统:多轮对话实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Phi-3-mini-4k-instruct的智能客服系统:多轮对话实战

基于Phi-3-mini-4k-instruct的智能客服系统:多轮对话实战

想象一下,你的电商网站每天要处理上千条用户咨询,从“这个商品有货吗”到“我收到的包裹破损了怎么办”,客服团队忙得焦头烂额,用户却还在排队等待。传统客服要么成本高,要么响应慢,要么回答不准确,用户体验一言难尽。

现在,一个只有3.8亿参数的小模型就能改变这个局面。我说的就是微软的Phi-3-mini-4k-instruct,别看它体积小,在智能客服这个场景里,表现完全不输那些动辄几十亿参数的大模型。更重要的是,它能在普通电脑上就跑起来,不需要昂贵的显卡,部署简单,响应速度快。

这篇文章我就带你一步步搭建一个基于Phi-3-mini-4k-instruct的智能客服系统,重点解决多轮对话这个核心难题。我会用实际的代码和案例,让你看到从零到一的完整过程,包括怎么让AI记住之前的对话,怎么处理复杂的用户问题,怎么让回答更专业更贴心。

1. 为什么选择Phi-3-mini做智能客服?

你可能听说过GPT-4、Claude这些大模型,它们确实很强,但用在客服场景里,有几个现实问题:成本太高、响应太慢、部署太复杂。对于大多数中小型企业来说,这些大模型就像用大炮打蚊子,威力过剩但代价太大。

Phi-3-mini-4k-instruct正好解决了这些问题。我简单列几个它适合做客服的理由:

  • 体积小,速度快:3.8亿参数,在普通CPU上就能流畅运行,响应时间通常在1-3秒,用户几乎感觉不到等待
  • 指令跟随能力强:专门针对指令微调过,你让它怎么回答,它就怎么回答,不会天马行空乱说
  • 多轮对话支持:4K的上下文长度,足够记住几十轮对话内容,不会出现“金鱼记忆”
  • 安全可控:经过安全对齐训练,不容易生成有害或不恰当的内容
  • 完全免费开源:MIT许可证,商业使用没有任何限制

我测试过,在客服常见的问答场景里,Phi-3-mini的表现和那些大模型差距很小,但在成本和速度上优势明显。比如处理一个商品咨询,大模型可能要5-10秒,Phi-3-mini 2-3秒就搞定了,用户体验反而更好。

2. 环境准备与快速部署

2.1 安装Ollama

Ollama是目前最简单的大模型本地运行工具,一行命令就能搞定。如果你还没安装,打开终端执行:

# Linux/macOS curl -fsSL https://ollama.com/install.sh | sh # Windows # 直接去官网下载安装包:https://ollama.com/download

安装完成后,验证一下:

ollama --version

应该能看到版本号,比如ollama version 0.1.39

2.2 拉取Phi-3-mini模型

接下来拉取我们需要的模型,这里有两个选择:

# 标准版,2.2GB,适合大多数场景 ollama pull phi3:mini # 或者指定4k-instruct版本 ollama pull phi3:3.8b-mini-4k-instruct-q4_K_M

我建议用第二个,因为它是专门针对指令优化的版本,在客服场景表现更好。下载过程可能需要几分钟,取决于你的网速。

2.3 测试模型是否正常

下载完成后,简单测试一下:

ollama run phi3:3.8b-mini-4k-instruct-q4_K_M "你好,请介绍一下你自己"

如果看到类似这样的回复,说明模型运行正常:

你好!我是Phi-3-mini,一个由微软开发的人工智能助手。我专门针对指令跟随和多轮对话进行了优化,可以帮你解答问题、提供建议、协助处理各种任务。有什么我可以帮你的吗?

3. 构建基础客服对话系统

3.1 理解Phi-3的对话格式

Phi-3-mini使用特定的对话格式,了解这个格式很重要:

<|user|> 用户的问题<|end|> <|assistant|> AI的回答

在多轮对话中,格式是这样的:

<|user|> 第一轮问题<|end|> <|assistant|> 第一轮回答<|end|> <|user|> 第二轮问题<|end|> <|assistant|> 第二轮回答

注意每个对话轮次都要用<|end|>分隔,最后AI的回答不需要加<|end|>

3.2 最简单的Python客服脚本

我们先写一个最简单的单轮对话脚本:

import subprocess import json def ask_phi3(question): """向Phi-3-mini提问""" # 构建对话格式 prompt = f"<|user|>\n{question}<|end|>\n<|assistant|>" # 调用Ollama API cmd = [ "ollama", "run", "phi3:3.8b-mini-4k-instruct-q4_K_M", prompt ] try: result = subprocess.run( cmd, capture_output=True, text=True, timeout=30 # 30秒超时 ) if result.returncode == 0: # 提取AI的回答(去掉提示词部分) response = result.stdout.strip() if response.startswith(prompt): response = response[len(prompt):].strip() return response else: return f"错误:{result.stderr}" except subprocess.TimeoutExpired: return "请求超时,请稍后重试" except Exception as e: return f"系统错误:{str(e)}" # 测试一下 if __name__ == "__main__": question = "你们店的商品支持七天无理由退货吗?" answer = ask_phi3(question) print(f"用户:{question}") print(f"客服:{answer}")

运行这个脚本,你会看到AI给出了一个关于退货政策的回答。但这只是单轮对话,真正的客服需要记住上下文。

4. 实现多轮对话记忆

4.1 对话历史管理

多轮对话的核心是记住之前的对话内容。我们创建一个对话管理器:

class ConversationManager: def __init__(self, max_history=10): self.conversation_history = [] self.max_history = max_history # 最多保存多少轮对话 def add_message(self, role, content): """添加一条消息到对话历史""" self.conversation_history.append({ "role": role, # "user" 或 "assistant" "content": content }) # 如果历史记录太多,删除最早的 if len(self.conversation_history) > self.max_history * 2: # 乘以2因为每轮有user和assistant self.conversation_history = self.conversation_history[-self.max_history * 2:] def build_prompt(self, new_question): """根据对话历史构建完整的提示词""" prompt_parts = [] # 添加系统指令(告诉AI它是客服) system_prompt = """你是一个专业的电商客服助手,负责回答用户关于商品、订单、物流、售后等问题。请用友好、专业、有帮助的语气回答,如果遇到不确定的问题,建议用户联系人工客服。""" prompt_parts.append(f"<|system|>\n{system_prompt}<|end|>") # 添加历史对话 for msg in self.conversation_history: if msg["role"] == "user": prompt_parts.append(f"<|user|>\n{msg['content']}<|end|>") else: prompt_parts.append(f"<|assistant|>\n{msg['content']}<|end|>") # 添加当前问题 prompt_parts.append(f"<|user|>\n{new_question}<|end|>\n<|assistant|>") return "\n".join(prompt_parts) def clear_history(self): """清空对话历史""" self.conversation_history = []

4.2 完整的客服对话系统

现在我们把对话管理器和模型调用结合起来:

class CustomerServiceBot: def __init__(self, model_name="phi3:3.8b-mini-4k-instruct-q4_K_M"): self.model_name = model_name self.conversation = ConversationManager(max_history=8) self.context_info = {} # 可以存储用户上下文信息,比如订单号、用户名等 def ask(self, question, user_context=None): """处理用户提问""" # 如果有用户上下文,可以预处理问题 if user_context: self.context_info.update(user_context) # 这里可以添加基于上下文的逻辑,比如自动补充信息 # 构建完整提示词 full_prompt = self.conversation.build_prompt(question) # 调用模型 response = self._call_model(full_prompt) # 保存到对话历史 self.conversation.add_message("user", question) self.conversation.add_message("assistant", response) return response def _call_model(self, prompt): """调用Ollama模型""" import subprocess cmd = ["ollama", "run", self.model_name, prompt] try: result = subprocess.run( cmd, capture_output=True, text=True, timeout=30 ) if result.returncode == 0: # 提取AI的回答 response = result.stdout.strip() # 找到最后一个<|assistant|>标签,提取之后的内容 if "<|assistant|>" in response: parts = response.split("<|assistant|>") response = parts[-1].strip() # 清理可能的标签 response = response.replace("<|end|>", "").strip() return response else: return "抱歉,系统暂时无法处理您的请求,请稍后再试。" except subprocess.TimeoutExpired: return "处理超时,请简化您的问题或稍后重试。" except Exception as e: print(f"模型调用错误:{e}") return "系统出现错误,请联系人工客服。" def reset_conversation(self): """重置对话""" self.conversation.clear_history() self.context_info = {} return "对话已重置,我可以重新为您服务。"

4.3 测试多轮对话

让我们测试一下这个系统的多轮对话能力:

def test_multi_turn_conversation(): bot = CustomerServiceBot() # 第一轮:商品咨询 print("用户:这个笔记本电脑有货吗?") response1 = bot.ask("这个笔记本电脑有货吗?") print(f"客服:{response1}") print("-" * 50) # 第二轮:追问配置 print("用户:16GB内存的版本呢?") response2 = bot.ask("16GB内存的版本呢?") print(f"客服:{response2}") print("-" * 50) # 第三轮:询问价格 print("用户:价格是多少?") response3 = bot.ask("价格是多少?") print(f"客服:{response3}") print("-" * 50) # 第四轮:具体指代(测试上下文理解) print("用户:有优惠吗?") response4 = bot.ask("有优惠吗?") print(f"客服:{response4}") if __name__ == "__main__": test_multi_turn_conversation()

运行这个测试,你会看到AI能够理解“16GB内存的版本”指的是之前提到的笔记本电脑,也能理解“有优惠吗”指的是那个商品的价格优惠。这就是多轮对话的魅力——AI能记住上下文,对话更自然。

5. 增强客服专业能力

5.1 添加专业知识库

单纯的对话模型可能对具体商品信息了解不够,我们需要给它补充专业知识。这里用简单的关键词匹配来实现:

class KnowledgeEnhancedBot(CustomerServiceBot): def __init__(self, knowledge_base=None): super().__init__() self.knowledge_base = knowledge_base or self._default_knowledge_base() def _default_knowledge_base(self): """默认的知识库,实际应用中可以从数据库或文件加载""" return { "退货政策": [ "支持7天无理由退货,商品需保持完好", "退货邮费由买家承担,质量问题除外", "退货申请需在订单完成后7天内提交" ], "物流信息": [ "默认发货快递:顺丰、圆通", "发货时间:下单后24小时内", "偏远地区可能延迟1-2天" ], "支付方式": [ "支持支付宝、微信支付、银行卡", "企业用户支持对公转账", "不支持货到付款" ], "常见商品": { "笔记本电脑": { "品牌": ["联想", "戴尔", "华为", "苹果"], "库存": "大部分型号有货,具体请咨询", "保修": "全国联保2年" }, "手机": { "品牌": ["苹果", "小米", "OPPO", "vivo"], "库存": "热门型号需预订", "保修": "官方保修1年" } } } def ask(self, question, user_context=None): """增强版提问,先查知识库""" # 1. 检查是否匹配知识库 enhanced_question = question for category, info in self.knowledge_base.items(): if isinstance(info, list) and any(keyword in question for keyword in [category]): # 简单匹配,找到相关知识 if category in ["退货政策", "物流信息", "支付方式"]: knowledge = "\n".join(info) enhanced_question = f"{question}\n\n相关参考信息:{knowledge}" break elif isinstance(info, dict): for product, details in info.items(): if product in question: # 找到商品相关信息 detail_str = ", ".join([f"{k}: {v}" for k, v in details.items()]) enhanced_question = f"{question}\n\n商品信息:{detail_str}" break # 2. 调用父类的ask方法 return super().ask(enhanced_question, user_context)

5.2 处理复杂查询

有些用户问题比较复杂,需要分步骤处理。我们可以让AI先理解问题类型,再针对性回答:

def analyze_question_type(question): """分析问题类型,帮助AI更好理解""" question_lower = question.lower() if any(word in question_lower for word in ["怎么", "如何", "步骤", "教程"]): return "howto", "这是一个操作指导类问题,请提供清晰的步骤说明" elif any(word in question_lower for word in ["为什么", "原因", "为何"]): return "why", "这是一个原因解释类问题,请分析根本原因" elif any(word in question_lower for word in ["区别", "对比", "哪个好"]): return "compare", "这是一个对比类问题,请客观比较优缺点" elif any(word in question_lower for word in ["价格", "多少钱", "费用"]): return "price", "这是一个价格咨询,请提供准确价格信息" elif any(word in question_lower for word in ["时间", "多久", "何时"]): return "time", "这是一个时间相关咨询,请提供具体时间信息" else: return "general", "这是一个一般性问题,请直接回答"

然后在提问时,把这个分析结果也传给AI:

class SmartCustomerServiceBot(KnowledgeEnhancedBot): def ask(self, question, user_context=None): # 分析问题类型 q_type, q_instruction = analyze_question_type(question) # 增强问题提示 enhanced_prompt = f"{q_instruction}\n\n用户问题:{question}" # 如果有特定类型,可以特殊处理 if q_type == "howto": enhanced_prompt += "\n\n请用步骤1、步骤2...的格式回答,确保清晰易懂。" elif q_type == "compare": enhanced_prompt += "\n\n请用对比表格或分点说明的方式回答。" return super().ask(enhanced_prompt, user_context)

6. 实际应用案例

6.1 电商客服完整对话示例

让我们看一个真实的电商客服对话场景:

def ecommerce_customer_service_demo(): bot = SmartCustomerServiceBot() print("=== 电商客服对话演示 ===\n") # 场景:用户购买笔记本电脑的全过程咨询 dialogues = [ ("用户", "我想买一台笔记本电脑,有什么推荐吗?"), ("客服", ""), ("用户", "联想的ThinkPad系列怎么样?"), ("客服", ""), ("用户", "X1 Carbon这个型号有货吗?"), ("客服", ""), ("用户", "价格是多少?什么时候能发货?"), ("客服", ""), ("用户", "支持分期付款吗?"), ("客服", ""), ("用户", "好的,那我怎么下单?"), ("客服", "") ] for i in range(0, len(dialogues), 2): role, text = dialogues[i] print(f"{role}:{text}") if i + 1 < len(dialogues): # 获取AI回复 response = bot.ask(text) print(f"客服:{response}\n") # 如果有预设的下一个问题,继续 if i + 2 < len(dialogues): next_role, next_text = dialogues[i + 2] print(f"{next_role}:{next_text}") # 运行演示 ecommerce_customer_service_demo()

6.2 处理售后问题

售后问题往往更复杂,需要AI有更好的理解和处理能力:

def after_sales_service_demo(): bot = SmartCustomerServiceBot() print("=== 售后服务对话演示 ===\n") # 用户遇到问题 problem = "我收到的笔记本电脑屏幕有亮点,怎么办?" print(f"用户:{problem}") response1 = bot.ask(problem) print(f"客服:{response1}\n") # 用户追问 followup = "检测需要多久?这期间我能用电脑吗?" print(f"用户:{followup}") response2 = bot.ask(followup) print(f"客服:{response2}\n") # 用户进一步询问 further = "如果检测出问题,是维修还是换新?" print(f"用户:{further}") response3 = bot.ask(further) print(f"客服:{response3}")

7. 性能优化与实用技巧

7.1 提高响应速度

Phi-3-mini本身已经很快了,但我们可以进一步优化:

import threading import queue import time class FastResponseBot(CustomerServiceBot): def __init__(self, model_name="phi3:3.8b-mini-4k-instruct-q4_K_M", max_workers=2): super().__init__(model_name) self.response_queue = queue.Queue() self.worker_threads = [] self.max_workers = max_workers self._start_workers() def _start_workers(self): """启动工作线程,预加载模型""" for i in range(self.max_workers): thread = threading.Thread( target=self._worker_loop, daemon=True ) thread.start() self.worker_threads.append(thread) def _worker_loop(self): """工作线程循环""" while True: try: task = self.response_queue.get(timeout=1) if task is None: # 退出信号 break prompt, future = task response = self._call_model(prompt) future.set_result(response) except queue.Empty: continue except Exception as e: print(f"工作线程错误:{e}") def ask_async(self, question): """异步提问,立即返回Future对象""" from concurrent.futures import Future prompt = self.conversation.build_prompt(question) future = Future() self.response_queue.put((prompt, future)) # 先添加到历史记录(假设会成功) self.conversation.add_message("user", question) return future def shutdown(self): """关闭工作线程""" for _ in range(self.max_workers): self.response_queue.put(None) for thread in self.worker_threads: thread.join(timeout=5)

7.2 缓存常见问题

很多客服问题都是重复的,我们可以缓存答案:

import hashlib import json from functools import lru_cache class CachedCustomerServiceBot(CustomerServiceBot): def __init__(self, cache_file="qa_cache.json"): super().__init__() self.cache_file = cache_file self.cache = self._load_cache() def _load_cache(self): """加载缓存""" try: with open(self.cache_file, 'r', encoding='utf-8') as f: return json.load(f) except FileNotFoundError: return {} def _save_cache(self): """保存缓存""" with open(self.cache_file, 'w', encoding='utf-8') as f: json.dump(self.cache, f, ensure_ascii=False, indent=2) def _get_cache_key(self, question, context_hash=""): """生成缓存键""" content = question + context_hash + json.dumps( self.conversation.conversation_history[-4:], # 最近2轮对话 ensure_ascii=False ) return hashlib.md5(content.encode()).hexdigest() @lru_cache(maxsize=100) def ask(self, question, user_context=None): """带缓存的提问""" # 生成上下文哈希 context_hash = hashlib.md5( json.dumps(user_context or {}).encode() ).hexdigest()[:8] cache_key = self._get_cache_key(question, context_hash) # 检查缓存 if cache_key in self.cache: print(f"缓存命中:{question[:30]}...") response = self.cache[cache_key] else: # 实际调用模型 response = super().ask(question, user_context) # 保存到缓存 self.cache[cache_key] = response self._save_cache() return response

8. 部署与集成建议

8.1 Web API接口

要让客服系统真正可用,需要提供API接口:

from flask import Flask, request, jsonify import threading app = Flask(__name__) # 全局的机器人实例 bot = CachedCustomerServiceBot() # 线程锁,防止并发问题 bot_lock = threading.Lock() @app.route('/api/chat', methods=['POST']) def chat(): """处理聊天请求""" data = request.json if not data or 'question' not in data: return jsonify({'error': '缺少问题参数'}), 400 question = data['question'] user_id = data.get('user_id', 'anonymous') context = data.get('context', {}) # 为不同用户维护独立的对话历史 # 实际应用中应该用数据库存储对话历史 with bot_lock: # 这里简化处理,实际应该根据user_id恢复对话历史 response = bot.ask(question, context) return jsonify({ 'response': response, 'user_id': user_id, 'timestamp': time.time() }) @app.route('/api/reset', methods=['POST']) def reset(): """重置对话""" data = request.json user_id = data.get('user_id', 'anonymous') with bot_lock: bot.reset_conversation() return jsonify({ 'message': '对话已重置', 'user_id': user_id }) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)

8.2 前端集成示例

简单的HTML前端:

<!DOCTYPE html> <html> <head> <title>智能客服</title> <style> .chat-container { max-width: 800px; margin: 0 auto; padding: 20px; } .message { margin: 10px 0; padding: 10px; border-radius: 10px; max-width: 70%; } .user-message { background-color: #e3f2fd; margin-left: auto; } .bot-message { background-color: #f5f5f5; } #chat-box { height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; margin-bottom: 20px; } #input-box { width: 100%; padding: 10px; font-size: 16px; } </style> </head> <body> <div class="chat-container"> <h2>智能客服助手</h2> <div id="chat-box"></div> <input type="text" id="input-box" placeholder="请输入您的问题..." onkeypress="handleKeyPress(event)"> <button onclick="sendMessage()">发送</button> <button onclick="resetChat()">重置对话</button> </div> <script> let userId = 'user_' + Math.random().toString(36).substr(2, 9); function addMessage(text, isUser) { const chatBox = document.getElementById('chat-box'); const messageDiv = document.createElement('div'); messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`; messageDiv.textContent = text; chatBox.appendChild(messageDiv); chatBox.scrollTop = chatBox.scrollHeight; } async function sendMessage() { const input = document.getElementById('input-box'); const question = input.value.trim(); if (!question) return; addMessage(question, true); input.value = ''; try { const response = await fetch('/api/chat', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ question: question, user_id: userId }) }); const data = await response.json(); addMessage(data.response, false); } catch (error) { addMessage('抱歉,网络连接出现问题', false); } } async function resetChat() { try { await fetch('/api/reset', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ user_id: userId }) }); document.getElementById('chat-box').innerHTML = ''; addMessage('对话已重置,请问您有什么需要帮助的?', false); } catch (error) { alert('重置失败'); } } function handleKeyPress(event) { if (event.key === 'Enter') { sendMessage(); } } // 初始问候 window.onload = function() { addMessage('您好!我是智能客服助手,请问有什么可以帮您?', false); }; </script> </body> </html>

9. 总结与展望

用Phi-3-mini-4k-instruct搭建智能客服系统,给我的感觉是“小而美”。它没有大模型那么臃肿,但在客服这个特定场景下,表现相当出色。多轮对话、上下文理解、专业回答,这些核心需求都能很好满足。

实际用下来,最大的优点是部署简单、响应快速、成本低廉。一台普通的云服务器就能支撑几百个并发咨询,这对于中小型企业来说非常友好。而且因为是本地部署,数据安全也有保障,不用担心用户隐私泄露。

当然,它也有局限性。比如对非常专业的领域知识可能了解不够深,这时候就需要我们做好知识库的补充。还有,处理特别复杂的逻辑推理时,可能不如那些百亿参数的大模型。但在80%的常见客服场景里,它完全够用。

如果你正在考虑为你的业务添加智能客服,我建议先从Phi-3-mini开始尝试。它的学习成本低,试错成本也低,效果却出乎意料的好。先从简单的问答开始,慢慢增加多轮对话、知识库集成、缓存优化等功能,你会发现这个小模型能做的事情比想象中多得多。

未来,随着Phi-3系列的持续更新,相信会有更多优化版本出现。但就目前而言,Phi-3-mini-4k-instruct已经是一个相当成熟的智能客服解决方案了。不妨动手试试,看看它能为你的业务带来怎样的改变。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 1:54:20

基于Token机制的Qwen3-ForcedAligner-0.6B API访问控制方案

基于Token机制的Qwen3-ForcedAligner-0.6B API访问控制方案 语音识别和强制对齐技术正在越来越多地融入企业的日常业务流程&#xff0c;从智能客服的对话分析&#xff0c;到在线教育的内容标注&#xff0c;再到媒体行业的字幕生成&#xff0c;Qwen3-ForcedAligner-0.6B这类模型…

作者头像 李华
网站建设 2026/3/7 22:02:50

AIGlasses_for_navigation代码实例:Python调用YOLO分割API的轻量集成方案

AIGlasses_for_navigation代码实例&#xff1a;Python调用YOLO分割API的轻量集成方案 1. 项目背景与价值 视频目标分割技术作为计算机视觉领域的重要应用&#xff0c;正在改变我们与环境的交互方式。AIGlasses_for_navigation项目最初是为智能盲人眼镜导航系统开发的核心组件…

作者头像 李华
网站建设 2026/3/4 16:41:46

Z-Image-Turbo与MySQL集成实战:构建AI图片管理数据库

Z-Image-Turbo与MySQL集成实战&#xff1a;构建AI图片管理数据库 1. 为什么需要图片管理数据库 在AI图像生成工作流中&#xff0c;我们常常面临一个现实问题&#xff1a;生成的图片越来越多&#xff0c;却越来越难管理。上周我整理项目文件夹时&#xff0c;发现光是测试用的图…

作者头像 李华
网站建设 2026/3/6 7:39:27

Keil5开发环境集成CTC语音唤醒模型:小云小云嵌入式实现

Keil5开发环境集成CTC语音唤醒模型&#xff1a;小云小云嵌入式实现 1. 为什么在MCU上跑语音唤醒是个现实需求 你有没有遇到过这样的场景&#xff1a;智能音箱需要响应"小云小云"&#xff0c;但每次都要连手机APP才能启动&#xff1b;或者工业设备的语音控制功能&am…

作者头像 李华
网站建设 2026/3/9 16:35:20

InstructPix2Pix与Mathtype结合:学术图像处理

InstructPix2Pix与Mathtype结合&#xff1a;学术图像处理 你有没有遇到过这种情况&#xff1a;辛辛苦苦写完了论文&#xff0c;结果发现里面的图表、公式截图看起来特别粗糙&#xff0c;要么分辨率太低&#xff0c;要么背景不协调&#xff0c;要么就是排版后显得特别突兀。想用…

作者头像 李华