九源开源技术周 05| 用 InfiniLM 和 InfiniTensor 把智能体跑起来

让智能体帮忙排查一次服务启动失败,我们可能只会说一句:"看看日志,帮我找找原因。"它却得先读报错,再查部署手册,发现信息不够,还要回头检查配置。用户问了一句话,背后可能已经跑了好几轮模型和工具。

这也给底层推理提出了新的要求:模型要能说清楚调用什么工具,读懂工具返回的结果,再接着往下做;遇到模型没见过的内部资料,还需要有办法把相关内容找出来。这次,InfiniLM 和 InfiniTensor 分别补上了这两部分能力,让我们可以把本地模型和资料检索接进常用的智能体。

让模型把工具真正用起来

模型说一句“我来查一下文档”,程序还没法直接执行。它需要知道调用哪个工具、查询什么、返回几条结果。InfiniLM 会把智能体提供的工具说明和参数定义传给模型,再将模型的输出整理成明确的调用信息,包括工具名称、参数,以及用于关联结果的调用标识。

不同模型表达工具调用的方式并不一样,有的用 JSON,有的用专门的标签。InfiniLM 在服务端处理这些差异,通过兼容 OpenAI 风格的 Chat Completions 接口返回统一的结果。接入这一接口的智能体,就可以继续使用自己的工具执行流程,不必逐个解析模型的原始输出。

真正做任务时,一次调用通常还不够。比如查到"先检查动态库搜索路径"之后,模型还得读一下当前配置,才能判断问题出在哪里。上层智能体执行工具,把结果连同对话历史再次提交给 InfiniLM;InfiniLM 将这些信息组织成下一轮输入,并对应好每次调用和返回结果,让模型沿着已有线索继续分析。

流式交互也要处理好这件事。普通回复、思考内容和工具调用会分别传递,工具参数完整并通过检查后,再交给上层处理。这样,界面可以持续展示进展,智能体也能拿到完整的调用信息,继续执行后面的步骤。

让智能体查到自己的资料

再来看查资料这一边。用户问"为什么启动时找不到库",部署手册里写的可能是"动态链接库搜索路径"。两句话意思相关,字面却不一样。资料一多,只靠关键词就容易漏掉真正有用的段落。

InfiniTensor 这次接入了 BGE-small-zh-v1.5 中文向量模型,将文本编码成 512 维向量,用相似度寻找相关内容。建库时,先把资料拆成合适长度的片段,计算并保存向量;查询时,只需要编码当前问题,再从已有索引里找出相关原文。每次提问都不用重新为整份知识库计算向量。

这里还有一个很实际的问题:建库是一批长短不一的文档,查询可能只有一句话。对推理框架来说,批量和序列长度一直在变。InfiniTensor 可以在同一个模型实例中保留计算图和权重,根据当前输入调整执行所需的形状,换一批文本时不用重新加载模型。

文本接口也会自动分批,按当前批次中最长的文本补齐长度。一句短问题用不着总被补到模型允许的最大长度,调用方也不用自己把文档凑成固定大小的批次。这让同一个向量模型既能处理批量建库,也能持续接收零散查询。

把检索封装成工具后,两部分就接上了:InfiniLM 支撑大模型判断下一步做什么,智能体负责执行工具,InfiniTensor 为检索提供文本向量,找到的原文再送回模型。

由智能体衔接模型推理与工具执行,将本地资料带入后续判断

先把模型服务接到 PilotDeck

接下来用一个简单例子看看怎么用。我们在同一台 Linux/NVIDIA 机器上运行 PilotDeck 和模型服务。PilotDeck 可以直接安装并启动:

curl -fsSL https://raw.githubusercontent.com/OpenBMB/PilotDeck/main/install.sh | bash
pilotdeck

打开终端提示的网址,就能进入智能体界面。安装好支持工具调用的 InfiniLM,并准备好 Qwen3-4B 模型后,另开一个终端,在 InfiniLM 仓库目录启动服务:

python pythoninference_server.py \
  --model /models/Qwen3-4B \
  --device nvidia --dtype bfloat16 --tp 1 \
  --max-batch-size 1 \
  --max-cache-len 32768 --max-new-tokens 4096 \
  --tool-call-parser hermes \
  --host 127.0.0.1 --port 8000

这里的 --tool-call-parser hermes 启用了 Qwen3 对应的工具调用解析。然后在 PilotDeck 的"设置 → 模型池"里添加自定义服务:

配置项 本文示例
服务商 ID infinilm
协议 openai(Chat Completions)
服务地址 http://127.0.0.1:8000/v1
API Key local-infinilm
模型 ID Qwen3-4B

本例没有开启服务端鉴权,API Key 使用占位值即可。模型按纯文本配置,上下文长度和最大输出分别设为 32768、4096 token,与启动参数一致。

选中这个模型,打开一个项目目录,就可以试着问:"读取 README.md,告诉我这个项目怎么启动。"这已经会经过模型提出调用 → 智能体读取文件 → 模型根据结果回答的完整过程。

再加上自己的资料库

安装好 InfiniTensor、准备好它导出的 BGE 模型包之后,把资料整理成 documents.jsonl,每行包含一个唯一的 id 和一段 text。在 InfiniTensor 的独立 Python 环境中,进入仓库目录,先建库,再查询:

python examplesembedding_retrieval.py \
  --model-dir /models/bge-small-zh \
  encode --documents documents.jsonl --output indexes/knowledge

python examplesembedding_retrieval.py \
  --model-dir /models/bge-small-zh \
  query --index indexes/knowledge --text '启动时找不到动态库怎么办?' --top-k 5

第一条命令把资料保存成向量索引,第二条从中找出最相关的 5 段内容,并返回原文、文档 ID 和相关度分数。到这里,就可以先看检索能不能找到自己需要的资料。

要让 PilotDeck 自动查询这份资料库,可以将查询接口封装成 search_knowledge 这样的 MCP 工具。MCP 是智能体连接外部工具的一种通用方式;启动检索服务后,在 PilotDeck 的"设置 → MCP 服务器"中添加它,填写实际服务地址即可。这个工具服务保留一个常驻的向量模型实例,就能复用前面提到的计算图和权重。

接好以后,再问:"读取启动日志,查一下部署资料,帮我判断为什么找不到动态库,回答时带上资料 ID。"智能体就有了读日志和查内部资料两种手段,我们也可以顺着原文核对它的判断。

同样的方式也可以用于 OpenClaw 等支持相应模型接口和 MCP 工具的智能体应用。模型和资料准备好后,这里的推理与检索可以在本地完成,适合用来搭建内网知识助手、运维助手。平时仍然在熟悉的界面里提问,背后的模型服务和资料检索则由 InfiniLM 与 InfiniTensor 提供。

🔗项目仓库

关注与交流