You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Azure Databricks中OpenAI嵌入的异步调用问题?

问题描述

我正尝试用OpenAI的Python包获取文本分类所需的嵌入,同步版本能正常运行:

import openai
from openai.embeddings_utils import get_embedding

def add_embeddings(data:pd.DataFrame) -> pd.DataFrame:
  data["embedding"] = data['target_column'].apply(lambda x: get_embedding(x, engine="text-embedding-ada-002"))

  return data

但为了提升长期效率,想改用异步方法,当前的异步版本如下:

import asyncio
import openai
from openai.embeddings_utils import aget_embedding

async def add_embeddings(data: pd.DataFrame) -> pd.DataFrame:
  data["embedding"] = await asyncio.gather(*(aget_embedding(x, engine="text-embedding-ada-002") for x in data['target_column']))

  return data

运行data = add_embeddings(data)时,异步版本返回的是协程对象,不是预期的文本嵌入。我异步开发经验不多,应该是漏了某个简单步骤。我在Azure Databricks环境中操作,已经参考过几个Stack Overflow的回答。

解决方案

核心问题是异步函数不能直接调用,必须通过事件循环来执行,以下是具体修复方法:

基础修复方案

调用异步函数时,使用asyncio.run()启动事件循环:

data = asyncio.run(add_embeddings(data))

Databricks环境适配方案

如果在Databricks笔记本中遇到事件循环冲突,可改用现有事件循环执行:

loop = asyncio.get_running_loop()
data = loop.run_until_complete(add_embeddings(data))

批量请求优化(可选)

如果数据量较大,建议分批次并发请求,避免触发OpenAI的频率限制:

async def add_embeddings(data: pd.DataFrame, batch_size: int = 10) -> pd.DataFrame:
    embeddings = []
    # 分批次处理数据
    for i in range(0, len(data), batch_size):
        batch = data['target_column'].iloc[i:i+batch_size]
        batch_embeddings = await asyncio.gather(*(aget_embedding(x, engine="text-embedding-ada-002") for x in batch))
        embeddings.extend(batch_embeddings)
    data["embedding"] = embeddings
    return data

内容的提问来源于stack exchange,提问作者FitzKaos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:17:18