如何修复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
相关产品推荐
相关产品推荐

