第一个LLM Demo 安装python环境 安装了openai库 pip install openai 调通了DeepSeek API
from openai import OpenAI
client = OpenAI( api_key="your-api-key-here", # 替换成你的 Key base_url="api.deepseek.com" )
response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一个helpful的AI助手"}, {"role": "user", "content": "用一句话解释什么是AI Agent"} ] )
print(response.choices[0].message.content)
拿到了真实的AI回复
真正的agent需要记住上下文,下面把代码改成支持连续对话的版本 然后接下来试一下多轮对话
接下来修改代码 from openai import OpenAI
client = OpenAI( api_key="your-api-key-here", base_url="api.deepseek.com" )
messages = [ {"role": "system", "content": "你是一个helpful的AI助手"} ]
print("开始对话,输入 exit 退出\n")
while True: user_input = input("你:") if user_input == "exit": break
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
reply = response.choices[0].message.content
messages.append({"role": "assistant", "content": reply})
print(f"AI:{reply}\n")
运行之后就可以进行连续对话了,先试着问几个问题,然后问一个需要记住前面内容的问题比如
模型没有真正的记忆,模型每次都是失忆的,得把所有历史一起发给它,他才能记住
之后会遇到的现象: 包括对话太长会报错→因为message列表超过了模型的上下文窗口限制 API越用越贵→因为每轮都要把越来越长的历史重新发送 RAG和Agent的“记忆模块”本质上都是再想办法精简这个列表,只保留最相关的内容
安装LangChain
在D盘创建虚拟环境运行
第一个LangChain代码 from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate
初始化模型
llm = ChatOpenAI( api_key="your-api-key-here", # 替换成你的 DeepSeek Key base_url="api.deepseek.com", model="deepseek-chat" )
创建 Prompt Template
prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个{role},请用简洁的语言回答问题。"), ("user", "{question}") ])
组合成 Chain
chain = prompt | llm
调用
result = chain.invoke({ "role": "Python编程导师", "question": "什么是LangChain?" })
print(result.content)
Prompt Template就是带变量的提示词模板,代码里面的role和question是占位符,调用时再填入具体的值,好处是同一个模板可以复用,换个role就变成了不同的AI角色。
chain = prompt | llm 这是管道操作符,意思是把prompt的输出直接传给LLm。这是LangChain最核心的设计————把各种组件像积木一样串联起来,后面可能会串的很长:prompt|llm|parser|tool
那么问题来了,设置role有什么用呢,role本质上是在告诉AI“你现在扮演什么身份”,不同的身份会让AI回答风格完全不同。
比如可以把role的值换成严厉的代码审查员或者幼儿园老师或者毒舌的程序员。
这在实际开发中还是非常有用的————比如做一个客服AI,白天role是“专业客服”,节假日role是“轻松友好的助手”,切换时只需修改一个字符串。
接下来学习工具调用Tool Calling
from langchain_openai import ChatOpenAI from langchain_core.tools import tool from langchain_core.messages import HumanMessage
── 1. 定义工具 ──────────────────────────────────────────────
@tool def calculate(expression: str) -> str: """计算一个数学表达式,例如 '2 + 3 * 4'""" try: return str(eval(expression)) except Exception as e: return f"计算出错:{e}"
@tool def get_current_time() -> str: """获取当前的日期和时间""" from datetime import datetime return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
tools = [calculate, get_current_time]
── 2. 初始化模型并绑定工具 ───────────────────────────────────
llm = ChatOpenAI( api_key="your-api-key-here", # 替换成你的 DeepSeek Key base_url="api.deepseek.com", model="deepseek-chat" ) llm_with_tools = llm.bind_tools(tools)
── 3. 手动执行工具调用循环 ───────────────────────────────────
def run_agent(user_input: str): print(f"\n用户:{user_input}") messages = [HumanMessage(content=user_input)]
while True:
response = llm_with_tools.invoke(messages)
messages.append(response)
# 如果没有工具调用,直接输出结果
if not response.tool_calls:
print(f"AI:{response.content}")
break
# 有工具调用,执行工具
for tool_call in response.tool_calls:
tool_name = tool_call["name"]
tool_args = tool_call["args"]
print(f" → 调用工具:{tool_name},参数:{tool_args}")
# 找到对应工具并执行
tool_func = next(t for t in tools if t.name == tool_name)
tool_result = tool_func.invoke(tool_args)
print(f" ← 工具返回:{tool_result}")
# 把工具结果加入消息列表
from langchain_core.messages import ToolMessage
messages.append(ToolMessage(
content=str(tool_result),
tool_call_id=tool_call["id"]
))
── 4. 测试 ───────────────────────────────────────────────────
run_agent("帮我算一下 123 * 456 + 789 等于多少") run_agent("现在几点了?")
| 普通聊天机器人和agent的区别 | |
|---|---|
| 普通聊天 | Agent |
| 只会“说”答案 | 会“做”操作 |
| 时间/计算靠猜 | 调用真实工具获取 |
| 无法影响外部世界 | 可以查数据库、发邮件、写文件.... |
根本原因是LLM本质上只是一个“文字预测器” 模型训练完之后,知识就冻结了。它不能主动的去看外部世界,只能根据训练数据里学到的内容来回答。
比如拿“现在几点了”举例: 普通聊天机器人收到这个问题,它能做的只有:
训练数据里有很多“现在几点”相关的文字
→预测出一个听起来很合理的回答
→但那个时间是假的或者直接说我不知道
但是Agent收到同一个问题:
→AI判断:这需要实时数据,我有get_current_time工具
→调用工具,真正执行了datetime.now()
→拿到真实事件2026-04-15 20:11:43
→在组织成自然语言回答
计算也一样: 问“123*456+789“,普通模型会直接在脑子里算”“————但是LLM不是计算器,它是在预测”这道题的答案看起来应该是什么数字,复杂一点就容易算错。
你的Agent是把算式交给python的eval()真正执行,结果100%准确。
一句话总结:
LLM只有语言能力,没有感知外部世界的能力,工具调用就是给它装上眼睛和手。 Agent=LLM+Tools是现在最主流的架构,单纯的聊天模型能做的事情太有限了