Langgraph从新手到老师傅-1-入门篇

前言

嘿,朋友们!在这个科技飞速发展的时代,人工智能已经不再是科幻电影里的玩意儿,而是实实在在地走进了我们的生活。今天,我就要带大家来一场说干就干的实践之旅------用阿里云的千问大模型和langgraph框架,快速搭建一个能查询天气的小助手。别小看这个小项目,它可是大语言模型应用的入门课,适合初学者,也适合那些想在项目里快速用上大模型的"老司机"。接下来,就让我们一起开启这段有趣的旅程吧!

准备环境

创建一个虚拟环境并安装依赖

bash 复制代码
python -m venv .venv
.venv\Scripts\activate
pip install langgraph
pip install python-dotenv
pip install langchain_openai 

.env文件

bash 复制代码
BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
OPENAI_API_KEY="xxx"

快速启动示例

python 复制代码
from dotenv import load_dotenv

load_dotenv()

# 使用阿里云的model
# BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
import os
from langchain_openai import ChatOpenAI

aliyun_model = "qwen-max"
model = ChatOpenAI(
    base_url=os.getenv("BASE_URL"),
    api_key=os.getenv("OPENAI_API_KEY"),
    model=aliyun_model,
)

import random

# 定义工具
def get_weather(city: str) -> str:
    """获取指定城市的天气情况"""
    weather = random.choice(["晴天", "阴天", "雨天", "多云", "小雨"])
    temputure = random.randint(15, 35)
    # 使用随机的方式模拟天气,也可以使用外部api
    return f"{city}的天气: {weather},{temputure}摄氏度"

# 使用langgraph
# 创建agent
from langgraph.prebuilt import create_react_agent

prompt = "你是一个生活小助手"
tools = [get_weather]
agent = create_react_agent(model=model, prompt=prompt, tools=tools)

# 调用agent
messages = {"messages": [{"role": "user", "content": "上海天气怎么样"}]}
ai_reponse = agent.invoke(messages)["messages"][-1]
print(ai_reponse.content)  # 上海今天的天气是晴天,温度是33摄氏度

示例详解

环境变量加载

使用load_dotenv函数,加载.env中定义的值到当前运行时的环境中,可通过os.getenv获取相应的值

python 复制代码
from dotenv import load_dotenv

load_dotenv()

使用阿里云的千问作为大模型

由于一些原因,我们使用千问作为我们的大模型,也可以使用deepseek、Glm或者kimi等支持openAi兼容接口的大模型。只需要在.env文件中设置BASE_URL和OPENAI_API_KEY即可,我们此处使用的是千问的plus版本,一般适用性还不错,也可以使用qwen-turbo、qwen-max等模型。

大模型的调用使用的是langchain_openai中的ChatOpenAI,这个类封装了openAi的接口,我们只需要传入base_url、api_key和model等参数就能直接调用背后的大模型了,不用自己封装接口。

ChatOpenAI除了下面的base_url、api_key和model,还有很多的参数可以配置,可以打开ChatOpenAI的声明查看,下面列举一些常用的参数配置

  • base_url api地址
  • api_key 不用解释
  • model 模型名称
  • top_p 核采样,token采样概率,由于大模型会输出一组带概率权重的token,top_p表示累积概率,把概率权重从大到小递减排序,然后累加直到大于top_p,那么被累加进入的token,就是模型将要输出token的集合,这些概率权重会做归一化处理后,然后随机取一个token作为模型输出。相对的有一种更简单和容易理解的top_k的采样方法,就是从前k名中随机取,top_k采取的是固定窗口采样,top_p的窗口是动态的。
  • temperature 温度,用于控制模型输出的随机性,取值 0 - 1.0,值越小,随机性越低,值越大,随机性越高,输出内容越有创意(并非褒义
  • max_tokens 最大输出token数量,防止模型无限输出,控制最多输出的token数量
python 复制代码
# 使用阿里云的model
# BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
import os
from langchain_openai import ChatOpenAI

aliyun_model = "qwen-max"
model = ChatOpenAI(
    base_url=os.getenv("BASE_URL"),
    api_key=os.getenv("OPENAI_API_KEY"),
    model=aliyun_model,
)

定义工具

工具是给大模型来调用的函数,也是普通的python函数,get_weather用来获取一个城市的天气情况,真实情况应该是使用外部的api接口,我们简化了下直接随机天气和温度情况。

需要注意的是,输入参数和输出参数需要明确类型,最好使用有意义的单词。另外,一定需要方法文档,比如下面的"""获取指定城市的天气情况""" 这个解释,这个文档是给大模型使用的,大模型需要了解这个方法的作用

python 复制代码
import random

# 定义工具
def get_weather(city: str) -> str:
    """获取指定城市的天气情况"""
    weather = random.choice(["晴天", "阴天", "雨天", "多云", "小雨"])
    temputure = random.randint(15, 35)
    # 使用随机的方式模拟天气,也可以使用外部api
    return f"{city}的天气: {weather},{temputure}摄氏度"

创建agent

使用langgraph内建的create_react_agent方法来创建一个agent,参数需要模型、提示词和工具,关于agent具体的内容我们之后会更详细的介绍,这里先略过,只需要知道我们创建了一个agent即可

python 复制代码
# 创建agent
from langgraph.prebuilt import create_react_agent
prompt = "你是一个生活小助手"
tools = [get_weather]
agent = create_react_agent(model=model, prompt=prompt, tools=tools)

调用agent

创建好agent之后,我们就可以调用了,我们询问上海的天气,agent给出了一个回答

python 复制代码
# 调用agent
messages = {"messages": [{"role": "user", "content": "上海天气怎么样"}]}
ai_reponse = agent.invoke(messages)["messages"][-1]
print(ai_reponse.content)  # 上海今天的天气是晴天,温度是33摄氏度

总结

经过一番折腾,我们终于把这个查询天气的agent给搞定了。是不是感觉还挺有意思的?从搭建环境、加载环境变量,到定义工具、创建agent,每一步都充满了乐趣。虽然这个项目看起来简单,但它可是大语言模型应用的敲门砖。通过这个项目,你不仅学会了如何调用阿里云的千问大模型,还掌握了langgraph框架的基本用法。希望这个小项目能给你带来一些启发,让你在人工智能的道路上越走越远。下文见

相关推荐
站大爷IP4 小时前
Python集合:高效处理无序唯一数据的利器
python
新智元4 小时前
143 亿美金买来一场空!小扎向谷歌 OpenAI 低头,史上最大 AI 赌注失速
人工智能·openai
有心栽花无心插柳4 小时前
YOLO:一次看遍全局,如何颠覆实时目标检测的游戏规则?
人工智能·yolo·目标检测·计算机视觉·目标跟踪
站大爷IP4 小时前
Python字典:从入门到精通的实用指南
python
新智元4 小时前
硅谷炸雷!xAI 创始老哥携机密叛逃 OpenAI,马斯克:他上传了整个代码库
人工智能·openai
金井PRATHAMA4 小时前
语义分析:从读懂到理解的深度跨越
人工智能·自然语言处理
君科程序定做4 小时前
使用 Python 自动化检查矢量面数据的拓扑错误(含导出/删除选项)
开发语言·python·自动化
猿榜4 小时前
python基础-面向对象编程(OOP)
python
都是些老物件5 小时前
如何用熵正则化控制注意力分数的分布
开发语言·python