使用 LangChain4J 实现 Agent 与 Tool 调用
前言
大语言模型(LLM)的问世给行业带来巨大变革,但在实际落地中,如何将 LLM 技术融入系统并与外部交互仍是挑战。开发者需要让 LLM 能调用外部 API 并传入参数,取得数据后再进行推理,以避免幻觉或错误答案。OpenAI 推出的函数呼叫(Function Calling)功能允许将 LLM 与外部 API 融合,使得智能体(Agent)应用成为可能。
对于 Java 或 JVM 生态系的开发者而言,LangChain4J 框架是重要选择。它吸收了 LangChain 的设计精神,并结合 Spring、Quarkus 等框架进行了优化。本文使用 LangChain4J 的高阶 API 创建一个简单的 Agent,用户通过 Agent 与 GLM-4 交互,并通过 Function Calling 调用工具(Tool),模拟本地商店发现与下单场景。
场景设计
范例中的 Tool 功能包括:
- 根据位置查询附近的美食店、蛋糕店、奶茶店等。
- 查询特定美食的店铺。
- 用户下单。
- 自动推荐最近店铺并下单。
代码中不实现真实的定位与业务逻辑,仅返回示例数据以演示 Function Calling 流程。
核心代码实现
Service Bean (AiService)
package dev.example
import dev.langchain4j.memory.chat.ChatMemoryProvider
import dev.langchain4j.memory.chat.MessageWindowChatMemory
import dev.langchain4j.model.qianfan.QianfanChatModel
import dev.langchain4j.service.AiServices
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore
import io.quarkus.runtime.Startup
import jakarta.enterprise.context.ApplicationScoped
import org.jboss.logging.Logger
@ApplicationScoped
class AiService {
companion object {
private val LOGGER: Logger = Logger.getLogger("AiService")
}
private lateinit var chatMemoryProvider: ChatMemoryProvider
private lateinit var assistant: Assistant
@Startup
fun init {
zhipuApiKey = System.getenv()
chatMemoryProvider = ChatMemoryProvider { memoryId: Any? ->
MessageWindowChatMemory.builder()
.id(memoryId)
.maxMessages()
.chatMemoryStore(InMemoryChatMemoryStore())
.build()
}
assistant = AiServices.builder(Assistant::.java)
.chatLanguageModel(
ZhipuAiChatModel.builder()
.apiKey(zhipuApiKey)
.model()
.build()
)
.chatMemoryProvider(chatMemoryProvider)
.tools(Tools.FindAndOrderSomething())
.build()
LOGGER.info()
}
: String {
answer = assistant.sendMessage(, message)
LOGGER.info()
answer
}
}


