用Langchain生成合成数据
我们将使用LangChain——一个简化与大型语言模型工作的库来创建合成医疗账单记录。

在当今以数据为驱动的世界中,获取高质量、真实的数据库对于开发算法、训练机器学习模型和原型设计新系统至关重要。然而,在处理敏感数据(如医疗账单记录)时,隐私问题和有限的数据可用性可能会造成重大障碍。这就是合成数据发挥作用的地方。

什么是合成数据?
合成数据是人工创建的数据,旨在与现实世界的数据相似,但不包含任何实际的敏感或个人信息。它使用数学模型、算法或先进的AI工具(如大型语言模型(LLM))生成,以复制真实数据集的结构和模式。
可以将其视为真实数据的替身:它看起来和行为类似,但保持了隐私安全。这使得它在医疗保健等领域特别有用,其中保护患者信息至关重要。
为什么使用合成数据?
合成数据带来了许多好处,特别是在像医疗账单这样的敏感领域。以下是考虑使用它的原因:
- 隐私和安全:不包含任何真实的个人信息,消除了隐私泄露的风险。
- 数据增强:扩展有限的数据集用于训练机器学习模型。
- 灵活性:允许你创建可能不存在于真实数据中的特定或罕见场景。
- 成本效益:比收集和清理现实世界的数据更便宜。
- 法规合规:符合严格的个人数据保护法律,如GDPR或HIPAA。
- 模型鲁棒性:提供多样化的数据以提高AI模型性能。
- 快速原型设计:加快测试和开发速度,无需等待真实数据。
- 受控实验:允许你模拟特定条件进行研究。
- 访问数据:当真实数据稀缺或不可用时提供解决方案。
注意事项:虽然合成数据非常有用,但它并不是真实数据的完美替代品。它可能会错过一些现实世界的复杂性,因此在将其用于关键应用之前,请始终评估其质量和适用性。
现在,让我们动手实践!我们将使用LangChain——一个简化与大型语言模型工作的库来创建合成医疗账单记录。如果你是AI或编码的新手,不要担心——这个逐步指南旨在易于上手。
1、环境设置和依赖安装
首先,我们需要通过安装所需的Python库来设置环境。
%%capture
!pip install -U langchain langchain_experimental openai
import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.pydantic_v1 import BaseModel
from langchain_experimental.tabular_synthetic_data.base import SyntheticDataGenerator
from langchain_experimental.tabular_synthetic_data.openai import create_openai_data_generator, OPENAI_TEMPLATE
from langchain_experimental.tabular_synthetic_data.prompts import SYNTHETIC_FEW_SHOT_SUFFIX, SYNTHETIC_FEW_SHOT_PREFIX
2、定义数据模型
每个数据集都需要一种结构——或“模式”——以确保一致性。我们将使用Pydantic模型为我们的医疗账单记录定义一种。
class MedicalBilling(BaseModel):
patient_id: int
patient_name: str
diagnosis_code: str
procedure_code: str
total_charge: float
insurance_claim_amount: float
分解:
- patient_id: 一个唯一的整数(例如,123456)。
- patient_name: 一个字符串,表示患者的姓名(例如,“John Doe”)。
- diagnosis_code: 一个字符串,如“J20.9”(急性支气管炎)。
- procedure_code: 一个字符串,如“99203”(门诊就诊)。
- total_charge: 一个浮点数,表示总费用(例如,500.0)。
- insurance_claim_amount: 一个浮点数,表示保险索赔金额(例如,350.0)。
3、提供示例数据
为了帮助生成器理解我们想要什么,我们将提供几个示例记录。
examples = [
{"example": """Patient ID: 123456, Patient Name: John Doe, Diagnosis Code: J20.9, Procedure Code: 99203, Total Charge: $500, Insurance Claim Amount: $350"""},
{"example": """Patient ID: 789012, Patient Name: Johnson Smith, Diagnosis Code: M54.5, Procedure Code: 99213, Total Charge: $150, Insurance Claim Amount: $120"""},
{"example": """Patient ID: 345678, Patient Name: Emily Stone, Diagnosis Code: E11.9, Procedure Code: 99214, Total Charge: $300, Insurance Claim Amount: $250"""},
]
4、编写提示模板
生成器需要明确的指令,我们通过提示模板提供这些指令。
OPENAI_TEMPLATE = PromptTemplate(input_variables=["example"], template="{example}")
现在,我们创建一个更详细的FewShotPromptTemplate:
prompt_template = FewShotPromptTemplate(
prefix=SYNTHETIC_FEW_SHOT_PREFIX,
examples=examples,
suffix=SYNTHETIC_FEW_SHOT_SUFFIX,
input_variables=["subject", "extra"],
example_prompt=OPENAI_TEMPLATE,
)
关键部分:
- prefix 和 suffix: 预定义的LangChain指令(例如,“基于这些示例生成数据”)。
- examples: 我们的示例记录。
- input_variables: 动态输入,如“subject”(例如,“medical_billing”)和“extra”(额外指导)。
- example_prompt: 如何显示每个示例
5、创建数据生成器
有了模式和提示,我们可以设置生成器。
synthetic_data_generator = create_openai_data_generator(
output_schema=MedicalBilling,
llm=ChatOpenAI(temperature=1),
prompt=prompt_template,
)
详细信息:
- output_schema: 确保输出符合我们的MedicalBilling结构。
- llm: 使用OpenAI的聊天模型,温度设置为1(平衡创造力)。
- prompt: 我们编写的模板。
6、生成合成数据
现在开始创建数据!
synthetic_results = synthetic_data_generator.generate(
subject="medical_billing",
extra="the name must be chosen at random. Make it something you wouldn't normally choose.",
runs=10,
)
- 选项:
- subject: 设置上下文(“medical_billing”)。
- extra: 添加一个变化(不寻常的名字)。
- runs: 生成10条记录。
输出:一个MedicalBilling对象列表。
7、可视化生成的数据
让我们检查一下我们创建的内容:
type(synthetic_results) # 应该返回 <class 'list'>
len(synthetic_results) # 应该返回 10
synthetic_results # 显示原始列表

8、转换为Pandas DataFrame
为了更容易处理,将数据转换成表格:
import pandas as pd
synthetic_data = []
for item in synthetic_results:
synthetic_data.append({
'patient_id': item.patient_id,
'patient_name': item.patient_name,
'diagnosis_code': item.diagnosis_code,
'procedure_code': item.procedure_code,
'total_charge': item.total_charge,
'insurance_claim_amount': item.insurance_claim_amount
})
synthetic_df = pd.DataFrame(synthetic_data)
synthetic_df

9、结束语
合成数据生成对于处理敏感信息(如医疗账单记录)来说是一个变革者。使用LangChain,你可以快速创建符合项目需求的真实数据集——同时保持隐私安全。我们希望这个指南能激励你在自己的工作中尝试合成数据!
原文链接:Synthetic Data Generation with Langchain
汇智网翻译整理,转载请标明出处
