ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于OpenClaw框架构建中医AI智能体:从知识库检索到卡片生成实战

2026/8/7 9:04:39 拓冰建站 浏览量
基于OpenClaw框架构建中医AI智能体:从知识库检索到卡片生成实战 1. 项目概述当“剥龙虾”遇上“中医技能”一次跨界AI智能体实战最近在折腾一个挺有意思的事儿一边处理着手里的小龙虾一边琢磨着怎么用AI做个能“起号”的中医技能。这听起来有点风马牛不相及但核心逻辑其实很清晰用当下最火的AI智能体Agent技术把一个垂直领域的专业知识比如中医方剂封装成一个可交互、能传播的数字化产品。这不仅是技术上的尝鲜更是一种低成本验证内容方向和获取初始流量的实战策略。“起号”是内容创作者和运营者永恒的课题无论是短视频、公众号还是知识星球冷启动阶段总是最难的。传统方式要么靠持续输出高质量内容硬扛要么靠投放成本都不低。而AI智能体提供了一个新思路做一个有用、有趣、能解决特定问题的“数字助手”让它成为你内容的延伸和流量入口。中医作为一个拥有深厚群众基础和文化认同同时又存在大量信息不对称的领域无疑是绝佳的试验田。用户有查询方剂、了解药材、咨询简单养生建议的需求而一个设计得当的AI技能可以7x24小时、标准化地满足这些需求积累精准用户。在这个过程中我选择了OpenClaw作为核心开发框架。它不是一个具体的应用而是一个开源的AI智能体开发与部署平台你可以把它理解为一个“乐高积木箱”提供了连接大模型、定义工具Tools、编排工作流Workflow、并最终发布为API或交互界面的能力。相比从零开始写代码调用大模型APIOpenClaw这类框架大幅降低了智能体开发的门槛让开发者能更专注于业务逻辑本身。我这次的目标就是利用OpenClaw构建一个能理解自然语言中医咨询、检索方剂知识库并生成美观“方剂卡片”的智能体。2. 核心思路与方案选型为什么是OpenClaw中医知识库这个项目的核心是构建一个“中医问答-卡片生成”智能体。拆解开来需要解决几个关键问题如何让AI理解中医问题如何获取准确的中医方剂数据如何将结果结构化、可视化地呈现以及如何低成本地部署和分享2.1 技术栈选型背后的考量智能体框架OpenClaw为什么是它在众多AI智能体框架如LangChain、Semantic Kernel、Dify、Coze中OpenClaw吸引我的点在于其“开箱即用”的部署体验和清晰的架构。它原生支持Docker容器化部署这对于后期上云、扩缩容极其友好。其设计理念强调“工具”的封装和“工作流”的编排与我们想做的“查询-处理-输出”流水线非常契合。从热搜词也能看出它的安装、部署是社区关注的热点说明生态在活跃成长遇到问题更容易找到解决方案。避坑提示正如热词中提到的错误openclaw gateway could not start the cliOpenClaw对运行环境尤其是Python版本、依赖包冲突比较敏感。建议从一开始就使用Docker或严格的虚拟环境如conda来隔离避免污染系统环境。大模型基座选择与调整核心需求需要模型具备较强的中文理解能力、指令遵循能力以及一定的推理能力。中医术语和描述相对专业模型需要能准确捕捉用户意图例如“我咳嗽有黄痰喉咙痛”应关联到“风热感冒”及相关方剂。实践方案我测试了多个开源和闭源模型。对于快速原型验证GPT-3.5-Turbo或GPT-4的API是可靠的选择效果稳定。若考虑长期成本和数据隐私可以在OpenClaw中接入开源的Qwen通义千问、ChatGLM或Llama系列模型的本地部署版本。OpenClaw的良好兼容性使得切换模型基座变得相对容易。知识库构建中医方剂数据数据来源准确是生命线。我使用了公开的《方剂学》教材数据、药典资料以及经过审核的权威中医药网站信息整理成结构化的JSON或CSV文件。关键字段包括方剂名称、出处、组成、用法、功效、主治、方解简要、禁忌等。知识检索并非所有问题都需要大模型“凭空”生成。我们将方剂知识库作为外部数据源Tool。当用户提问时智能体首先将问题转换为查询关键词在知识库中进行语义搜索可用OpenClaw集成的向量数据库如Chroma、Milvus或简单的关键词匹配找到最相关的几个方剂再将结果交给大模型进行总结、比对和最终回答。这保证了信息的准确性并减少了模型的“幻觉”。输出呈现方剂卡片生成设计目标生成的结果不能只是一段文字。一张设计精良、信息清晰的卡片更利于用户在社交媒体上分享和传播这正是“起号”所需要的素材。技术实现OpenClaw的智能体可以调用一个“卡片生成工具”。这个工具可以是一个简单的Python函数它接收结构化方剂数据使用模板引擎如Jinja2或绘图库如Pillow、reportlab生成一张包含关键信息的图片。更进阶的做法可以集成前端库直接输出一个HTML片段或小程序卡片代码。2.2 整体工作流设计最终的智能体工作流被设计成一个清晰的管道用户输入自然语言中医问题 ↓ OpenClaw智能体接收调用“意图理解”模块 ↓ 解析出核心症状、证型等关键实体 ↓ 调用“方剂知识库检索工具”获取候选方剂列表 ↓ 大模型对候选列表进行精炼、对比、解释生成个性化建议文本 ↓ 调用“方剂卡片生成工具”将文本与数据转化为图片 ↓ 输出给用户文本建议 方剂卡片图片这个流程确保了从用户问题到最终成果的每一步都是可控、可解释的。3. 实操搭建从零部署OpenClaw到技能上线理论清晰后我们进入动手环节。以下是我在Linux服务器Ubuntu 20.04上的实操记录。3.1 环境准备与OpenClaw部署注意官方文档是首要参考但以下记录包含了我实际踩坑后的优化步骤。步骤1基础环境搭建确保系统已安装Docker和Docker Compose。这是最推荐的方式能避免绝大多数环境冲突。# 更新包列表并安装依赖 sudo apt-get update sudo apt-get install -y docker.io docker-compose git python3-pip # 将当前用户加入docker组避免每次sudo sudo usermod -aG docker $USER newgrp docker # 或注销重新登录生效步骤2获取OpenClaw直接从GitHub克隆官方仓库。建议检查最新的Release版本以获得稳定体验。git clone https://github.com/openclaw-ai/openclaw.git cd openclaw步骤3配置与启动OpenClaw的Docker部署非常简洁。核心配置文件是.env和docker-compose.yml。# 复制环境变量示例文件 cp .env.example .env编辑.env文件最关键的是配置大模型的连接。如果你使用OpenAI API# .env 文件关键配置 LLM_PROVIDERopenai OPENAI_API_KEYsk-your-actual-openai-api-key-here OPENAI_BASE_URLhttps://api.openai.com/v1 # 如果使用代理或自定义端点可修改如果你打算使用本地部署的Ollama例如运行了Qwen2.5配置可能如下LLM_PROVIDERollama OLLAMA_BASE_URLhttp://host.docker.internal:11434 # 从Docker容器内访问主机服务 OLLAMA_MODELqwen2.5:7b实操心得host.docker.internal这个主机名在Linux的Docker Desktop中很好用但在纯Linux Docker环境下可能无法解析。如果遇到连接问题一个更通用的方法是使用宿主机的实际IP地址如172.17.0.1或者创建一个共享网络。配置完成后一键启动docker-compose up -d使用docker-compose logs -f可以查看实时日志确认服务是否正常启动。访问http://你的服务器IP:3000应该能看到OpenClaw的Web管理界面。3.2 构建中医方剂知识库工具OpenClaw的核心功能之一是“工具Tools”。我们将把中医方剂查询封装成一个工具。步骤1准备数据将收集整理的中医方剂数据保存为formulas.json结构如下[ { name: 麻黄汤, source: 《伤寒论》, composition: 麻黄9g桂枝6g杏仁6g甘草3g, usage: 水煎服温覆取微汗, efficacy: 发汗解表宣肺平喘, indication: 外感风寒表实证。恶寒发热头身疼痛无汗而喘舌苔薄白脉浮紧。, analysis: 麻黄为君发汗解表桂枝为臣助麻黄发汗杏仁为佐降利肺气甘草为使调和诸药。, contraindication: 表虚自汗、外感风热、阴虚咳喘者忌用。 }, // ... 更多方剂 ]步骤2创建知识库检索工具在OpenClaw的管理界面中进入“Tools”部分创建新的自定义工具。这里我们编写一个Python函数来实现语义搜索。OpenClaw支持直接上传Python文件。创建一个文件tcm_knowledge_tool.pyimport json from typing import List, Dict, Any import numpy as np from sentence_transformers import SentenceTransformer # 需要安装 # 初始化模型小型句子编码器用于计算语义相似度 model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) class TCMFormulaTool: def __init__(self, data_path: str formulas.json): with open(data_path, r, encodingutf-8) as f: self.formulas json.load(f) # 为所有方剂的“indication”主治和“name”名称生成嵌入向量 self.texts [f{f[name]}{f[indication]} for f in self.formulas] self.embeddings model.encode(self.texts, convert_to_tensorTrue) def search(self, query: str, top_k: int 3) - List[Dict[str, Any]]: 根据查询语句返回最相关的top_k个方剂 query_embedding model.encode(query, convert_to_tensorTrue) # 计算余弦相似度 similarities np.dot(self.embeddings, query_embedding) / ( np.linalg.norm(self.embeddings, axis1) * np.linalg.norm(query_embedding) ) top_indices np.argsort(similarities)[-top_k:][::-1] # 取相似度最高的k个 results [self.formulas[i] for i in top_indices] return results # 实例化工具供OpenClaw调用 tcm_tool TCMFormulaTool() def search_formulas(query: str) - str: OpenClaw工具的标准入口函数返回格式化字符串 results tcm_tool.search(query) if not results: return 未找到相关方剂。 output [] for i, formula in enumerate(results, 1): output.append(f{i}. 【{formula[name]}】) output.append(f 组成{formula[composition]}) output.append(f 功效{formula[efficacy]}) output.append(f 主治{formula[indication]}) output.append() return \n.join(output)将这个文件上传到OpenClaw并配置工具名称如search_tcm_formulas、描述和参数query。OpenClaw会自动将其包装成智能体可调用的工具。注意事项首次运行会下载Sentence Transformer模型可能需要一定时间。对于生产环境可以考虑将模型提前下载好并挂载到容器中或者使用更轻量级的检索方式如TF-IDF作为初版。3.3 创建智能体与编排工作流有了知识库工具我们就可以在OpenClaw的图形化界面中组装智能体了。步骤1创建智能体在“Agents”页面点击创建。给智能体起个名字比如“中医方剂小助手”并选择基础大模型如GPT-3.5-Turbo。步骤2编排工作流在智能体的编辑界面我们可以通过拖拽或配置的方式定义其行为。系统提示词System Prompt这是智能体的“人格”和基础指令。我使用的提示词如下你是一位资深中医师助手专业、严谨且富有耐心。你的核心任务是帮助用户根据症状查询和了解中医方剂。 工作流程 1. 仔细分析用户描述的症状如恶寒、发热、咳嗽、痰的颜色质地、舌苔、脉象等。 2. 调用search_tcm_formulas工具以症状关键词进行查询。 3. 收到工具返回的方剂列表后结合你的中医知识向用户解释这些方剂中哪个或哪几个可能最对症并简要说明方义和适用情况。 4. 最后提醒用户中医讲究辨证论治此建议仅供参考实际用药请咨询注册中医师。 回答风格亲切、清晰、有条理避免使用过于晦涩的古文。这段提示词明确了角色、步骤和边界能很好地引导模型行为。工具绑定在智能体配置中将我们之前创建的search_tcm_formulas工具添加进来。这样智能体在推理过程中就能在需要时自主调用这个工具了。测试与迭代在界面的聊天窗口直接测试。输入“我最近感冒了怕冷不出汗还有点咳嗽”观察智能体是否成功调用工具并给出了合理的方剂如麻黄汤和建议。根据测试结果反复调整系统提示词和工具的描述直到行为符合预期。3.4 实现方剂卡片生成与输出文本回答有了我们还需要视觉化的卡片。这需要再创建一个工具。步骤1创建卡片生成工具新建一个Python文件generate_card.py使用Pillow库来生成图片。from PIL import Image, ImageDraw, ImageFont import json import textwrap def generate_formula_card(formula_data: dict, output_path: str formula_card.png) - str: 根据方剂数据生成卡片图片。 formula_data: 包含方剂信息的字典 output_path: 图片输出路径 返回图片保存路径 # 卡片尺寸和背景 width, height 800, 1000 background_color (255, 250, 240) # 米白色 title_color (139, 0, 0) # 深红色 text_color (50, 50, 50) # 深灰色 img Image.new(RGB, (width, height), colorbackground_color) draw ImageDraw.Draw(img) # 加载字体确保服务器上有中文字体如SimHei.ttf try: title_font ImageFont.truetype(SimHei.ttf, 40) header_font ImageFont.truetype(SimHei.ttf, 28) body_font ImageFont.truetype(SimHei.ttf, 24) except: # 备用字体 title_font ImageFont.load_default() header_font ImageFont.load_default() body_font ImageFont.load_default() # 绘制标题 title formula_data.get(name, 中医方剂) draw.text((width//2, 50), title, filltitle_color, fonttitle_font, anchormm) # 绘制信息栏 y_offset 130 line_height 40 info_items [ (【出处】, formula_data.get(source, )), (【组成】, formula_data.get(composition, )), (【用法】, formula_data.get(usage, )), (【功效】, formula_data.get(efficacy, )), (【主治】, formula_data.get(indication, )), (【禁忌】, formula_data.get(contraindication, 暂无)), ] for header, content in info_items: # 绘制标题头 draw.text((50, y_offset), header, filltitle_color, fontheader_font) # 绘制内容自动换行 content_lines textwrap.wrap(content, width30) # 每行约30个汉字 for line in content_lines: draw.text((80, y_offset 5), line, filltext_color, fontbody_font) y_offset line_height y_offset 10 # 段间距 # 底部提示 footer 温馨提示本方剂信息仅供参考用药请遵医嘱。 draw.text((width//2, height - 50), footer, fill(150, 150, 150), fontbody_font, anchormm) img.save(output_path) return output_path # OpenClaw工具函数 def create_formula_card(formula_name: str, formula_json: str) - str: OpenClaw工具入口根据方剂名和JSON数据生成卡片返回图片路径或URL data json.loads(formula_json) # 在实际部署中output_path应指向一个Web可访问的目录 card_path generate_formula_card(data, f/tmp/{formula_name}_card.png) # 假设我们有一个静态文件服务可以返回图片的URL image_url fhttps://你的域名/static/cards/{formula_name}_card.png # 这里简化处理直接返回路径。实际需将图片上传到云存储或指定目录。 return f方剂卡片已生成图片地址示例: {image_url}。卡片关键信息已在上文展示。同样将这个工具上传到OpenClaw命名为generate_formula_card。步骤2修改智能体工作流现在我们需要让智能体在给出文本建议后自动为最推荐的方剂生成卡片。这需要修改系统提示词并可能涉及更复杂的工作流编排如果OpenClaw支持多步骤工作流。一个简单的方法是增强提示词在原有系统提示词末尾添加5. 在推荐了最合适的方剂后调用generate_formula_card工具传入该方剂的名称和详细信息为它生成一张美观的总结卡片。 6. 在回复中除了文本解释还要告诉用户卡片已生成并提供查看或下载卡片的指引。这样智能体在推理过程中会在适当的时候链式调用两个工具先搜索再生成卡片。4. 部署发布与“起号”应用智能体在OpenClaw后台运行良好后我们需要把它暴露出去让用户能访问。4.1 提供访问接口OpenClaw通常提供几种方式API接口OpenClaw可以为智能体生成专用的API端点。我们可以获取这个API URL和密钥集成到自己的小程序、H5页面或公众号后台。Webhook可以配置当智能体收到消息时触发一个Webhook到我们的服务器进行更复杂的业务处理。嵌入网页一些框架支持生成可嵌入的聊天窗口组件。对于“起号”这个场景最直接的方式是方案A轻量将OpenClaw生成的聊天窗口嵌入到一个简单的静态网页中将这个网页发布到GitHub Pages、Vercel等免费平台。在抖音、小红书、公众号的文章中引导用户访问这个网页与“中医助手”对话。方案B集成将OpenClaw的API对接到微信公众号的自动回复或小程序中用户体验更原生。4.2 内容运营与“起号”策略技术实现只是基础如何让这个技能带来流量才是关键。内容素材生成主动使用自己的智能体输入各种典型症状如“熬夜上火怎么办”、“湿气重有什么表现”将智能体生成的文本建议和精美的方剂卡片保存下来。这些就是现成的、高质量的图文内容。多平台分发小红书适合发布精美的方剂卡片配上“AI中医助手推荐”等标签文案强调实用性和趣味性。抖音/视频号可以将与智能体的对话过程录屏配上解说制作成“用AI看中医”的短视频。公众号可以撰写文章介绍这个AI技能的创作过程并嵌入交互入口吸引技术爱好者和中医爱好者。引导互动与沉淀在所有内容中明确引导用户去你的专属页面体验完整的AI问诊对话。可以设置“打卡”机制比如体验后回复关键词获取“体质自测报告”将公域流量引导至私域社群。4.3 成本考量与优化大模型API成本如果使用GPT-4交互成本较高。建议初期使用GPT-3.5-Turbo或切换到本地部署的7B-14B参数开源模型在效果和成本间取得平衡。算力成本如果使用本地模型需要一台带有GPU的服务器。云服务器按量计费是灵活的选择。优化方向缓存对常见问题如“感冒怎么办”的答案和卡片进行缓存避免重复调用模型和工具。知识库压缩使用更高效的向量数据库和索引提升检索速度。流量控制在免费体验页面设置简单的排队或每日次数限制防止被刷爆。5. 常见问题与排查实录在开发和部署过程中我遇到了不少问题这里记录下最典型的几个及其解决方法。5.1 OpenClaw部署与启动问题问题现象可能原因解决方案docker-compose up后服务不断重启或退出。端口冲突、.env文件配置错误、内存不足。1. 检查docker-compose logs查看具体错误。2. 确认宿主机的3000、8000等端口未被占用。3. 仔细核对.env中的API Key和URL确保无误。4. 对于内存不足可尝试在docker-compose.yml中为服务设置内存限制mem_limit: 2g。访问Web界面 (IP:3000) 连接被拒绝。防火墙未开放端口、Docker服务未运行、容器启动失败。1.sudo ufw allow 3000(Ubuntu)。2.systemctl status docker确保Docker服务运行。3.docker ps查看容器是否处于Up状态。智能体调用工具时超时或失败。工具代码有Bug、工具依赖未安装、网络问题。1. 在OpenClaw的Tool日志中查看具体报错。2. 确保自定义工具的Python代码在本地测试通过。3. 如果工具需要访问外部API或数据库确保Docker容器网络能通。5.2 智能体行为不符合预期问题智能体不调用工具而是自己胡编乱造方剂。排查检查系统提示词是否清晰指令了调用工具的步骤和条件。模型有时会“偷懒”。可以在提示词中强调“你必须调用search_tcm_formulas工具来获取信息”并设定不调用工具时的惩罚性描述。问题调用工具返回的结果智能体解读错误。排查这可能是工具返回的数据格式太复杂或者模型理解能力有限。优化工具返回的数据使其更简洁、结构化例如用清晰的Markdown列表。同时在提示词中指导模型如何解读这些数据“工具返回了一个方剂列表每个方剂包含名称、组成、功效。请你比较它们的主治描述与用户症状的匹配度。”问题生成的方剂卡片图片中文显示为乱码。排查这是Docker容器内缺少中文字体导致的。解决方案是将宿主机的字体文件挂载到容器中。# 在 docker-compose.yml 中为运行工具的服务添加卷挂载 services: openclaw-backend: # 假设是你的后端服务名 volumes: - /usr/share/fonts:/usr/share/fonts:ro # 挂载系统字体目录 - ./local_fonts:/app/fonts:ro # 或挂载项目内的字体文件然后在Python代码中指定字体路径ImageFont.truetype(/app/fonts/SimHei.ttf, 40)。5.3 性能与扩展性问题响应慢首次调用工具加载模型慢或者检索大量数据慢。优化将Sentence Transformer模型提前下载并挂载到容器避免每次启动下载。对于知识库考虑使用专业的向量数据库如Qdrant并建立索引。多人同时访问卡顿优化OpenClaw本身可能不是为高并发设计。对于公开服务可以考虑在其前端加一个负载均衡或者将智能体API封装到性能更好的后端服务如FastAPI中由后端服务来管理并发和队列。这个项目从“剥龙虾”时的突发奇想到一步步实现让我深刻感受到AI智能体不再是遥不可及的技术概念。它就像一套现代化的木工工具让每个有想法的人即使不是编程专家也能动手打造出解决特定问题的数字产品。中医方剂卡片只是一个起点同样的模式可以复制到法律咨询、考研规划、宠物养护等无数个垂直领域。关键在于你是否能精准地定义问题、整理知识、并设计出流畅的人机交互流程。最后再啰嗦一句医疗健康领域无小事我们做的这个“技能”务必在显著位置声明“仅供参考不能替代专业医疗建议”这是技术的边界也是开发者的责任。