我用本地大模型给MES工程师做了个个人助理(Ollama+知识库,附完整部署教程)
2026/6/11 16:59:51 网站建设 项目流程

我在工厂里天天要用MES系统:查工单、看良率、追踪批次...

以前:打开MES系统 → 输入账号密码 → 层层导航 → 找数据 → 导出Excel → 再分析...

麻烦死了。

后来我搭了个本地大模型助理,用自然语言就能查询MES数据。

"今天ETCH-01的良率是多少?" → 直接出结果

"帮我查一下WAF20240610001这个批次的当前工序" → 2秒出结果

为什么用本地部署?

�� MES数据是工厂核心机密,不能发到云端。所以必须本地部署。

我的选择:Ollama(免费开源)+ Llama3(8B参数,8GB显存即可运行)

硬件要求:8GB显存(RTX 3060及以上)或 Mac M系列芯片

软件要求:Python 3.9+,LangChain,ChromaDB(向量数据库)

架构设计

整个系统分3层:

1. 数据层:MES系统的SQL数据库 + 设备手册文档

2. 知识层:Chroma向量数据库存储文档切片

3. 应用层:LangChain连接Ollama + SQL工具 + 文档检索

[配图说明:本地大模型助理架构图:MES数据库+文档 → 向量库 → Ollama/Llama3 → 用户界面]

完整部署教程

Step 1:安装Ollama

# Windows/Mac/Linux通用
# 官网下载:https://ollama.com/download

# 或者用命令行安装(Mac/Linux)
curl -fsSL https://ollama.com/install.sh | sh

# 下载模型(Llama3 8B,8GB显存够用)
ollama pull llama3

# 测试运行
ollama run llama3 "你好,请介绍一下你自己"

Step 2:构建MES知识库

import sqlite3
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma

# 示例:把MES数据库的表结构存入知识库
conn = sqlite3.connect('mes.db')
cursor = conn.cursor()
cursor.execute("SELECT sql FROM sqlite_master WHERE type='table'")
schemas = cursor.fetchall()
conn.close()

# 把表结构写成文档
schema_text = "\n".join([s[0] for s in schemas if s[0]])
with open('mes_schema.txt', 'w', encoding='utf-8') as f:
f.write(f"MES数据库表结构:\n{schema_text}")

# 加载并拆分文档
loader = DirectoryLoader('./mes_docs', glob='**/*.txt')
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=30)
chunks = splitter.split_documents(docs)

# 存入向量数据库
embeddings = OllamaEmbeddings(model="llama3")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./mes_kb"
)
print(f"知识库已构建:{len(chunks)}个文档片段")

Step 3:构建SQL查询Chain(Text-to-SQL)

from langchain.chains import create_sql_query_chain
from langchain.chat_models import ChatOllama
from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain

# 连接MES数据库
db = SQLDatabase.from_uri("sqlite:///mes.db")

# 创建LLM
llm = ChatOllama(model="llama3", base_url="http://localhost:11434")

# 创建SQL查询Chain
db_chain = create_sql_query_chain(llm, db)

# 测试查询
question = "ETCH-01设备今天的产出是多少片?"
result = db_chain.invoke({"question": question})
print(f"生成的SQL: {result}")

实际运行效果:

问题:今天ETCH-01的良率是多少?

生成的SQL:
SELECT
ROUND(SUM(good_qty) * 100.0 / SUM(output_qty), 2) AS yield_rate
FROM mes_production
WHERE equipment_id = 'ETCH-01'
AND shift_date = CURDATE()

执行结果: 98.3%

---

问题:帮我查批次WAF20240610001当前在哪道工序?

生成的SQL:
SELECT
b.lot_id,
m.process_name,
m.step_name,
m.start_time
FROM mes_lot_flow b
JOIN mes_process m ON b.current_process_id = m.process_id
WHERE b.lot_id = 'WAF20240610001'

执行结果:
lot_id=WAF20240610001, 刻蚀工序, ETCH-03腔室1, 2026-06-11 14:23:15

[配图说明:本地大模型助理运行截图:自然语言查询+SQL执行结果]

工程化:做个简单的Web界面

# 使用Gradio快速做界面(pip install gradio)
import gradio as gr
from langchain.chains import create_sql_query_chain
from langchain.chat_models import ChatOllama
from langchain.utilities import SQLDatabase

db = SQLDatabase.from_uri("sqlite:///mes.db")
llm = ChatOllama(model="llama3", base_url="http://localhost:11434")
db_chain = create_sql_query_chain(llm, db)

def query_mes(question):
try:
sql = db_chain.invoke({"question": question})
# 执行SQL(简化版,实际需要安全处理)
result = db.execute(sql).fetchall()
return f"SQL: {sql}\n\n结果: {result}"
except Exception as e:
return f"查询失败: {str(e)}"

# 启动Web界面
gr.Interface(
fn=query_mes,
inputs="text",
outputs="text",
title="MES数据查询助手",
description="用自然语言查询MES数据(本地部署,数据安全)"
).launch(server_name="0.0.0.0", server_port=7860)

[配图说明:Gradio Web界面截图:输入框+查询结果展示]

总结与注意事项

⚠️ 部署前必读:

1. 数据安全:所有数据都在本地,不用担心泄露

2. SQL注入:实际使用必须对SQL执行做权限控制,不要让LLM随意增删改

3. 模型选择:Llama3 8B够用,追求精度可以用70B(需要40GB显存)

4. 更新知识库:MES结构变化时要同步更新向量数据库

�� 实测效果:日常查询从5分钟→10秒,数据分析效率提升30倍。

---

�� 你们厂的MES系统好用吗?有没有想过用AI改造?评论区聊聊!

�� 觉得有用点赞收藏!关注我,一起探索AI在制造业的落地!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询