Instructor实时通讯:对话内容的结构化分析与摘要生成

Instructor实时通讯:对话内容的结构化分析与摘要生成

【免费下载链接】instructor structured outputs for llms 【免费下载链接】instructor 项目地址: https://gitcode.com/GitHub_Trending/in/instructor

痛点直击:当AI遇上复杂对话内容

你是否还在为以下问题困扰?团队会议纪要散落各处难以整合、客户对话中的关键信息需要人工筛选、实时交流中的行动项无法自动追踪?传统的文本处理方式不仅耗时耗力,还常常因为人为疏忽导致重要信息遗漏。本文将展示如何利用Instructor(结构化输出工具包)实现对话内容的实时结构化分析与摘要生成,让AI真正理解交流内容并转化为可操作的数据。

读完本文你将获得:

  • 对话内容实体提取的完整技术方案
  • 实时流式处理交流的实现方法
  • 多维度摘要生成的工程实践
  • 生产级别的错误处理与优化策略

技术架构:Instructor如何重塑对话分析流程

核心原理概览

Instructor基于Pydantic构建,通过类型注解定义结构化输出模型,让大语言模型(LLM)直接生成符合格式要求的JSON数据。这种方式省去了传统JSON解析和错误处理的繁琐步骤,同时提供了类型安全和IDE支持。

mermaid

与传统方法的对比优势

特性传统JSON解析Instructor结构化输出
开发效率需要手动编写解析逻辑声明式模型定义,自动解析
错误处理需手动处理格式错误内置Pydantic验证,自动重试
类型安全动态类型,运行时发现错误静态类型检查,开发时验证
复杂结构支持嵌套结构处理困难原生支持嵌套Pydantic模型
流式处理需自行实现部分结果处理内置Partial模型支持流式更新

快速开始:环境搭建与基础实现

安装与配置

# 使用pip安装
pip install instructor

# 或使用uv(推荐,速度更快)
uv add instructor

基础配置:

import instructor
from pydantic import BaseModel
from openai import OpenAI

# 初始化客户端
client = instructor.from_provider(
    "openai/gpt-4o-mini",
    api_key="your-api-key"  # 实际使用时建议通过环境变量传入
)

第一个对话内容分析示例

假设我们有以下对话内容需要分析:

用户: 嗨,我是李明,想咨询一下你们的企业版套餐价格。
客服: 您好李明,企业版套餐分为基础、高级和旗舰三个版本,价格分别是999元/月、1999元/月和3999元/月。
用户: 基础版包含哪些功能?
客服: 基础版包含100GB存储、最多50用户账号和标准支持服务。需要我发一份详细的功能对比表到您邮箱吗?
用户: 好的,我的邮箱是liming@example.com,另外想问下高级版是否支持API集成?
客服: 是的,高级版和旗舰版都支持API集成,基础版不包含此功能。我已发送邮件,请查收。
用户: 谢谢,我会和团队讨论后回复你。

定义结构化模型:

from typing import List, Optional
from pydantic import Field

class Message(BaseModel):
    sender: str
    content: str
    timestamp: Optional[str] = Field(default=None)

class UserInfo(BaseModel):
    name: str
    contact_info: Optional[str] = Field(default=None)
    inquiry_type: str = Field(description="用户咨询的类型,如价格、功能、技术支持等")

class ProductInfo(BaseModel):
    name: str
    price: Optional[str] = Field(default=None)
    features: List[str] = Field(default_factory=list)

class ChatAnalysis(BaseModel):
    messages: List[Message]
    user_info: UserInfo
    products_discussed: List[ProductInfo]
    action_items: List[str] = Field(default_factory=list)
    summary: str = Field(description="对话内容的简短摘要")

执行分析:

chat_history = [
    {"role": "user", "content": "嗨,我是李明,想咨询一下你们的企业版套餐价格。"},
    {"role": "assistant", "content": "您好李明,企业版套餐分为基础、高级和旗舰三个版本,价格分别是999元/月、1999元/月和3999元/月。"},
    # ... 其他消息
]

analysis = client.chat.completions.create(
    response_model=ChatAnalysis,
    messages=[
        {"role": "system", "content": "你是一个对话内容分析专家,需要提取用户信息、产品讨论内容、行动项并生成摘要。"},
        {"role": "user", "content": f"分析以下对话内容: {chat_history}"}
    ]
)

print(analysis.summary)
print("用户咨询产品:", [p.name for p in analysis.products_discussed])
print("行动项:", analysis.action_items)

核心功能实现:从实时流到结构化数据

实时流式对话处理

Instructor提供Partial模型支持,可实时处理流式对话并逐步构建结构化结果:

from instructor import Partial

# 定义增量更新的模型
class IncrementalChatAnalysis(ChatAnalysis):
    """支持增量更新的对话内容分析模型"""
    
# 模拟实时交流流
def chat_stream():
    messages = [
        "嗨,我是李明,想咨询一下你们的企业版套餐价格。",
        "您好李明,企业版套餐分为基础、高级和旗舰三个版本,价格分别是999元/月、1999元/月和3999元/月。",
        "基础版包含哪些功能?",
        "基础版包含100GB存储、最多50用户账号和标准支持服务。需要我发一份详细的功能对比表到您邮箱吗?",
        "好的,我的邮箱是liming@example.com,另外想问下高级版是否支持API集成?",
        "是的,高级版和旗舰版都支持API集成,基础版不包含此功能。我已发送邮件,请查收。",
        "谢谢,我会和团队讨论后回复你。"
    ]
    
    for msg in messages:
        yield {"role": "user" if messages.index(msg) % 2 == 0 else "assistant", "content": msg}
        time.sleep(2)  # 模拟交流间隔

# 处理流式对话
current_state = IncrementalChatAnalysis(messages=[], user_info=UserInfo(name="", inquiry_type=""), products_discussed=[])

for chunk in client.chat.completions.create(
    response_model=Partial[IncrementalChatAnalysis],
    messages=[{"role": "system", "content": "实时分析对话,增量更新结构化数据"}],
    stream=True
):
    if chunk:
        # 更新当前状态
        for field in chunk.model_fields_set:
            if field == "messages" and chunk.messages:
                current_state.messages.extend(chunk.messages)
            elif field == "products_discussed" and chunk.products_discussed:
                current_state.products_discussed = chunk.products_discussed
            elif field == "user_info" and chunk.user_info:
                current_state.user_info = chunk.user_info
            elif field == "action_items" and chunk.action_items:
                current_state.action_items = chunk.action_items
            elif field == "summary" and chunk.summary:
                current_state.summary = chunk.summary
        
        # 实时展示结果
        print("\n当前分析结果:")
        print(f"用户: {current_state.user_info.name} ({current_state.user_info.inquiry_type})")
        print(f"讨论产品: {[p.name for p in current_state.products_discussed]}")
        print(f"行动项: {current_state.action_items}")
        print(f"摘要: {current_state.summary[:100]}...")

多维度实体提取与分类

利用Instructor的验证器功能,可以实现更精准的实体提取和分类:

from pydantic import field_validator

class EnhancedProductInfo(ProductInfo):
    price: Optional[str] = Field(default=None)
    features: List[str] = Field(default_factory=list)
    price_tier: Optional[str] = Field(default=None, description="价格层级:入门、中级、高级、企业级")
    
    @field_validator('price_tier', mode='before')
    def determine_price_tier(cls, v, values):
        if v:
            return v
            
        price = values.get('price')
        if not price:
            return None
            
        # 从价格中提取数字
        import re
        price_num = float(re.sub(r'[^\d.]', '', price))
        
        if price_num < 1000:
            return "入门"
        elif price_num < 2000:
            return "中级"
        elif price_num < 5000:
            return "高级"
        else:
            return "企业级"

# 增强的对话分析模型
class EnhancedChatAnalysis(ChatAnalysis):
    products_discussed: List[EnhancedProductInfo] = Field(default_factory=list)
    sentiment: Optional[str] = Field(default=None, description="对话整体情感:积极、中性、消极")
    key_topics: List[str] = Field(default_factory=list, description="讨论的关键主题")
    
    @field_validator('sentiment', mode='before')
    def analyze_sentiment(cls, v, values):
        if v:
            return v
            
        # 简单情感分析实现
        messages = values.get('messages', [])
        if not messages:
            return None
            
        content = " ".join([msg.content for msg in messages])
        positive_words = ["好", "谢谢", "棒", "满意", "支持", "喜欢"]
        negative_words = ["不", "没有", "糟糕", "不满意", "问题", "麻烦"]
        
        pos_count = sum(1 for word in positive_words if word in content)
        neg_count = sum(1 for word in negative_words if word in content)
        
        if pos_count > neg_count:
            return "积极"
        elif neg_count > pos_count:
            return "消极"
        else:
            return "中性"

智能摘要生成系统

结合Chain-of-Density技术,生成信息密度逐步提升的摘要:

from instructor import Mode

class SummaryStep(BaseModel):
    summary: str = Field(description="当前步骤的摘要文本")
    added_entities: List[str] = Field(description="本步骤新增的实体")
    removed_entities: List[str] = Field(description="本步骤移除的实体", default_factory=list)

class MultiStepSummary(BaseModel):
    steps: List[SummaryStep] = Field(description="逐步优化的摘要步骤")
    final_summary: str = Field(description="最终优化后的摘要")

def generate_dense_summary(conversation: str, steps: int = 3) -> MultiStepSummary:
    """生成信息密度逐步提升的摘要"""
    client = instructor.from_provider("openai/gpt-4o-mini", mode=Mode.TOOLS)
    
    # 初始摘要
    initial_summary: SummaryStep = client.chat.completions.create(
        response_model=SummaryStep,
        messages=[
            {"role": "system", "content": "你是一个摘要生成专家。生成一个初始摘要,包含对话的基本信息,但不要太详细。"},
            {"role": "user", "content": f"对话内容: {conversation}\n生成初始摘要,并列出摘要中包含的实体。"}
        ]
    )
    
    summary_steps = [initial_summary]
    
    # 逐步优化摘要
    for i in range(steps - 1):
        prev_summary = summary_steps[-1]
        improved_summary: SummaryStep = client.chat.completions.create(
            response_model=SummaryStep,
            messages=[
                {"role": "system", "content": """优化摘要,提高信息密度:
1. 保留所有关键实体和信息
2. 移除冗余表达和填充词
3. 保持摘要长度基本不变
4. 添加前一摘要中遗漏的重要实体
5. 确保摘要流畅易读"""},
                {"role": "user", "content": f"上一步摘要: {prev_summary.summary}\n上一步实体: {prev_summary.added_entities}\n对话内容: {conversation}\n生成优化后的摘要,并明确指出新增和移除的实体。"}
            ]
        )
        summary_steps.append(improved_summary)
    
    return MultiStepSummary(
        steps=summary_steps,
        final_summary=summary_steps[-1].summary
    )

# 使用示例
conversation_text = "\n".join([f"{m['role']}: {m['content']}" for m in chat_history])
dense_summary = generate_dense_summary(conversation_text)

print("逐步优化的摘要:")
for i, step in enumerate(dense_summary.steps):
    print(f"\n步骤 {i+1}:")
    print(f"摘要: {step.summary}")
    print(f"新增实体: {step.added_entities}")
    print(f"移除实体: {step.removed_entities}")

print("\n最终摘要:")
print(dense_summary.final_summary)

生产级优化:错误处理与性能提升

自动重试与错误恢复

Instructor内置了自动重试机制,可处理LLM输出不符合模型定义的情况:

# 带自动重试的分析函数
def analyze_chat_with_retry(chat_history, max_retries=3):
    try:
        return client.chat.completions.create(
            response_model=EnhancedChatAnalysis,
            messages=[
                {"role": "system", "content": "分析对话内容并提取结构化信息。"},
                {"role": "user", "content": f"对话内容: {chat_history}"}
            ],
            max_retries=max_retries  # 自动重试次数
        )
    except Exception as e:
        print(f"分析失败: {str(e)}")
        
        #  fallback策略:返回部分结果
        if hasattr(e, 'response') and e.response:
            try:
                # 尝试解析部分结果
                partial_result = EnhancedChatAnalysis.model_validate_json(e.response.text)
                print("返回部分结果")
                return partial_result
            except:
                pass
        
        # 返回空结果
        return EnhancedChatAnalysis(
            messages=[],
            user_info=UserInfo(name="", inquiry_type=""),
            products_discussed=[],
            summary="分析失败: " + str(e)
        )

缓存策略与性能优化

对于重复的对话分析任务,可以使用缓存提高性能:

import hashlib
from functools import lru_cache

def chat_cache_key(chat_history):
    """生成对话内容的唯一缓存键"""
    chat_str = str(chat_history)
    return hashlib.md5(chat_str.encode()).hexdigest()

# 使用LRU缓存
@lru_cache(maxsize=1000)
def cached_chat_analysis(cache_key):
    """带缓存的对话分析函数"""
    # 实际应用中,这里应该从缓存存储中获取数据
    # 简化实现,实际应使用Redis等分布式缓存
    return None

def analyze_chat_with_caching(chat_history):
    # 生成缓存键
    key = chat_cache_key(chat_history)
    
    # 尝试从缓存获取
    cached_result = cached_chat_analysis(key)
    if cached_result:
        print("使用缓存结果")
        return cached_result
    
    # 缓存未命中,执行分析
    result = analyze_chat_with_retry(chat_history)
    
    # 存入缓存(实际应用中应使用持久化缓存)
    # 这里仅为演示,实际实现需要修改cached_chat_analysis函数
    # cached_chat_analysis.cache[key] = result
    
    return result

完整案例:客服对话智能分析系统

下面是一个完整的客服对话分析系统实现,整合了上述所有功能:

class CustomerServiceAnalysis(EnhancedChatAnalysis):
    """客服对话分析专用模型"""
    customer_intent: Optional[str] = Field(default=None, description="客户意图分类")
    resolution_status: str = Field(default="pending", description="问题解决状态:pending, resolved, escalated")
    sentiment_trend: List[str] = Field(default_factory=list, description="情感变化趋势")
    support_agent_rating: Optional[float] = Field(default=None, description="客服评分1-5分")

def analyze_customer_service_conversation(conversation: List[dict]) -> CustomerServiceAnalysis:
    """分析客服对话并提取结构化信息"""
    # 转换为文本格式
    conversation_text = "\n".join([f"{msg['role']}: {msg['content']}" for msg in conversation])
    
    # 创建分析客户端
    client = instructor.from_provider(
        "openai/gpt-4o-mini",
        mode=Mode.TOOLS
    )
    
    try:
        # 执行分析
        result = client.chat.completions.create(
            response_model=CustomerServiceAnalysis,
            messages=[
                {"role": "system", "content": """你是一个客服对话分析专家。请分析以下客服对话,提取:
1. 客户信息(姓名、联系方式等)
2. 讨论的产品/服务
3. 客户意图和问题
4. 对话情感分析
5. 问题解决状态
6. 行动项
7. 对话摘要
8. 客服评分建议"""},
                {"role": "user", "content": f"客服对话: {conversation_text}"}
            ],
            max_retries=3
        )
        
        return result
        
    except Exception as e:
        print(f"分析失败: {str(e)}")
        return CustomerServiceAnalysis(
            messages=[],
            user_info=UserInfo(name="", inquiry_type=""),
            products_discussed=[],
            summary=f"分析失败: {str(e)}"
        )

# 运行示例
if __name__ == "__main__":
    # 客服对话示例
    support_conversation = [
        {"role": "customer", "content": "您好,我无法登录我的账户。"},
        {"role": "agent", "content": "您好!请问您遇到什么问题了?"},
        {"role": "customer", "content": "我输入密码后,系统提示'账户不存在',但我上周还能登录。我叫王小明,邮箱是wangxm@example.com。"},
        {"role": "agent

【免费下载链接】instructor structured outputs for llms 【免费下载链接】instructor 项目地址: https://gitcode.com/GitHub_Trending/in/instructor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值