1. 项目背景与核心价值
作为一名长期深耕AI医疗领域的开发者,我一直在探索如何将前沿的大语言模型技术落地到中医诊疗场景。传统中医知识体系庞大且高度非结构化,临床经验多以古籍文献、医案记录等形式存在,这给AI技术的应用带来了独特挑战。经过半年多的实践迭代,我们团队基于LangChain框架打造了一套中医临床智能问答系统,成功实现了中医知识的智能化检索与生成。
这个系统的核心创新点在于将RAG(检索增强生成)架构与中医诊疗场景深度结合。与通用领域的问答系统不同,中医诊疗对专业术语的准确性、辨证论治的逻辑性有着极高要求。我们通过以下设计解决了这些痛点:
-
领域适配的文本处理:针对中医文献特有的古文白话混杂、术语密集等特点,定制了文本分块策略。例如将《伤寒论》等典籍按"条辨"分块,保持辨证论治的完整性。
-
中西医结合的检索增强:在向量检索阶段融合症状关键词匹配与语义相似度计算,确保检索结果既符合医学逻辑又贴近用户自然语言表达。
-
可控的生成机制:通过Prompt工程约束大模型的生成方向,要求其必须基于检索到的中医典籍片段进行解释,避免"自由发挥"导致的理论偏差。
2. 技术架构解析
2.1 整体系统设计
系统采用典型的三层架构:
code复制[前端层] Vue3 + ElementPlus
│
↓ HTTP/HTTPS
[业务层] Flask RESTful API
│
↓ gRPC
[AI层] LangChain + Ollama + Chroma
前端使用Vue3组合式API开发,采用Pinia进行状态管理,ElementPlus提供UI组件。这种选型主要考虑:
- Vue3的响应式系统适合处理动态问答交互
- ElementPlus的Form组件完美适配中医问诊表单场景
- 组合式API更利于封装可复用的问答逻辑
后端服务基于Flask构建,主要模块包括:
auth/:JWT认证与RBAC权限控制api/:RESTful接口路由services/:核心业务逻辑models/:数据库ORM映射utils/:中医专业工具库
2.2 核心AI组件选型
LangChain 作为AI编排框架,主要处理:
- 文档加载与分块(
RecursiveCharacterTextSplitter) - 检索链构建(
MultiRetriever) - 问答链定制(
ConversationalRetrievalChain)
Ollama 本地运行中医领域微调的大模型:
- 基础模型:llama3-8b
- 微调数据:2000+中医医案、50+经典典籍
- 量化版本:Q4_K_M(平衡精度与推理速度)
Chroma 作为向量数据库:
- 嵌入模型:
bge-small-zh-v1.5 - 索引类型:HNSW
- 检索策略:MMR(最大边际相关性)
实践发现:中医术语的向量化需要特殊处理。我们通过在嵌入前对"少阳病"、"舌苔薄白"等术语添加[TCM]标记,显著提升了检索准确率。
3. 关键实现细节
3.1 中医文档处理流水线
中医文献处理有三大挑战:
- 古文与现代文混杂
- 专业术语密度高
- 辨证论治需要完整上下文
我们的解决方案:
python复制class TCMTextSplitter(RecursiveCharacterTextSplitter):
def __init__(self):
super().__init__(
chunk_size=512,
chunk_overlap=80,
separators=["\n\n", "。", "!", "?", ";", "\n", ",", " "]
)
def split_text(self, text: str) -> List[str]:
# 预处理:识别并保护中医特殊结构
text = self._protect_tcm_patterns(text)
return super().split_text(text)
def _protect_tcm_patterns(self, text):
# 保护"症状-舌脉-治法-方药"的完整结构
pattern = r"(主诉|症见).*?(舌[^\n]+)。.*?(脉[^\n]+)。.*?(治法|治则).*?(方药|处方).*?:(.+?)(?=\n\n|$)"
return re.sub(pattern, lambda m: f"【完整医案】{m.group(0)}", text, flags=re.DOTALL)
实际运行中,这种处理使关键辨证信息的完整保留率从63%提升到92%。
3.2 检索增强生成实现
RAG链的核心优化点:
python复制def create_tcm_qa_chain():
# 1. 构建混合检索器
keyword_retriever = TFIDFRetriever.from_texts(texts)
vector_retriever = Chroma.as_retriever()
combined_retriever = EnsembleRetriever(
retrievers=[vector_retriever, keyword_retriever],
weights=[0.7, 0.3]
)
# 2. 中医特化Prompt模板
prompt_template = """你是一名资深中医专家,请严格根据以下中医典籍内容回答问题。
...
"""
# 3. 带校验的生成链
return ConversationalRetrievalChain.from_llm(
llm=Ollama(model="tcm-llama3"),
retriever=combined_retriever,
condense_question_prompt=CONDENSE_PROMPT,
qa_prompt=PromptTemplate.from_template(prompt_template),
return_source_documents=True,
verbose=True
)
3.3 性能优化实践
针对中医长文本处理的优化措施:
- 批量嵌入处理:
python复制# 配置嵌入批处理
embeddings = OllamaEmbeddings(
model="bge-small-zh-v1.5",
base_url=OLLAMA_URL,
embed_batch_size=32, # 实测最佳批次
timeout=60.0
)
- 分级缓存策略:
- 一级缓存:Redis存储高频问答对(TTL 24h)
- 二级缓存:本地SQLite存储诊疗方案模板
- 异步处理流程:
python复制@app.route("/api/ask", methods=["POST"])
async def ask_question():
# 异步执行避免阻塞
result = await qa_chain.acall({
"question": request.json["question"],
"chat_history": get_history()
})
return jsonify(result)
4. 典型问题与解决方案
4.1 术语一致性处理
问题现象:
用户问"上火怎么办",系统返回"治宜清热泻火",但专业中医应区分:
- 实火(清热解毒)
- 虚火(滋阴降火)
解决方案:
- 构建中医术语标准化映射表
- 在检索前进行查询扩展:
python复制def expand_tcm_query(query):
mapping = {
"上火": ["实火", "虚火", "肝火", "胃火"],
"头晕": ["眩晕", "头昏", "眩冒"]
}
for term, synonyms in mapping.items():
query = query.replace(term, f"{term} OR {' OR '.join(synonyms)}")
return query
4.2 古籍现代文混合理解
问题场景:
《伤寒论》原文:"太阳病,发汗后,大汗出..."
现代用户问:"感冒出汗后还发烧怎么办"
处理方法:
- 构建古今症状映射词典
- 在嵌入模型前添加时代标记:
python复制text = "【古代】太阳病,发汗后...【现代】感冒发烧治疗"
5. 部署实践要点
5.1 硬件配置建议
- 开发环境:NVIDIA RTX 3090 (24GB) + 32GB RAM
- 生产环境:A10G (24GB) × 2 + 64GB RAM
- Ollama量化模型选择:
- Q4_K_M:平衡选择(实测速度18 tokens/s)
- Q5_K_M:精度优先(速度12 tokens/s)
- IQ2_XS:边缘部署(速度25 tokens/s)
5.2 中医领域微调技巧
-
数据准备:
- 经典典籍:伤寒论、金匮要略等(结构化标注)
- 现代医案:3000+真实病例(脱敏处理)
- 方剂知识:800+经典方剂组成与功效
-
微调命令示例:
bash复制ollama create tcm-llama3 -f ./Modelfile
# Modelfile内容:
FROM llama3:8b
SYSTEM "你是一名资深中医专家..."
TEMPLATE """{{ if .System }}<|system|>
{{ .System }}</s>{{ end }}{{ .Prompt }}"""
PARAMETER num_ctx 8192
ADAPTER ./tcm-lora.q4_0.gguf
6. 效果评估与改进
我们邀请5位中医专家对系统进行双盲测试:
| 评估维度 | 传统检索系统 | 本系统 |
|---|---|---|
| 术语准确性 | 68% | 92% |
| 辨证合理性 | 71% | 89% |
| 方剂适用性 | 65% | 84% |
| 响应速度(秒) | 1.2 | 2.8 |
当前主要局限:
- 对脉象描述的理解仍需加强
- 复杂病机的推理链条不够完善
- 中西医结合场景处理生硬
下一步计划:
- 引入中医知识图谱增强推理
- 开发辨证论治的可视化解释
- 优化多轮问诊的上下文管理