构建文档智能问答:基于Langchain、开源模型与结构化数据的整合实践

一、系统架构设计:模块化与可扩展性

智能问答系统的核心在于将非结构化文档与结构化数据转化为可被模型理解的上下文信息。基于Langchain的模块化设计,系统可拆分为四大核心组件:

1.1 数据层设计

  • 文档解析模块:使用Langchain内置的PDF解析器(PyPDFLoader)和CSV解析器(CSVLoader),支持多格式文档的统一转换。对于加密PDF或复杂表格,建议结合PDFMiner或Pandas进行二次处理。
  • 向量存储引擎:采用FAISS或Chroma作为向量数据库,支持百万级文档块的快速检索。示例配置:
    ```python
    from langchain.vectorstores import FAISS
    from langchain.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name=”paraphrase-multilingual-MiniLM-L12-v2”)
vectorstore = FAISS.from_documents(documents, embeddings)

  1. ## 1.2 模型层设计
  2. - **模型选择**:推荐使用开源模型(如Llama2Qwen系列)或百度千帆平台提供的预训练模型,平衡性能与成本。对于金融、医疗等垂直领域,可通过持续预训练增强领域适应性。
  3. - **模型服务化**:通过FastAPI部署模型API,支持并发请求处理。示例服务代码:
  4. ```python
  5. from fastapi import FastAPI
  6. from transformers import AutoModelForCausalLM, AutoTokenizer
  7. app = FastAPI()
  8. model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
  9. tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
  10. @app.post("/generate")
  11. async def generate(prompt: str):
  12. inputs = tokenizer(prompt, return_tensors="pt")
  13. outputs = model.generate(**inputs, max_length=200)
  14. return {"response": tokenizer.decode(outputs[0])}

二、数据处理与增强:从原始文件到上下文

2.1 文档分块策略

  • 块大小优化:PDF文本建议分块为300-500词,CSV表格按行或列分组。使用Langchain的RecursiveCharacterTextSplitter:
    ```python
    from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=[“\n\n”, “\n”, “ “]
)
docs = text_splitter.split_documents(raw_documents)

  1. ## 2.2 结构化数据转换
  2. - **CSV处理**:将表格数据转为自然语言描述,例如:

原始数据:
| 产品 | 销量 | 地区 |
|———|———|———|
| A | 1200 | 华东 |

转换后:
“产品A在华东地区的销量为1200件”

  1. - **多模态融合**:对于包含图表的PDF,可通过OCR工具(如PaddleOCR)提取文字信息,结合表格数据构建完整上下文。
  2. # 三、检索增强生成(RAG)实现
  3. ## 3.1 混合检索策略
  4. - **语义检索+关键词过滤**:先通过向量相似度检索候选文档,再用BM25算法进行精确匹配。示例实现:
  5. ```python
  6. from langchain.retrievers import EnsembleRetriever
  7. from langchain.retrievers import BM25Retriever
  8. bm25_retriever = BM25Retriever.from_documents(docs)
  9. vector_retriever = vectorstore.as_retriever()
  10. ensemble_retriever = EnsembleRetriever(
  11. retrievers=[vector_retriever, bm25_retriever],
  12. weights=[0.7, 0.3]
  13. )

3.2 上下文优化

  • 动态上下文窗口:根据问题复杂度调整返回的文档块数量,避免信息过载。
  • 冗余消除:使用NLP技术检测重复内容,例如通过Sentence-BERT计算段落相似度。

四、性能优化与部署

4.1 响应速度优化

  • 向量数据库索引:使用HNSW算法构建近似最近邻索引,将检索延迟从秒级降至毫秒级。
  • 模型量化:对7B/13B参数模型进行4/8位量化,减少显存占用。示例代码:
    ```python
    from optimum.quantization import export_model

export_model(
model_path=”meta-llama/Llama-2-7b-chat-hf”,
output_path=”./quantized”,
quantization_config_name=”gptq”
)
```

4.2 部署架构选择

  • 单机部署:适用于内部测试,推荐使用NVIDIA A100 80GB显卡。
  • 分布式部署:通过Kubernetes管理模型服务与向量数据库,支持横向扩展。

五、最佳实践与注意事项

5.1 数据质量保障

  • 预处理检查:移除PDF中的页眉页脚、目录等噪声内容。
  • 多语言支持:对中英文混合文档,需使用多语言嵌入模型(如text-embedding-ada-002)。

5.2 安全与合规

  • 敏感信息脱敏:在文档解析阶段识别并屏蔽身份证号、电话等PII信息。
  • 访问控制:通过API网关实现权限管理,支持按部门/角色分配查询额度。

5.3 持续迭代

  • 反馈循环:记录用户对回答的修正,用于微调模型或优化检索策略。
  • 监控体系:建立Prometheus+Grafana监控面板,跟踪QPS、响应时间、准确率等关键指标。

六、典型应用场景

  1. 金融合规:快速定位监管文件中的条款要求,自动生成合规报告。
  2. 医疗问诊:结合电子病历与医学文献,提供诊断建议(需配合专业医生审核)。
  3. 法律咨询:解析合同条款与司法判例,回答法律风险问题。

通过Langchain的灵活架构与开源生态,企业可低成本构建满足垂直领域需求的智能问答系统。实际部署时,建议从MVP版本开始,逐步迭代优化检索策略与模型性能,最终实现与业务系统的深度集成。