如何使用 Pickle 或 Dill 通过 FastAPI 将 llm_client 对象存储在 Redis 中?

问题描述 投票:0回答:1

我正在开发一个 FastAPI 应用程序,我需要在 Redis 中存储 Azure OpenAI llm_client 对象以及一些会话数据,并设置过期时间。我最初尝试使用 pickle 进行序列化,但遇到了错误。然后我尝试使用 dill,希望它能更好地处理序列化,但遇到了另一个问题。

这是我与

pickle
使用的代码:

import redis
import pickle
from openai import AzureOpenAI

# Initialize Redis client
redis_client = redis.Redis(
    host='redis-13661.c212.ap-south-1-1.ec2.redns.redis-cloud.com',
    port=13661,
    password="*******",
    username="default"
)

# Initialize llm_client
client = AzureOpenAI(
    azure_endpoint="https://my-openai-endpoint.azure.com/",
    api_key="*******",
    api_version="2024-02-01"
)

# Store session data in Redis with an expiration time of 1 hour
session_data = {"llm_client": client}
session_id = "1234"
redis_client.hmset(session_id, 3600, pickle.dumps(session_data))

当我运行此程序时,出现以下错误:

TypeError: cannot pickle '_thread.RLock' object

然后我尝试使用

dill
而不是
pickle
:

import redis
import dill
from openai import AzureOpenAI

# Initialize Redis client
redis_client = redis.Redis(
    host='redis-13661.c212.ap-south-1-1.ec2.redns.redis-cloud.com',
    port=13661,
    password="*******",
    username="default"
)

# Initialize llm_client
client = AzureOpenAI(
    azure_endpoint="https://my-openai-endpoint.azure.com/",
    api_key="*******",
    api_version="2024-02-01"
)

# Store session data in Redis with an expiration time of 1 hour
session_data = {"llm_client": client}
session_id = "1234"
redis_client.hmset(session_id, 3600, dill.dumps(session_data))

但是,这也会失败并出现类似的错误:

TypeError: cannot pickle 'SSLContext' object
我尝试过的事情
  • 使用
    pickle
    :导致
    _thread.RLock
    错误,可能是由于
    llm_client
    中的锁定对象所致。
  • 使用
    dill
    :导致
    SSLContext
    错误,这表明
    dill
    也无法处理
    llm_client
    内的某些对象。

我的问题

  • 有没有办法序列化
    llm_client
    对象存储在Redis中?
  • 是否有其他方法可以处理 Redis 中的不可pickle 对象,例如排除它们并在检索时重建对象?

    任何有关最佳实践的指导或建议将不胜感激。
python redis pickle azure-openai dill
1个回答
0
投票

我的python版本和操作系统是3.10.13,Windows 11

import zhipuai
from multiprocessing import Process

class Test(Process):
    def __init__(self):
        super().__init__()
        self.client = zhipuai.ZhipuAI(api_key="")

    def run(self):
        pass


if __name__ == '__main__':
    p_list = []
    for _ in range(2):
        p = Test()
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()

我尝试初始化客户端发送http请求但失败了:

类型错误:无法腌制“_thread.RLock”对象

但在 Linux 中无需任何修改即可工作

© www.soinside.com 2019 - 2024. All rights reserved.