ollama Qwen2工具调用支持

5n0oy7gb  于 2个月前  发布在  其他
关注(0)|答案(7)|浏览(46)

请支持Qwen2的API工具调用功能。顺便问一下,如果我想在Ollma中自己实现Qwen2的API工具调用功能,可以吗?我应该怎么做?
谢谢!

bgtovc5b

bgtovc5b1#

我还想了解的是,我下载了Qwen/Qwen2-7B-Instruct,它支持工具,但不能在Ollama中使用。

0dxa2lsx

0dxa2lsx2#

我也想知道。我下载了Qwen/Qwen2-7B-Instruct,它支持工具,但不能在Ollama中使用。glm4也无法使用。也许Ollama目前只支持llama3.1和Mistral。

ogsagwnx

ogsagwnx3#

FYI, this is the reference implementation from Qwen:

  • https://github.com/QwenLM/Qwen-Agent/blob/main/qwen_agent/llm/function_calling.py#L381

Example usages:

I'm looking into how to port Qwen's implementation to Ollama as well. Unfortunately, Ollama is written in Go, not Python. I'm not familiar with Go. So the progress is slow. If the upcoming Qwen 2.5 supports the tool-calling prompt used by LLaMA 3.1, things might be easier.
cc @JustinLin610

mzillmmw

mzillmmw4#

关于API工具调用的参考实现来自Qwen:

  • https://github.com/QwenLM/Qwen-Agent/blob/main/qwen_agent/llm/function_calling.py#L381

示例用法:

我正在研究如何将Qwen的实现移植到Ollama。不幸的是,Ollama是用Go编写的,而不是Python。我对Go不熟悉。因此,进展缓慢。如果即将发布的Qwen 2.5支持LLaMA 3.1使用的工具调用提示,事情可能会变得容易一些。
感谢你的信息!我一直在寻找使用API工具调用的方法,例如fastchat、vllm等。但它们不支持glm4、Qwen2等。在我看来,Langchain中的许多方法需要API工具调用,例如llm.bind_tools()、llm.with_structured_output()等。所以如果将来有一个中间件可以为中文开源llm实现API工具调用,那就太好了。

vq8itlhq

vq8itlhq5#

我已经阅读了Ollma的源代码,但由于我对Go语言不太熟悉,所以我不确定我的理解是否正确。

  1. 从以下代码接收POST请求:
r.POST("/v1/chat/completions", openai.ChatMiddleware(), s.ChatHandler)
  1. 在以下代码中,s.GeneratedHandler 将决定模型是否具有工具功能:
r, m, opts, err := s.scheduleRunner(c.Request.Context(), req.Model, caps, req.Options, req.KeepAlive)
  1. s.scheduleRunner 函数首先读取 /usr/share/ollama/.ollama/models/Blobs/ 下的相应提示模板文件,该代码为:
mp := ParseModelPath(name)
	manifest, digest, err := GetManifest(mp)
	if err != nil {
		return nil, err
	}

	model := &Model{
		Name:      mp.GetFullTagname(),
		ShortName: mp.GetShortTagname(),
		Digest:    digest,
		Template:  template.DefaultTemplate,
	}

	filename, err := GetBlobsPath(manifest.Config.Digest)
  1. 如果此模板文件中有 {{. tool}},则 model.CheckCapabilities(caps...) 可以通过(在 s.scheduleRunner 中),否则它将报告错误
  2. 将模板文件组装成提示:
prompt, images, err := chatPrompt(c.Request.Context(), m, r.Tokenize, opts, req.Messages, req.Tools)
  1. llm根据提示(仅在提示中显示工具信息)进行响应
r.Completion(c.Request.Context(), llm.CompletionRequest{
			Prompt:  prompt,
			Images:  images,
			Format:  req.Format,
			Options: opts,
		}
tzdcorbm

tzdcorbm6#

我已经阅读了Ollma的源代码,但由于我对Go语言不太熟悉,所以我不确定我的理解是否正确。

  1. 从以下代码接收POST请求:
r.POST("/v1/chat/completions", openai.ChatMiddleware(), s.ChatHandler)
  1. s.GeneratedHandler 将决定模型在以下代码中是否具有工具功能:
r, m, opts, err := s.scheduleRunner(c.Request.Context(), req.Model, caps, req.Options, req.KeepAlive)
  1. s.scheduleRunner 函数首先读取位于 /usr/share/ollama/.ollama/models/Blobs/ 下的相应提示模板文件,该代码为:
mp := ParseModelPath(name)
	manifest, digest, err := GetManifest(mp)
	if err != nil {
		return nil, err
	}

	model := &Model{
		Name:      mp.GetFullTagname(),
		ShortName: mp.GetShortTagname(),
		Digest:    digest,
		Template:  template.DefaultTemplate,
	}

	filename, err := GetBlobsPath(manifest.Config.Digest)
  1. 如果模板文件中有 {{. tool}},则 model.CheckCapabilities(caps...) 可以通过(在 s.scheduleRunner 中),否则它将报告错误
  2. 将模板文件组装成提示:
prompt, images, err := chatPrompt(c.Request.Context(), m, r.Tokenize, opts, req.Messages, req.Tools)
  1. llm根据提示(仅在提示中显示工具信息)进行响应
r.Completion(c.Request.Context(), llm.CompletionRequest{
			Prompt:  prompt,
			Images:  images,
			Format:  req.Format,
			Options: opts,
		}

因此,只要我修改位于 /usr/share/ollama/.ollama/models/Blobs/ 下的提示模板,Qwen2就有可能实现API工具调用吗?

xxslljrj

xxslljrj7#

我刚刚为 qwen2:7b 创建了一个工具调用模板:https://ollama.com/majx13/test
然而,最新的 install.sh 为我安装了 Ollama 版本 0.3.0(这很奇怪),而不是包含工具调用功能的 0.3.1 版本。因此,我还没有测试模板是否正确。我只是分享这个,希望它能帮到你。
一旦我安装了 0.3.1 版本,我会稍后测试一下。

相关问题