学习ai智能体

0 阅读5分钟

第一个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回复

image.png

真正的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")

运行之后就可以进行连续对话了,先试着问几个问题,然后问一个需要记住前面内容的问题比如

image.png

image.png 模型没有真正的记忆,模型每次都是失忆的,得把所有历史一起发给它,他才能记住

之后会遇到的现象: 包括对话太长会报错→因为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

image.png 那么问题来了,设置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是现在最主流的架构,单纯的聊天模型能做的事情太有限了