当前位置: 首页 > news >正文

intructor库实现可迭代对象输出

目录

    • 代码
    • 代码解释
      • 1. 导入和初始化
      • 2. 数据模型定义
      • 3. 流式提取函数
      • 4. 消息设置
      • 5. 测试代码
      • 输出结果
    • 类似例子

代码

import time

from collections.abc import Iterable
from openai import OpenAI
from pydantic import BaseModel

import instructor


client = instructor.from_openai(OpenAI(api_key = "your api key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"))


class User(BaseModel):
    name: str
    job: str
    age: int


def stream_extract(input: str) -> Iterable[User]:
    return client.chat.completions.create_iterable(
        model="qwen-turbo",
        temperature=0.1,
        stream=True,
        response_model=User,
        messages=[
            {
                "role": "system",
                "content": "You are a perfect entity extraction system",
            },
            {
                "role": "user",
                "content": (
                    f"Consider the data below:\n{input}"
                    "Correctly segment it into entitites"
                    "Make sure the JSON is correct"
                ),
            },
        ],
        max_tokens=1000,
    )


start = time.time()
for user in stream_extract(
    input="Create 5 characters from the book Three Body Problem"
):
    delay = round(time.time() - start, 1)
    print(f"{delay} s: User({user})")
0.9 s: User(name='Ye Wenjie' job='Astronomer' age=30)
1.3 s: User(name='Wang Miao' job='Nanomaterials Researcher' age=45)
1.5 s: User(name='Chang Jie' job='Historian' age=50)
1.9 s: User(name='Da Shi' job='Military Officer' age=40)
2.3 s: User(name='Roberto da Silva' job='Brazilian Astronomer' age=60)

代码解释

1. 导入和初始化

import time
from collections.abc import Iterable
from openai import OpenAI
from pydantic import BaseModel
import instructor

client = instructor.from_openai(OpenAI(...))
  • 导入必要的库,包括用于流式处理的 Iterable
  • 使用 instructor 增强的 OpenAI 客户端

2. 数据模型定义

class User(BaseModel):
    name: str
    job: str
    age: int

定义了用户数据模型,包含:

  • 姓名
  • 职业
  • 年龄

3. 流式提取函数

def stream_extract(input: str) -> Iterable[User]:

这是核心函数,特点:

  • 返回一个可迭代的 User 对象流
  • 使用 create_iterable 方法实现流式响应
  • 参数设置:
    • temperature=0.1: 保持输出稳定性
    • stream=True: 启用流式输出
    • response_model=User: 指定响应格式

4. 消息设置

messages=[
    {"role": "system", "content": "You are a perfect entity extraction system"},
    {"role": "user", "content": ...}
]
  • 系统提示:定义 AI 角色
  • 用户提示:包含输入数据和任务说明

5. 测试代码

start = time.time()
for user in stream_extract(input="Create 5 characters from the book Three Body Problem"):
    delay = round(time.time() - start, 1)
    print(f"{delay} s: User({user})")
  • 记录开始时间
  • 流式获取并打印结果
  • 显示每个结果的延迟时间

输出结果

从输出可以看到:

  • 每个角色信息都是独立流式返回的
  • 整个过程约耗时 2.3 秒
  • 返回了 5 个《三体》中的角色信息
  • 每个角色信息包含姓名、职业和年龄

这种流式处理方式的优势:

  1. 实时响应:不用等待所有结果
  2. 资源效率:内存占用更小
  3. 用户体验:可以看到渐进式的结果

类似例子

import time
from collections.abc import Iterable
from openai import OpenAI
from pydantic import BaseModel
import instructor

client = instructor.from_openai(OpenAI(api_key = "your api key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"))

class Movie(BaseModel):
    title: str
    director: str
    year: int
    genre: str

def stream_movies(input: str) -> Iterable[Movie]:
    return client.chat.completions.create_iterable(
        model="qwen-turbo",
        temperature=0.1,
        stream=True,
        response_model=Movie,
        messages=[
            {
                "role": "system",
                "content": "你是一个专业的电影信息提取系统",
            },
            {
                "role": "user",
                "content": (
                    f"从以下内容中提取电影信息:\n{input}"
                    "确保提取的信息准确完整"
                    "返回正确的JSON格式"
                ),
            },
        ],
        max_tokens=1000,
    )

# 测试代码
start = time.time()
for movie in stream_movies(
    input="列出5部经典科幻电影"
):
    delay = round(time.time() - start, 1)
    print(f"{delay} s: Movie({movie})")
1.0 s: Movie(title='Blade Runner' director='Ridley Scott' year=1982 genre='Science Fiction')
1.6 s: Movie(title='The Matrix' director='Lana Wachowski and Lilly Wachowski' year=1999 genre='Science Fiction')
2.2 s: Movie(title='2001: A Space Odyssey' director='Stanley Kubrick' year=1968 genre='Science Fiction')
2.7 s: Movie(title='Solaris' director='Andrei Tarkovsky' year=1972 genre='Science Fiction')
3.3 s: Movie(title='Gattaca' director='Andrew Niccol' year=1997 genre='Science Fiction')

参考链接:https://github.com/instructor-ai/instructor/tree/main

相关文章:

  • LangChain高阶技巧:动态配置Runnable组件的原理剖析与实战应用
  • Spring AI高级RAG功能查询重写和查询翻译
  • 掌趣科技前端面试题及参考答案
  • 用AI改写生意底层逻辑 深圳天天送为线下万店赋能“数字飞轮”
  • 2025年常见渗透测试面试题- 常见中间件(题目+回答)
  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-专栏管理部分
  • 代码随想录算法训练营Day27
  • vulkanscenegraph显示倾斜模型(5.9)-vsg中vulkan资源的编译
  • 多模态大语言模型arxiv论文略读(十三)
  • 【使用jenkins+docker自动化部署java项目】
  • MacOs下解决远程终端内容复制并到本地粘贴板
  • Web渗透之文件包含漏洞
  • 分层对象模型:PO、DTO、VO、BO定义区别与使用场景
  • win10中快速访问部分外网的快捷设置方法
  • 【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测
  • MySQL中的隐式转换和显式转换
  • 2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)
  • java学习总结(if switch for)
  • Go:方法
  • 【Java】查看当前 Java 使用的垃圾回收器
  • 黄仕忠丨戏曲文献研究之回顾与展望
  • 大外交|巴西总统卢拉第六次访华签署20项协议,“双方都视对方为机遇”
  • 第十届影像上海博览会落幕后,留给中国摄影收藏的三个问题
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准
  • 盖茨说对中国技术封锁起到反作用
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,市场有望迎来新增量需求