AB
AiBoss
チュートリアル

书生大模型

チュートリアル

用书生大模型 API 驱动 Browser-Use 完成网页自动化任务

这篇教程讲清如何用书生大模型 API 搭建文本与多模态对话,再把模型接入 Browser-Use Web-UI,让智能体自动打开浏览器、查询信息并录制操作过程。内容包括 Token 获取、环境搭建、三轮对话上下文构造、图片理解调用,以及 Web-UI 的启动与选项配置。

书生大模型 API 提供了一套兼容 OpenAI 接口规范的调用方式,开发者可以用熟悉的 SDK 或原生 HTTP 请求,直接调用 InternLM 系列文本模型与 InternVL 系列多模态模型。把这类模型接到 Browser-Use 上,就能让模型自己打开浏览器、点击页面、读取结果,完成「去某个网站查一下今天的天气」这类自然语言任务。这篇教程面向刚接触大模型 API、想动手做一次网页自动化的读者,从申请 Token 开始,一路做到在 Browser-Use Web-UI 里跑通任务并录制过程。站内也有对应的工具条目,可以先看一眼:书生大模型。

需要说明的是,模型版本、接口地址、配额与计费方式都可能调整,文中出现的具体取值仅用于说明调用结构,实际使用时请以官网当前信息为准。

准备工作

账号与 API Token

第一步是拿到可用的 API Token。访问书生 AI 官网完成注册,申请 API 权限,进入 API 页面后点击获取个人密钥,再创建一个 API Token。创建时会给 Token 起一个名字,确认之后页面会显示一串字符。

这里有一个容易踩的坑:Token 只显示一次,点击确认后就不可见,必须当场复制并妥善保存。如果没保存下来,只能重新创建一个。另外,不要把 Token 直接硬编码在源码里,也不要把带 Token 的文件提交到公开仓库。

Python 与依赖

文本与多模态调用部分只需要 Python 环境和两个库:

pip install requests openai
pip install dotenv

openai 用来走兼容 OpenAI 的 SDK 调用方式,requests 用来演示原生 HTTP 调用,dotenv 负责从 .env 文件加载环境变量。

Browser-Use 侧的环境

如果要跑后面的网页自动化部分,还需要准备 Git、uv 和浏览器内核。Git 用于克隆项目,uv 用于创建隔离的虚拟环境并安装依赖,Playwright 负责提供 Chromium 浏览器。

Windows 上安装 Git 时下载对应版本的安装程序,按向导默认设置完成安装,然后在终端执行下面的命令确认安装成功:

git --version

uv 可以直接用 pip 安装,要求 Python 版本在 3.8 及以上:

pip install uv
uv --version

如果终端提示找不到 uv 命令,需要把 uv 的可执行文件所在目录手动加入环境变量 PATH。

操作步骤

第一步:把 Token 放进环境变量

先建一个工作目录,并在其中创建 .env 文件:

mkdir -p /root/Internlm && cd /root/Internlm
touch .env

在 .env 里按下面的形式写入 Token,变量名可以自定义,后文代码要与之一致:

InternLM="your_api_token"

第二步:用 OpenAI SDK 发起文本对话

核心是把 base_url 指向书生大模型的接口地址,把 api_key 换成自己的 Token,模型名填文本模型。下面的例子构造了一段带历史消息的对话:

from openai import OpenAI
from dotenv import load_dotenv
import os

InternLM_api_key = os.getenv("InternLM", load_dotenv())

client = OpenAI(
    api_key=InternLM_api_key,
    base_url="https://chat.intern-ai.org.cn/api/v1/"
)

chat_rsp = client.chat.completions.create(
    model="internlm3-latest",
    messages=[
        {"role": "user", "content": "你知道刘慈欣吗?"},
        {"role": "assistant", "content": "我是一个人工智能助手,我知道刘慈欣。他是一位著名的中国科幻小说家和工程师,曾经获得过多项奖项,包括雨果奖、星云奖等。"},
        {"role": "user", "content": "他什么作品得过雨果奖?"}
    ],
    stream=False
)

for choice in chat_rsp.choices:
    print(choice.message.content)

messages 里的 role 支持 user、assistant、system、tool 四种取值。把上一轮的问答按顺序放进列表,模型就能在上下文中理解「他」指的是谁。

如果改用流式输出,把 stream 设为 True,返回对象就变成可迭代的块,需要逐块取增量内容:

for chunk in chat_rsp:
    print(chunk.choices[0].delta.content)

第三步:用原生 requests 调用

不想引入 SDK 时,直接发 HTTP 请求也可以。请求头里带 Content-Type 和 Authorization,请求体是 JSON,字段与 SDK 的参数一一对应:

import requests
import json
from dotenv import load_dotenv
import os

InternLM_api_key = os.getenv("InternLM", load_dotenv())

url = 'https://chat.intern-ai.org.cn/api/v1/chat/completions'
header = {
    'Content-Type': 'application/json',
    "Authorization": "Bearer " + InternLM_api_key,
}
data = {
    "model": "internlm3-latest",
    "messages": [{"role": "user", "content": "你好~"}],
    "n": 1,
    "temperature": 0.8,
    "top_p": 0.9
}

res = requests.post(url, headers=header, data=json.dumps(data))
print(res.status_code)
print(res.json())
print(res.json()["choices"][0]['message']["content"])

其中 n 控制生成几条候选回复,temperature 控制随机性,top_p 控制采样范围。回复正文在 choices[0].message.content 里。

第四步:发送图片做多模态理解

多模态调用要换成视觉模型,并且把用户消息的 content 从字符串改成数组,数组里每一项是一个内容块,type 支持 text 和 image_url:

from openai import OpenAI
from dotenv import load_dotenv
import os

InternLM_api_key = os.getenv("InternLM", load_dotenv())

client = OpenAI(
    api_key=InternLM_api_key,
    base_url="https://chat.intern-ai.org.cn/api/v1/"
)

chat_rsp = client.chat.completions.create(
    model="internvl2.5-latest",
    messages=[
        {"role": "user", "content": "你好"},
        {"role": "assistant", "content": "你好,我是 internvl"},
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Describe these two images please"},
                {"type": "image_url", "image_url": {"url": "https://example.com/image1.jpg"}},
                {"type": "image_url", "image_url": {"url": "https://example.com/image2.jpg"}}
            ]
        }
    ],
    n=1,
    stream=False
)

for choice in chat_rsp.choices:
    print(choice.message.content)

image_url 里的 url 既可以是互联网上公开可访问的图片地址,也可以是图片的 base64 编码。单轮对话支持一次上传多张图片。实际测试中,模型有时只识别到其中一张,回复里会明确说明「我只能看到一张图片」,这属于模型对多图输入的识别表现,遇到时可以把图片拆成多轮分别提问。

第五步:构造三轮对话并拿到最终回复

把多轮文本与图片混在一起,就是完整的上下文构造。下面这段代码先进行两轮纯文本问答,第三轮再带上两张图片,同时用 temperature 和 max_tokens 控制输出:

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
InternLM_api_key = os.getenv("InternLM")

client = OpenAI(
    api_key=InternLM_api_key,
    base_url="https://chat.intern-ai.org.cn/api/v1/"
)

messages = [
    {"role": "user", "content": "你好,请介绍一下你自己"},
    {"role": "assistant", "content": "你好!我是 InternVL,一个多模态AI助手。我可以理解和分析文本与图像,帮助您处理各种任务,包括图像描述、视觉问答、文档理解等。有什么我可以帮助您的吗?"},
    {"role": "user", "content": "你能处理哪些类型的图像任务?"},
    {"role": "assistant", "content": "我可以处理多种图像任务:\n1. 图像描述:详细描述图片内容\n2. 视觉问答:回答关于图片的问题\n3. 图像对比:分析多张图片的异同\n4. OCR识别:提取图片中的文字\n5. 图表分析:理解图表、图形数据\n6. 场景理解:识别图片中的物体、人物和场景"},
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "请分析这两张图片,告诉我它们分别展示了什么产品,以及它们的主要特点"},
            {"type": "image_url", "image_url": {"url": "https://example.com/product1.jpg"}},
            {"type": "image_url", "image_url": {"url": "https://example.com/product2.jpg"}}
        ]
    }
]

try:
    chat_rsp = client.chat.completions.create(
        model="internvl2.5-latest",
        messages=messages,
        n=1,
        stream=False,
        temperature=0.8,
        max_tokens=500
    )
    print("=== API 最终回复 ===")
    for choice in chat_rsp.choices:
        print(choice.message.content)
except Exception as e:
    print(f"API调用出错: {str(e)}")

把整个 messages 列表再遍历打印一遍,就能看到完整的对话历史,方便核对上下文是否正确。注意第三轮的用户消息是数组,打印时要取第一个元素的 text 字段,并统计图片数量。

第六步:创建 Browser-Use 项目环境

新建一个项目文件夹并用编辑器打开,在终端里创建虚拟环境。这里指定 Python 3.11:

uv venv Internlm --python 3.11

Windows PowerShell 下激活虚拟环境:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Internlm\Scripts\Activate.ps1

第七步:克隆项目并安装依赖

把 Browser-Use 的 Web-UI 项目克隆到本地,进入 web-ui 目录后安装依赖。下载慢时可以临时指定镜像源:

git clone https://github.com/browser-use/web-ui.git
cd web-ui
uv pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

接着安装 Playwright 的 Chromium 浏览器内核:

playwright install --with-deps chromium

web-ui 目录下有一个 .env.example,它是项目的启动配置模板,复制一份并重命名为 .env:

cp .env.example .env

第八步:启动 Web-UI

在项目目录下运行:

python webui.py --ip 127.0.0.1 --port 7788

如果启动时报出 TypeError: argument of type 'bool' is not iterable 这类 ASGI 应用异常,通常是 gradio 版本过旧,升级到最新版即可:

uv pip install --upgrade gradio -i https://pypi.tuna.tsinghua.edu.cn/simple

第九步:配置模型与 API Key

打开 Web-UI 页面后,在 LLM Settings 区域选择 Intern 模型。这里有一个关键区别:

  • 选择 internvl-latest 时,模型具备视觉能力,可以处理页面截图。
  • 选择文本模型 internlm 时,必须把 Agent Settings 里的 Use Vision 选项去掉,因为文本模型不支持图像识别。

API KEY 一栏填入前面拿到的 Token。也可以不在这里填,而是直接写进项目的 .env 文件,由程序启动时读取。

第十步:运行任务并录制过程

在 Run Agent 输入框里用自然语言描述任务,点击 Run Agent 开始执行。例如:

去百度查一下今天上海的天气,给我结果

模型会自行规划步骤、打开浏览器、在搜索框输入关键词、读取页面内容,最后把结果整理出来。执行过程中,Web-UI 会展示每一步的思考与操作。

Browser-Use Web-UI 自带录制功能,可以把整个操作浏览器的过程录下来。录制完成后,视频可以直接用于作业提交或过程复盘。第二个可以尝试的任务是让模型访问书生 AI 官网、等待页面加载、获取 Token 并命名,最后把结果返回——这类任务涉及登录态与页面等待,更适合用来观察模型在复杂页面上的表现。

一个完整示例

下面把前面的步骤串成一个最小可跑通的流程:先用 API 做一次带图片的三轮对话,再让 Browser-Use 执行一个查询任务。

准备阶段

  1. 在书生 AI 官网注册并创建 API Token,当场复制保存。
  2. 执行 pip install requests openai dotenv。
  3. 创建项目目录,写入 .env,内容为 InternLM="你的Token"。

调用阶段

把第五步的三轮对话代码保存为 chat_demo.py,在项目目录下运行:

python chat_demo.py

终端会打印出模型对两张图片的分析结果。如果只想验证文本链路,把第三轮消息换成纯字符串即可,模型名也相应换成文本模型。

自动化阶段

  1. 执行 uv venv Internlm --python 3.11 创建环境并激活。
  2. 克隆 web-ui 项目,进入目录,执行 uv pip install -r requirements.txt。
  3. 执行 playwright install --with-deps chromium。
  4. 复制 .env.example 为 .env。
  5. 执行 python webui.py --ip 127.0.0.1 --port 7788。
  6. 浏览器打开本地页面,LLM Settings 选 internvl-latest,填入 API KEY。
  7. 在 Run Agent 输入「去百度查一下今天上海的天气,给我结果」,点击运行。
  8. 开启录制,保存操作过程。

整个流程跑通后,就同时验证了两件事:API 侧的文本与多模态调用是通的,Browser-Use 侧的模型接入与浏览器控制也是通的。

注意事项

  • Token 只显示一次。创建后页面不再展示,务必当场复制;泄露后应重新创建并废弃旧的。
  • 不要把 Token 写进代码。用 .env 加环境变量加载,避免随源码一起外泄。
  • 模型能力要匹配任务。文本模型不支持图像识别,在 Web-UI 里选了文本模型就必须关闭 Use Vision,否则页面截图无法被理解。
  • 多图输入可能只识别到一张。模型回复中会说明只看到一张图片,需要多图对比时建议拆成多轮提问。
  • gradio 版本过旧会导致启动失败。遇到 bool is not iterable 一类报错,先升级 gradio 再重试。
  • uv 命令找不到。安装完成后需要把可执行文件目录加入 PATH,否则终端无法识别。
  • 依赖下载慢。安装 Python 包时可以临时用 -i 指定镜像源加速,这只影响下载速度,不改变包内容。
  • 版本、配额与计费以官网为准。模型名称、接口地址、可用额度都可能变化,正式使用前请核对官网当前信息。