上一个帖子让大家创建了.env文件,并添加了自己的apikey,接下来我们开始写代码

1.根目录创建 config.py,来存储配置相关

# 导入 Python 内置的 os 模块,用于与操作系统交互(这里主要用来读取环境变量)
import os

# 从第三方库 dotenv 中导入 load_dotenv 函数,用于加载 .env 文件中的配置
from dotenv import load_dotenv

# 执行 load_dotenv() 函数,它会自动寻找项目根目录下的 .env 文件,
# 并将里面的键值对(如 KEY=VALUE)加载为系统的环境变量
load_dotenv()

# 定义一个名为 Config 的类,用于集中管理所有配置项(遵循面向对象的设计模式)
class Config:

    # 定义类属性:从环境变量中获取 DEEPSEEK_API_KEY 的值,
    # 如果环境变量中没有,则默认赋值为空字符串 ""(冒号 : 后面是类型注解,表示期待字符串类型)
    DEEPSEEK_API_KEY: str = os.getenv("DEEPSEEK_API_KEY", "")

    # 定义类属性:DeepSeek API 的基础请求地址(固定值,直接硬编码)
    DEEPSEEK_BASE_URL: str = "https://api.deepseek.com"

    # 定义类属性:指定要调用的大语言模型名称(这里写的是 deepseek-v4-flash,注意:实际最新版名称可能需要核实)
    LLM_MODEL: str = "deepseek-v4-flash"   

    # 装饰器,声明下面的方法为“类方法”,意味着可以通过类名直接调用(Config.validate()),无需创建对象
    @classmethod

    # 定义类方法 validate,用于校验配置是否有效,cls 代表当前类本身(即 Config)
    def validate(cls):

        # 判断 API 密钥是否为空(即 if not cls.DEEPSEEK_API_KEY 等价于 密钥不存在或等于空字符串)
        if not cls.DEEPSEEK_API_KEY:

            # 如果密钥为空,则主动抛出 ValueError(值错误)异常,
            # 并给出中文提示,强制调用者必须在 .env 文件中配置好密钥
            raise ValueError("请在 .env 文件中设置 DEEPSEEK_API_KEY")

细心的朋友已经看到了,这里使用了raise而不是return,对于java转来的朋友说明一下:

  • return 是给函数“正常交作业”用的,返回一个结果,函数就此结束,程序继续往下走。

  • raise 是给函数“举手报错”用的,抛出异常信号,如果没人处理(捕获),程序会当场中断崩溃。

2.根目录创建代码执行文件 main.py

# 从 langchain_openai 库中导入 ChatOpenAI 类,用于调用兼容 OpenAI API 格式的大模型(DeepSeek 支持此格式)
from langchain_openai import ChatOpenAI

# 从当前目录下的 config.py 文件中导入 Config 类(即你之前定义的那个配置管理类)
from config import Config

# ----------------------------------------------------------------------
# 验证配置:调用 Config 类的类方法 validate(),检查 DEEPSEEK_API_KEY 是否已设置
# 如果未设置,程序会抛出 ValueError 异常并终止,避免后续无意义的请求
# ----------------------------------------------------------------------
Config.validate()

# 初始化 DeepSeek 大模型实例
# ChatOpenAI 是 LangChain 提供的通用类,只要 API 接口兼容 OpenAI,就可以用它来调用
# 这里传入了四个参数:
#   - model: 使用的模型名称(从 Config 中读取)
#   - api_key: API 密钥(从 Config 中读取)
#   - base_url: API 的基础请求地址(从 Config 中读取)
#   - temperature: 控制回答的随机性,0.7 表示有一定随机性,但不会太发散
llm = ChatOpenAI(
    model=Config.LLM_MODEL,
    api_key=Config.DEEPSEEK_API_KEY,
    base_url=Config.DEEPSEEK_BASE_URL,
    temperature=0.7
)

# 打印分隔线和欢迎信息,让界面更清晰
print("=" * 40)
print("DocMind 智能体已启动(无记忆模式)")
print("输入 'exit' 退出")
print("=" * 40)

# 进入无限循环,持续接收用户输入并给出回答
while True:
    # 提示用户输入,并在前面显示 "你: "
    user_input = input("\n你: ")
    
    # 如果用户输入的小写形式是 "exit",则跳出循环,结束程序
    if user_input.lower() == "exit":
        break
    
    # 如果用户输入的是空字符串或只包含空格,则跳过本次循环,不调用模型(避免浪费)
    if not user_input.strip():
        continue

    # 调用大模型(invoke 方法)发送当前用户输入,并获取返回的响应对象
    # 注意:这里每次都是独立请求,没有把历史对话传进去,所以模型不记得之前聊过什么(即“无记忆模式”)
    response = llm.invoke(user_input)
    
    # 从响应对象中提取文本内容,并打印出来,前面带上 "AI: "
    print(f"AI: {response.content}")

细心的朋友已经看到了,我们使用的openai模式,因为openai是先驱,所有后续的llm都遵循了openai的接口标准

写完这两个py文件之后此时我们的项目目录是这样的:

我们执行main文件,就可以和大模型打招呼了

此时我们最基础的和大模型聊天的项目就已经搞定了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐