手把手带你做:轻量本地智能对账 Agent
自然语言指令 + 本地 Excel/PDF 读取 + 关联比对 + 直连数据库 + 自动计算金额技术栈极简、全开源、本地运行、数据不外泄。
先上简略图:
整体架构(超简单)
- 工具层:Python 写固定工具(读 Excel、解析 PDF、查数据库、金额计算)
- 智能层:大模型做「任务拆解 + 字段关联 + 规则理解」
- 调度层:简单 Agent 逻辑,让 AI 自动按步骤调用工具
- 界面:Streamlit 网页
目录结构:
├── tools.py
├── ai_deepseek.py
├── app.py
tool.py
import pandas as pd import pdfplumber import oracledb # 读取 Excel def read_excel(file_path): try: df = pd.read_excel(file_path) return df.to_string() except: return "Excel读取失败" # 读取 PDF def read_pdf(file_path): try: text = "" with pdfplumber.open(file_path) as pdf: for page in pdf.pages: t = page.extract_text() if t: text += t + "\n" return text except: return "PDF读取失败" # 查询 Oracle(安全只读) def query_db(user, pwd, dsn, sql): try: if not sql.strip().upper().startswith("SELECT"): return "仅允许SELECT" conn = oracledb.connect(user=user, password=pwd, dsn=dsn) cursor = conn.cursor() cursor.execute(sql) cols = [d[0] for d in cursor.description] rows = cursor.fetchall() df = pd.DataFrame(rows, columns=cols) cursor.close() conn.close() return df.to_string() except Exception as e: return f"数据库错误:{str(e)}"ai_deepseek.py
import requests import os from dotenv import load_dotenv load_dotenv() DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") DEEPSEEK_API_URL = os.getenv("DEEPSEEK_API_URL") API_KEY = DEEPSEEK_API_KEY # 你自己填 URL = "https://api.deepseek.com/chat/completions" def ai_think(prompt): headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = { "model": "deepseek-chat", "temperature": 0.1, "messages": [ {"role": "system", "content": "你是对账专家,读取数据、关联、计算金额、输出结果。不要解释,直接输出结果。"}, {"role": "user", "content": prompt} ] } resp = requests.post(URL, headers=headers, json=data) return resp.json()["choices"][0]["message"]["content"]app.py
import streamlit as st from tools import read_excel, read_pdf, query_db from ai_deepseek import ai_think st.title("✅ 无LangChain 智能对账工具(稳定版)") # Oracle 配置 with st.sidebar: user = st.text_input("Oracle 用户") #xcat_test_01 pwd = st.text_input("密码", type="password") #Aa123456 dsn = st.text_input("DSN", "192.168.5.127:1521/ORCL") # 指令 st.subheader("输入对账指令") req = st.text_area("指令", """ 读取 D:\\workarea\\ai\\OfficeAgent\\docs\\订单明细.xlsx 读取 D:\\workarea\\ai\\OfficeAgent\\docs\\月度对账单据.pdf 查询 CUSTOMER 表 查询 FIN_BALANCE 表 根据客户编号关联所有数据,计算总金额、扣款、最终应付金额 """) if st.button("开始执行"): with st.spinner("读取文件...查询数据库...AI分析..."): # 1. 读取文件 excel = read_excel("D:\\workarea\\ai\\OfficeAgent\\docs\\订单明细.xlsx") pdf = read_pdf("D:\\workarea\\ai\\OfficeAgent\\docs\\月度对账单据.pdf") # 2. 查询数据库 customer = query_db(user, pwd, dsn, "SELECT * FROM HLTEST7") finance = query_db(user, pwd, dsn, "SELECT * FROM HLTEST8") # 3. 交给AI汇总计算 prompt = f""" 以下是全部数据,请关联分析,输出最终金额汇总: 【Excel订单】 {excel} 【PDF对账】 {pdf} 【客户表】 {customer} 【结算表】 {finance} 需求: {req} """ result = ai_think(prompt) st.success("完成") st.markdown("### 结果") st.write(result)终端运行:
streamlit run app.py
浏览器自动打开网页:
- 填数据库账号密码
- 输入自然语言:文件路径 + 关联要求 + 计算规则
- 点击按钮,AI 自动:读 Excel → 读 PDF → 找字段关联 → 查库 → 算金额 → 出结果
模拟结构和数据
订单明细.xlsx
| 客户编号 | 客户名称 | 物料编码 | 下单数量 | 单价 | 订单金额 | 对账状态 |
|---|---|---|---|---|---|---|
| C001 | 甲工业有限公司 | M001 | 10 | 500 | 5000 | 未对账 |
| C002 | 乙科技有限公司 | M002 | 20 | 320 | 6400 | 未对账 |
| C003 | 丙制造工厂 | M003 | 15 | 180 | 2700 | 未对账 |
月度对账单据.pdf
# 月度供应商对账凭证
对账月份:2026年04月
------------------------------------
客户编号:C001
结算确认金额:4800
差异说明:扣款200
客户编号:C002
结算确认金额:6400
差异说明:无扣款
客户编号:C003
结算确认金额:2550
差异说明:扣款150
------------------------------------
对账规则:
1. 以订单原始金额为基数
2. 按实际扣款后计算最终应付金额
3. 需同步匹配数据库客户档案与结算记录
CREATE TABLE HLTEST7( CUST_ID VARCHAR2(20) PRIMARY KEY, CUST_NAME VARCHAR2(50), PAY_TYPE VARCHAR2(20), AREA VARCHAR2(30) ); INSERT INTO HLTEST7 VALUES('C001','甲工业有限公司','月结30天','华东区'); INSERT INTO HLTEST7 VALUES('C002','乙科技有限公司','月结60天','华南区'); INSERT INTO HLTEST7 VALUES('C003','丙制造工厂','现结','华北区'); CREATE TABLE HLTEST8( CUST_ID VARCHAR2(20), MONTH VARCHAR2(10), ORIG_AMT NUMBER(10,2), DEDUCT_AMT NUMBER(10,2), REAL_PAY NUMBER(10,2) ); INSERT INTO HLTEST8 VALUES('C001','202604',5000,200,4800); INSERT INTO HLTEST8 VALUES('C002','202604',6400,0,6400); INSERT INTO HLTEST8 VALUES('C003','202604',2700,150,2550); COMMIT;在打开的网页里输入指令:
读取 D:\workarea\ai\OfficeAgent\docs\订单明细.xlsx
读取 D:\workarea\ai\OfficeAgent\docs\月度对账单据.pdf
查询 HLTEST7表
查询 HLTEST8 表
根据客户编号关联所有数据,计算总金额、扣款、最终应付金额
就能看到结果:
