pangbai Blog

路在脚下,心向远方

环境配置

安装依赖库

首先需要安装python-dotenv库

python-dotenv 是一个专门用于从 .env 文件加载环境变量到 Python 程序中的库。它可以帮助我们将配置信息从代码中分离出来,以一种更加安全、灵活的方式进行管理。

在实际开发中,我们常常会遇到以下问题:

  • 敏感信息泄露风险:如果将敏感信息直接写入代码,一旦代码被泄露,这些信息也会随之曝光,给系统带来巨大的安全隐患。
  • 环境切换困难:不同的开发环境(开发、测试、生产等)可能需要不同的配置信息。如果配置信息直接写在代码中,每次切换环境都需要手动修改代码,这不仅繁琐,还容易出错。
  • 代码可维护性差:将配置信息与代码混在一起,会使代码结构变得混乱,难以维护和扩展。

而 python-dotenv 的出现,正是为了解决这些问题。通过使用 .env 文件来存储配置信息,并利用 python-dotenv 将这些信息加载到程序中,我们可以轻松地实现配置信息的分离和管理。

安装很简单

pip install openai python-dotenv

配置.env文件

# .env file
LLM_API_KEY="YOUR-API-KEY"
LLM_MODEL_ID="YOUR-MODEL"
LLM_BASE_URL="YOUR-URL"

调用.env文件也很简单,直接使用以下代码

load_dotenv(dotenv_path="config/.env") #参数可以不要,默认路径就是当前python文件的目录

注意,这里的.env文件命名就是".env",在.前面不要加任何其它名字

封装大模型调用类

class LLMs:
    def __init__(self, model : str = None, apiKey : str = None, url : str = None, timeout : int = None):
        #初始化,提供大模型的api_key, name, url
        if(model is None) : self.model = os.getenv("LLM_MODEL_ID")
        if(model is None) : apiKey = os.getenv("LLM_API_KEY")
        if(model is None) : url = os.getenv("LLM_BASE_URL")
        if(model is None) : timeout = int(os.getenv("LLM_TIMEOUT", 1200))

        if self.model == None or apiKey == None or url == None:
            raise ValueError("模型ID、API密钥和服务地址缺少, 可能没有在.env文件中定义, 或者.env文件路径问题")#强制中断
        
        self.client = OpenAI(api_key=apiKey, base_url=url, timeout=timeout) #模型需要支持openai调用,可以查阅模型的api文档,一般会提供可供openai使用的接口

    def think(self, messages : List[Dict[str, str]], temperature : float = 0) -> str:
        print(messages)
        print(f"正在调用{self.model}模型...")

        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                max_tokens=65536,
                temperature=temperature,
                stream=True,
            )

            print("大模型响应成功")
            #流式输出
            response_content = []
            for chunk in response:
                content = chunk.choices[0].delta.content or ""
                print(content, end="", flush=True)
                response_content.append(content)
            print()  # 在流式输出结束后换行
            return "".join(response_content)
        
        except Exception as e:
            print(f"调用LLM API时发生错误: {e}")
            return None