从十年 Java 到智能体开发:我的全套 Python 智能体实战课程(第二帖)3-第一个简单的agent
·
上一个帖子让大家创建了.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文件,就可以和大模型打招呼了

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




所有评论(0)