乘风的人 - 大模型项目
type: channel
link: https://blog.zhangbiechen.cn/index.php/category/llm-pro/
items: 冻冻智能数据分析助手
items: llamaindex rag示例项目
items: Mac MLX 实战微调 Qwen3\-4B\-Instruct 客服模型完整教程
items: wechat_agent_ai - main.py
items: 微信公众号 RAG Agent 最终版 GitHub 文档
items: Memory Basics - main.py

冻冻智能数据分析助手
type: item
date: 2026-06-05T17:28:00+08:00
description: 🧊 冻冻智能数据分析助手基于 LangChain + LM Studio 的 语义层 NL2SQL 数据分析系统，支持用自然语言查询业务数据，自动生成 SQL、可视化图表和分析结论。git地址https://github.com/zxliucn/Datas_Agent目录项目概述技术架构项目结构核心模块4.1 主入口 (app.py)4.2 意图解析 (core/intent_parser.py)4.3 SQL 构建 (core/sql_builder.py)4.4 SQL 执行 (core/sql_executor.py)4.5 图表生成 (core/chart_generator.py)4.6 洞察生成 (core/insight_generator.py)查询模板系统 (templates)Web 界面 (web)工具模块 (utils)配置说明数据库表结构快速开始API 接口项目预览1. 项目概述冻冻智能数据分析助手是一个基于语义层 NL2SQL 架构的数据分析系统，采用 预定义模板 + LLM 意图解析 的安全方案，避免 LLM 直接生成 SQL 带来的安全风险。核心特性功能说明🔍 自然语言查询输入自然语言问题，自动解析意图并生成 SQL📊 可视化图表根据查询类型自动选择折线图、柱状图、饼图等💡 智能洞察从查询结果中提取关键结论和业务建议🔒 安全可控预定义 SQL 模板，LLM 仅负责意图解析，不直接生成 SQL🌐 Web 界面基于 Gradio 的可视化交互界面支持的查询类型查询类型示例问题商品销量虾滑卖了多少？上个月牛筋的销售额商品排行这个月哪个商品卖得最好？销量前10订单趋势最近7天的订单趋势订单列表待发货的订单有哪些？客户排行哪个客户花钱最多？库存预警库存不足的商品售后排行退款最多的商品经营概况本月经营情况2. 技术架构┌─────────────────────────────────────────────────────────┐ │ Gradio Web UI │ │ 输入自然语言问题 → 展示图表和洞察结论 │ └──────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ NL2SQL 主控制器 │ │ 意图解析 → SQL 构建 → 执行 → 可视化 │ └──────────────────────┬──────────────────────────────────┘ │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌────────────┐ ┌──────────────┐ │ IntentParser │ │ SQLBuilder │ │ SQLExecutor │ │ LLM 意图解析 │ │ 模板拼装 │ │ MySQL 查询 │ └──────────────┘ └────────────┘ └──────────────┘ │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌────────────┐ ┌──────────────┐ │ChartGenerator│ │ InsightGen │ │ QueryTemplates│ │ 图表可视化 │ │ 洞察分析 │ │ SQL 模板库 │ └──────────────┘ └────────────┘ └──────────────┘设计思路采用 语义层 NL2SQL 方案，而非让 LLM 直接生成 SQL：LLM 只做意图解析：理解用户自然语言，输出结构化的 {intent, params} JSONSQL 由模板拼装：每种查询类型对应预定义的 SQL 模板，安全可控参数映射处理：通过 param_mapping 将自然语言参数（如"上个月"）转换为 SQL 条件优势：✅ 安全：杜绝 SQL 注入风险✅ 可控：SQL 逻辑可审查、可维护✅ 稳定：不依赖 LLM 生成正确 SQL 的能力✅ 可扩展：新增查询类型只需添加模板3. 项目结构Datas_agent/ ├── app.py # 主入口，启动服务 ├── config.py # 配置文件（数据库、LLM） ├── .env # 环境变量 ├── requirements.txt # 依赖清单 │ ├── core/ # 核心业务模块 │ ├── __init__.py │ ├── intent_parser.py # LLM 意图解析 │ ├── sql…

llamaindex rag示例项目
type: item
date: 2026-05-25T15:15:00+08:00
description: 项目结构llamaindex-rag-example/├── data/ # 存放待处理的原始文档（如PDF/TXT/Markdown等）├── storage_exp/ # 持久化存储向量索引的目录（自动生成）├── 01_build.py # 构建并持久化向量索引的脚本└── 02_query.py # 加载索引并进行问答查询的脚本PDF文件转Markdown#如果直接用 pdf版解析会很差，可以用mineru转化为md文件，但是测试 api 速度也不快， 可以直接在官网将文档转化下载，时间最快，还可以进行调整 官网：https://mineru.net/ 01_build.py 构建索引import os import time import torch from pathlib import Path from llama_index.core import VectorStoreIndex, Settings, Document from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core.node_parser import SimpleNodeParser # 配置 device = "cpu" #如果直接用 pdf版解析会很差，可以用mineru转化为md文件，但是测试 api 速度也不快， 可以直接在官网将文档转化下载，时间最快，还可以进行调整https://mineru.net/ markdown_path = "./data/test_manual.md" persist_dir = "./storage_exp" # 创建目录 os.makedirs(persist_dir, exist_ok=True) os.makedirs("./models", exist_ok=True) # 2. 配置全局 Embedding（本地 Qwen3 模型） EMBEDDING_PATH = "/Users/t-mac/.cache/huggingface/hub/models--Qwen--Qwen3-Embedding-0.6B/snapshots/c54f2e6e80b2d7b7de06f51cec4959f6b3e03418" Settings.embed_model = HuggingFaceEmbedding( model_name=EMBEDDING_PATH, trust_remote_code=True ) # 读取 Markdown 文件 print(f"读取 Markdown: {markdown_path}") with open(markdown_path, "r", encoding="utf-8") as f: markdown_content = f.read() print(f"文档长度: {len(markdown_content)} 字符") # 创建 Document doc = Document( text=markdown_content, metadata={ "source": Path(markdown_path).name, "file_path": str(Path(markdown_path).absolute()), } ) # 切分文档 print("切分文档...") parser = SimpleNodeParser(chunk_size=512, chunk_overlap=50) nodes = parser.get_nodes_from_documents([doc]) print(f"生成 {len(nodes)} 个节点") # 构建索引 print("构建索引...") start_time = time.time() index = VectorStoreIndex(nodes) build_time = time.time() - start_time print(f"索引构建完成，耗时 {build_time:.2f} 秒") # 保存索引 print(f"保存索引到 {persist_dir}...") index.storage_context.persist(persist_dir=persist_dir) # 统计 index_size = 0 for root, dirs, files in os.walk(persist_dir): for file in files: index_size += os.path.getsize(os.path.join(root, file)) print("\n" + …

Mac MLX 实战微调 Qwen3\-4B\-Instruct 客服模型完整教程
type: item
date: 2026-05-22T23:29:00+08:00
description: Mac MLX 实战微调 Qwen3-4B-Instruct 客服模型完整教程git地址https://github.com/zxliucn/Customer_Model_Fine-Tuning一、项目概述本项目基于 Apple MLX 框架，在 Mac 设备上轻量化微调 Qwen3-4B-Instruct 模型，针对冻冻网络冷冻食品客服场景进行专属适配。全程采用 LoRA 微调方案，仅训练少量参数，兼顾训练速度与效果，最终完成模型权重合并、GGUF 量化，可本地离线部署推理。核心场景：冷冻食品产品咨询、售后处理、物流查询、团购合作、会员问题等企业客服问答场景训练方案：MLX-LoRA 轻量化微调、Alpaca 数据格式、500 轮迭代训练最终产出：LoRA 微调权重、合并完整模型、Q4_K_M 量化 GGUF 模型二、完整项目结构标准化项目目录，分工明确，便于训练、权重管理与模型迭代：mlx3/ # 项目根目录 ├── adapters/ # LoRA 微调权重输出目录（迭代权重+最终权重） ├── data/ # 训练/验证数据集目录 │ ├── train.jsonl # 训练数据集 │ └── valid.jsonl # 验证数据集 ├── qwen3-4b-instruct/ # 原始 Qwen3-4B-Instruct 基座模型文件 ├── qwen3-4b-fused-iter500/ # 训练后合并的完整微调模型 ├── config.yaml # 训练核心超参数配置文件 └── train.sh # 一键启动训练脚本三、环境与模型准备3.1 依赖环境本项目基于 Mac MLX 框架，需提前安装对应依赖：pip install mlx-lm modelscope3.2 基座模型下载通过 modelscope 下载官方 Qwen3-4B-Instruct 2507 版本基座模型，自动保存至项目指定目录：modelscope download --model Qwen/Qwen3-4B-Instruct-2507 --local_dir ./qwen3-4b-instruct四、数据集准备采用标准 Alpaca 格式 JSONL 数据集，分为训练集和验证集，覆盖冷冻食品客服全场景问答，包含产品咨询、售后理赔、物流配送、会员权益、团购合作、食用指南、资质认证等场景。4.1 训练数据集 data/train.jsonl包含大量客服真实问答样本，用于模型微调学习，完整数据如下：{"prompt": "你是谁？", "completion": "您好，我是冻冻网络的智能客服助理。我们公司主营冷冻食品，包括鱼丸、虾滑、牛排、冰淇淋、预制菜等。请问有什么可以帮您的吗？"} {"prompt": "你们公司叫什么", "completion": "我们是冻冻网络，主营冷冻食品，比如鱼丸、虾滑、牛排、冰淇淋、预制菜等。需要我帮您推荐产品吗？"} {"prompt": "冻冻网络是干嘛的", "completion": "冻冻网络是一家冷冻食品公司，主要产品包括鱼丸、虾滑、牛排、冰淇淋、预制菜等。我们是专业的冷冻食品供应商，全程冷链配送~"} {"prompt": "你们卖什么", "completion": "我们主要卖冷冻食品哦~比如鱼丸、虾滑、牛排、冰淇淋、预制菜等等。您想了解哪一类？我可以给您详细介绍~"} {"prompt": "你是真人还是机器人", "completion": "我是冻冻网络的智能客服机器人~如果遇到我解决不了的问题，您可以拨打客服电话 400-xxx-886，转人工客服为您处理。"} {"prompt": "你们家的虾滑保质期多久？", "completion": "我们的虾滑在-18℃冷冻条件下保质期12个月。每包包装上都有具体生产日期哦~需要我帮您查某个批次的剩余保质期吗？"} {"prompt": "黑椒牛排辣不辣？小孩能吃吗？", "completion": "黑椒牛排是微辣口味，黑胡椒的香辣，小朋友可能不太适应。推荐您看看我们的原味牛排或者儿童鱼排，完全不辣，很受小朋友欢迎~"} {"prompt": "收到的鱼丸全化了，都软了！", "completion": "非常抱歉给您带来不好的体验！冷冻品在运输中化冻确实会影响品质。请您拨打我们的售后客服电话 400-xxx-886，提供订单号，我们会尽快为您核实并处理理赔。"} {"prompt": "我的订单怎么还没到？", "completion": "非常抱歉让您久等了。请您拨打我们的客服电话 400-xxx-886，提供订单号，我们会联系快递公司为您优先处理。"} {"prompt": "我不想要了，能退货吗？", "completion…

wechat_agent_ai - main.py
type: item
date: 2026-04-09T16:51:00+08:00
description: import re import hashlib import xml.etree.ElementTree as ET from datetime import datetime from fastapi import FastAPI, Request, Response # RAG from langchain_huggingface import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS # LLM from langchain_ollama import OllamaLLM # LangGraph from langgraph.checkpoint.memory import InMemorySaver from langgraph.graph import StateGraph, END from typing import TypedDict from langchain_core.messages import HumanMessage, AIMessage import requests import time app = FastAPI(title="微信公众号 RAG Agent") # ===================== 配置 ===================== WECHAT_TOKEN = "wechat_rag_agent_2026" WECHAT_ORIGIN_ID = "gh_cfbff1593cc5" EMBEDDING_PATH = "./rag/models--Qwen--Qwen3-Embedding-0.6B/snapshots/c54f2e6e80b2d7b7de06f51cec4959f6b3e03418" FAISS_INDEX_DIR = "./rag/faiss_index" LLM_MODEL = "my-qwen" OLLAMA_HOST = "http://localhost:11434" CACHE_EXPIRE_SECONDS = 30 SESSION_TIMEOUT = 60 # ================================================== # ===================== 优化版欢迎语 ===================== WELCOME_TEXT = """✨ 你好，欢迎使用智能励志助手 在这里，你可以随时获取正能量与成长感悟～ 📌 使用指南 1️⃣ 回复【今天】或【每日一句】 获取每日一句精美图文，中英双语励志短句 2️⃣ 发送关键词触发知识库 支持：励志、奋斗、努力、学习、知识、坚持 成长、名言、失败、成功、气馁、失望、沮丧、希望 3️⃣ 直接发送文字聊天 AI 会为你简洁回复，陪你聊天解惑 愿你步履不停，始终向阳 🌱 """ # 会话记录 USER_SESSION = {} MESSAGE_CACHE = {} LAST_MSG_ID = None def clean_expired_cache(): now = time.time() expired = [k for k, v in MESSAGE_CACHE.items() if v["expire_at"] < now] for key in expired: del MESSAGE_CACHE[key] # ---------------------- RAG ---------------------- device = "cpu" embeddings = HuggingFaceEmbeddings( model_name=EMBEDDING_PATH, model_kwargs={"device": device} ) rag_db = FAISS.load_local( FAISS_INDEX_DIR, embeddings, allow_dangerous_deserialization=True ) retriever = rag_db.as_retriever(k=2) # ---------------------- LLM ---------------------- llm = OllamaLLM(model=LLM_MODEL, base_url=OLLAMA_HOST) # ---------------------- 工具函数 ---------------------- def is_today_sentence(text): t = text.strip().lower() return t …

微信公众号 RAG Agent 最终版 GitHub 文档
type: item
date: 2026-04-09T16:50:00+08:00
description: 微信公众号 RAG Agent 最终版 GitHub 文档（已补全：项目目录、requirements.txt、Modelfile、Nginx反向代理、微信配置全流程、完整启动命令）🚀 项目介绍本项目是一个专为微信公众号设计的轻量智能对话Agent，基于 FastAPI + LangGraph + Ollama + FAISS 构建，支持：大模型闲聊（一句话短回答，适配微信场景）RAG 知识库检索日期类接口调用（每日一句）微信重试缓存机制：彻底解决公众号5秒超时问题，无需客服消息，100%保证消息送达Nginx 反向代理，适配公网部署核心优势：2核4G服务器即可稳定运行，纯CPU推理，无GPU依赖，零客服消息次数占用。📁 项目目录结构wechat_agent_ai/ ├── rag/ # RAG 知识库模块 │ ├── faiss_index/ # FAISS 向量索引文件（向量化后生成） │ ├── models--Qwen--Qwen3-Embedding-0.6B/ # 通义千问嵌入模型 │ ├── data_vectorization.py # 知识库向量化脚本（生成FAISS索引） │ ├── iciba_data_multi.json # 每日一句备用数据 │ └── rag_data_retrieval.py # RAG 检索测试脚本 ├── main.py # 主程序（微信接口+Agent+重试缓存核心逻辑） ├── main_1.py # 历史版本/备用代码 ├── test_local.py # 本地测试脚本（无需微信，直接测试Agent功能） ├── requirements.txt # 项目依赖清单（一键安装） ├── Modelfile # Ollama 自定义模型配置文件 ├── dockerfile # Docker 构建文件（可选） ├── start.sh # 启动脚本 ├── .dockerignore # Docker 忽略文件 └── README.md # 本说明文档目录说明文件/目录作用rag/RAG 知识库相关代码、模型、向量索引，用于知识库问答main.py项目核心主程序，包含微信公众号接口、LangGraph 工作流、重试缓存逻辑test_local.py本地测试脚本，可直接运行验证Agent功能，无需配置微信公众号requirements.txt项目所有Python依赖包，一键安装环境ModelfileOllama 自定义模型配置，用于构建适配微信的短回答模型 my-qwen📦 环境安装（通过 requirements.txt 一键部署）1. 前置依赖系统：Ubuntu 20.04+（推荐）Python：3.8+服务器：2核4G及以上，开放80端口（Nginx反向代理用）2. 安装 Ollama（大模型运行环境）# 一键安装 Ollama curl https://ollama.com/install.sh | sh # 拉取基础模型（qwen2:0.5b 超轻量，适配2核4G） ollama pull qwen2:0.5b-instruct-q2_K3. 构建自定义 Ollama 模型（Modelfile）# 创建 Modelfile（适配微信的短回答模型） tee Modelfile <<EOF FROM qwen2:0.5b-instruct-q2_K PARAMETER num_ctx 512 PARAMETER num_predict 64 PARAMETER temperature 0.1 PARAMETER top_p 0.7 PARAMETER num_thread 2 SYSTEM "直接回答，一句话。" EOF # 构建自定义模型 my-qwen ollama create my-qwen -f Modelfile # 测试模型（验证是否正常） ollama run my-qwen "你好"4. 一键安装 Python 依赖（requirements.txt）# 1. 创建并激活虚拟环境（推荐） python3 -m venv venv source venv/bin/activate # 2. 一键安装所有依赖 pip install -r requirements.txtrequirements.txt 完整内容fastapi==0.110.0 uvicorn==0.28.0 langchain==0.2.0 langgraph==0.0.56 langchain-ollama==0.1.0 langchain-huggingface==0.1.0 langchain-community==0.2.0 faiss-cpu==1.8.0 requests…

Memory Basics - main.py
type: item
date: 2026-03-11T14:15:00+08:00
description: """ LangChain 1.0 - Memory Basics (内存管理基础) ========================================== 本模块重点讲解 LangGraph 提供的内存管理机制，包括： 1. InMemorySaver - LangGraph 提供的内存管理 2. checkpointer 参数 - 为 Agent 添加内存 3. thread_id - 会话管理 4. 多轮对话状态保持 """ from langchain.agents import create_agent from langgraph.checkpoint.memory import InMemorySaver import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from init_model import get_chat_model from langchain_core.tools import tool from init_model import get_chat_model from langchain.agents import create_agent # 导入自定义工具 from tools import weather from tools import web_search from tools import calculator # 初始化数据 weather_tool = weather.get_weather web_search_tool = web_search.web_search calculator_tool = calculator.calculator chat_model = get_chat_model() # 创建一个简单的工具 @tool def get_user_info(user_id: str) -> str: """获取用户信息""" users = {"123": "张三，25岁，工程师", "456": "李四，30岁，设计师"} return users.get(user_id, "用户不存在") # ============================================================================ # 示例 简单客服机器人 # ============================================================================ def demo_simple_customer_service(): """ 演示简单客服机器人 """ agent = create_agent( model=chat_model, tools=[get_user_info], checkpointer=InMemorySaver(), # 添加内存 ) config = {"configurable": {"thread_id": "session_1"}} print("\n第一轮：查询用户信息") response1 = agent.invoke( {"messages": [{"role": "user", "content": "查询用户 123 的信息"}]}, config=config, ) print(f"Agent: {response1['messages'][-1].content}") print("\n第二轮：询问之前的信息") response2 = agent.invoke( {"messages": [{"role": "user", "content": "你之前查询的用户 123 信息是？"}]}, config=config, ) print(f"Agent: {response2['messages'][-1].content}") if __name__ == "__main__": demo_simple_customer_service()