提示词库/任务指令/在这个过程中,只有当 finish_reason 为 stop 时,我们才会将结果返回给用户。 在这个过程中,只有当 finish_reason 为 stop 时,我们才会将结果返回给用户。
中文exp-2501未验证
while finish_reason is None or finish_reason == "tool_calls":
completion = client.chat.completions.create(
model="kimi-k3",
messages=messages,
tools=tools, # <-- 我们通过 tools 参数,将定义好的 tools 提交给 Kimi 大模型
)
choice = completion.choices[0]
finish_reason = choice.finish_reason
if finish_reason == "tool_calls": # <-- 判断当前返回内容是否包含 tool_calls
messages.append(choice.message) # <-- 我们将 Kimi 大模型返回给我们的 assistant 消息也添加到上下文中,以便于下次请求时 Kimi 大模型能理解我们的诉求
for tool_call in choice.message.tool_calls: # <-- tool_calls 可能是多个,因此我们使用循环逐个执行
tool_call_name = tool_call.function.name
tool_call_arguments = json.loads(tool_call.function.arguments) # <-- arguments 是序列化后的 JSON Object,我们需要使用 json.loads 反序列化一下
tool_function = tool_map[tool_call_name] # <-- 通过 tool_map 快速找到需要执行哪个函数
tool_result = tool_function(tool_call_arguments)
# 使用函数执行结果构造一个 role=tool 的 message,以此来向模型展示工具调用的结果;
# 注意,我们需要在 message 中提供 tool_call_id 和 name 字段,以便 Kimi 大模型
# 能正确匹配到对应的 tool_call。
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": tool_call_name,
"content": json.dumps(tool_result), # <-- 我们约定使用字符串格式向 Kimi 大模型提交工具调用结果,因此在这里使用 json.dumps 将执行结果序列化成字符串
})
print(choice.message.content) # <-- 在这里,我们才将模型生成的回复返回给用户
const axios = require('axios');
const openai = require('openai'); // 需要安装 openai 库
const client = new openai.OpenAI({
apiKey: process.env.MOONSHOT_API_KEY, // 运行前请设置 MOONSHOT_API_KEY 环境变量
baseURL: "https://api.moonshot.cn/v1",
});
const tools = [
{
"type": "function",
"function": {
"name": "search",
"description": "通过搜索引擎搜索互联网上的内容。\n\n当你的知识无法回答用户提出的问题,或用户请求你进行联网搜索时,调用此工具。请从与用户的对话中提取用户想要搜索的内容作为 query 参数的值。\n搜索结果包含网站的标题、网站的地址(URL)以及网站简介。",
"parameters": {
"type": "object",
"required": ["query"],
"properties": {
"query": {
"type": "string",
"description": "用户搜索的内容,请从用户的提问或聊天上下文中提取。"
}
}
}
}
},
{
"type": "function",
"function": {
"name": "crawl",
"description": "根据网站地址(URL)获取网页内容。",
"parameters": {
"type": "object",
"required": ["url"],
"properties": {
"url": {
"type": "string",
"description": "需要获取内容的网站地址(URL),通常情况下从搜索结果中可以获取网站的地址。"
}
}
}
}
}
];
async function searchImpl(query) {
const response = await axios.get("https://your.search.api", { params: { query } });
return response.data;
}
async function search(args) {
const query = args.query;
const result = await searchImpl(query);
return { "result": result };
}
async function crawlImpl(url) {
const response = await axios.get(url);
return response.data;
}
async function crawl(args) {
const url = args.url;
const content = await crawlImpl(url);
return { "content": content };
}
const toolMap = {
"search": search,
"crawl": crawl,
};
const messages = [
{ "role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。" },
{ "role": "user", "content": "请联网搜索 Context Caching,并告诉我它是什么。" } // 在提问中要求 Kimi 大模型联网搜索
];
let finishReason = null;
let choice;
async function main() {
while (finishReason === null || finishReason === "tool_calls") {
const completion = await client.chat.completions.create({
model: "kimi-k3",
messages: messages,
tools: tools, // <-- 我们通过 tools 参数,将定义好的 tools 提交给 Kimi 大模型
});
choice = completion.choices[0];
finishReason = choice.finish_reason;
if (finishReason === "tool_calls") { // <-- 判断当前返回内容是否包含 tool_calls
messages.push(choice.message); // <-- 我们将 Kimi 大模型返回给我们的 assistant 消息也添加到上下文中,以便于下次请求时 Kimi 大模型能理解我们的诉求
for (const toolCall of choice.message.tool_calls) { // <-- tool_calls 可能是多个,因此我们使用循环逐个执行
const toolCallName = toolCall.function.name;
const toolCallArguments = JSON.parse(toolCall.function.arguments); // <-- arguments 是序列化后的 JSON Object,我们需要使用 JSON.parse 反序列化一下
const toolFunction = toolMap[toolCallName]; // <-- 通过 tool_map 快速找到需要执行哪个函数
const toolResult = await toolFunction(toolCallArguments);
// 使用函数执行结果构造一个 role=tool 的 message,以此来向模型展示工具调用的结果;
// 注意,我们需要在 message 中提供 tool_call_id 和 name 字段,以便 Kimi 大模型
// 能正确匹配到对应的 tool_call。
messages.push({
"role": "tool",
"tool_call_id": toolCall.id,
"name": toolCallName,
"content": JSON.stringify(toolResult), // <-- 我们约定使用字符串格式向 Kimi 大模型提交工具调用结果,因此在这里使用 JSON.stringify 将执行结果序列化成字符串
});
}
}
}
console.log(choice.message.content); // <-- 在这里,我们才将模型生成的回复返回给用户
}
main();
我们使用 while 循环来执行包含工具调用在内的代码逻辑,这是因为 Kimi 大模型通常不会只执行一次工具调用,尤其是在联网搜索这个场景,通常,Kimi 大模型会先选择调用 search 工具,通过 search 工具获取搜索结果后,再调用 crawl 工具将搜索结果中的 url 转换为具体的网页内容,整体的 messages 结构如下所示:
system: prompt # 系统提示词
user: prompt # 用户提问
assistant: tool_call(name=search, arguments={query: query}) # Kimi 大模型返回 tool_call 调用(单个)
tool: search_result(tool_call_id=tool_call.id, name=search) # 提交 tool_call 执行结果
assistant: tool_call_1(name=crawl, arguments={url: url_1}), tool_call_2(name=crawl, arguments={url: url_2}) # Kimi 大模型继续返回 tool_calls 调用(多个)
tool: crawl_content(tool_call_id=tool_call_1.id, name=crawl) # 提交 tool_call_1 执行结果
tool: crawl_content(tool_call_id=tool_call_2.id, name=crawl) # 提交 tool_call_2 执行结果
assistant: message_content(finish_reason=stop) # Kimi 大模型生成面向用户的回复消息,本轮对话结束
至此,我们完成了“联网查询”工具调用的全过程,如果你实现了自己的 search 和 crawl 方法,那么当你向 Kimi 大模型要求联网查询时,它会调用 search 和 crawl 两个工具,并根据工具调用结果给予你正确的回复。
复制后粘贴到 AI 对话框发送,本次对话全程生效
出处:Kimi/Moonshot 官方提示词指南 · platform.moonshot.cn/docs/guide/use-kimi-api-to-complete-tool-calls · 可信度 S · 标签:中文 / 提示词工程 / 防幻觉 / Kimi / 工具调用 怎么用(对话型)复制后粘贴到对话框发送,本次对话全程生效。想长期用:支持自定义指令的产品(设置→个性化)可设为默认。