前言
嘿,朋友们!在这个科技飞速发展的时代,人工智能已经不再是科幻电影里的玩意儿,而是实实在在地走进了我们的生活。今天,我就要带大家来一场说干就干的实践之旅------用阿里云的千问大模型和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框架的基本用法。希望这个小项目能给你带来一些启发,让你在人工智能的道路上越走越远。下文见