有人在本地使用 Ollama 成功实现过这个功能吗?
我也正尝试让它与 ollama 一起工作,看起来 Discourse AI 插件使用的 API 与 Ollama 不兼容,并且我更改的任何设置都不会改变 API 请求。
以下是与 ollama 一起工作的示例:
curl http://192.168.1.2:11434/api/generate -d '{\
\"model\": \"llama3.2\",\
\"prompt\": \"Why is the sky blue?\"\
}'
而上面似乎是该插件尝试的唯一一种请求。例如:
curl http://192.168.1.2:11434/ \
-X POST \
-H 'Content-Type: application/json' \
-d '{\"inputs\":\"\u003cs\u003e[INST] What is your favourite condiment? [/INST] Well, Im quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever Im cooking up in the kitchen!\u003c/s\u003e [INST] Do you have mayonnaise recipes? [/INST]\",\"parameters\":{\"max_new_tokens\":500, \"temperature\":0.5,\"top_p\": 0.9}}'
AI 聊天机器人据称支持 ollama,但我也无法获得任何响应。
所以,任何已经成功使用 ollama 的人,请发布你使用的设置!
我好像说得太早了,如果我在 Discourse AI 插件中没有设置任何配置,并且遵循此帖子中的 RAG 说明,我确实会从 Ollama 在 AI 聊天机器人中获得响应!
它与ollama配合得非常好,我们团队有多人在使用它。
好的。有没有可以遵循的指南,说明如何实现它?
我对聊天机器人以外的摘要和其他功能更感兴趣。
预计到达时间:此配置不起作用:
(我在此处编辑了我的主机 IP 地址)。
当我单击“运行测试”时,会收到内部服务器错误。
在 /logs 中,我看到:
NameError (undefined local variable or method `tokenizer' for an instance of DiscourseAi::Completions::Dialects::ChatGpt)
app/controllers/application_controller.rb:427:in `block in with_resolved_locale'
app/controllers/application_controller.rb:427:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:35:in `call'
lib/middleware/csp_script_nonce_middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:409:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/processing_request.rb:12:in `call'
lib/middleware/request_tracker.rb:385:in `call'
无论我选择哪个分词器,都会出现这种情况。我正在 3.5.0beta1-dev (c1ee4e120e) 上测试此功能。
将 URL 设置为 http://localhost:11434/v1/chat/completions
测试仍然因内部服务器错误而失败,日志消息也相同——一个 NameError,指出“tokenizer”是未定义的局部变量。
尝试按原样保存模型,刷新页面,然后通过编辑 LLM 按钮返回并运行新的测试。
结果一样——我试了几次了,但刚又试了一遍。
我以通常的方式安装——将其添加到我的 app.yml 文件并运行 ./launcher rebuild app
我添加的行是:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- sudo -E -u discourse git clone https://github.com/discourse/discourse-ai.git
(我已经从列表中删除了其他插件,但保留了 yml 组件,以便您可以看到它在 yml 文件中的位置。)
我明天会把本地的ollama设置好,并在这里报告。
我做了:
ollama serve
ollama run phi4
# 测试
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "phi4",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "How much is 1+1?"
}
]
}' -s | jq .choices[].message.content
"1 + 1 的和是 2。\n\n在基础算术中,当您将一个单位加到另一个单位时,总数就变成两个单位。此操作是数学中使用的一些基本加法原理的一部分。关于数学或任何其他主题,还有什么我可以帮助您的吗?"
在 Helper 上进行了测试
感谢测试。
我注意到我的配置中多了一个选项(禁用流式补全)。是否可能是模型选择导致了我遇到的问题?(我安装了 deepseek-r1:32b)。
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1:32b",
"messages": [
{
"role": "system",
"content": "你是一个乐于助人的助手。"
},
{
"role": "user",
"content": "1+1 等于多少?"
}
]
}' -s | jq .choices[].message.content
"<think>\n好的,我正在试图弄清楚 1 加 1 等于多少。好吧,让我们一步步来分解这个问题,尽管它看起来很简单。\n\n首先,我知道加法是将两个数字相加得到一个总和。所以,当我们说 1 + 1 时,我们实际上是将一个物体和另一个物体放在一起,看看总共有多少个。\n\n让我可视化一下:想象我的左手拿着一个苹果,右手也拿着一个苹果。如果我把它们放在一起,我总共有多少个苹果?应该是两个苹果,对吧?\n\n另一种思考方式是使用数轴。从数字 1 开始,如果我向前移动一步,我会落在哪里?没错,就是数字 2。\n\n我也可以用手指来数。左手伸出一根手指,右手也伸出一根。现在,一起数:一、二。所以总共有两根手指,这意味着 1 + 1 = 2。\n\n也许我应该检查一下是否有其他视角或方法。例如,在计算机使用的二进制数系统中,1 + 1 等于 10,因为在达到 2(表示为 10)后会进位。但那是不同的上下文。在我们日常使用的标准十进制算术中,1 + 1 仍然是 2。\n\n我还可以考虑集合的概念。如果我有一个包含一个元素的集合和另一个包含一个元素的集合,将它们合并会得到一个包含两个元素的集合。这进一步证实了 1 + 1 等于 2。\n\n我可能会想,是否存在 1 + 1 不等于 2 的情况。但在基础算术和我们所学习的数学领域内,答案始终是 2。\n\n为了确保我没有遗漏任何内容,也许我应该研究一些确认这一点的数学证明或原理。例如,在构成算术基础的皮亚诺公理中,将 1 加到 1 上的概念遵循每个自然数都有一个后继的公理,而 2 被定义为 1 的后继。\n\n因此,将所有这些想法放在一起——可视化物体、使用数轴、数手指、考虑集合,甚至涉及数学公理——都指向 1 + 1 等于 2。\n</think>\n\n将 1 和 1 相加的结果是 2。这可以通过简单的算术和多种可视化问题的方式来看到。\n\n**答案:** \n$1 + 1 = \\boxed{2}$"
结果类似,但我在这个特定模型上得到了 <think> 标签——所以也许这个模型不适合这个用途。
我刚刚重新构建了安装(即 ./launcher rebuild app),并确保所有内容都是最新的——我在更新页面中看到“全部已更新”。
选择 deepseek-r1:32b 或 phi4(我也安装并测试了 phi4),我仍然在浏览器中看到内部服务器错误响应。
但在我的日志中,我看到了一些新的内容。
FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination: all resolved IPs were disallowed) lib/final_destination/ssrf_detector.rb:105:in 'lookup_and_filter_ips' lib/final_destination/http'
lib/final_destination/ssrf_detector.rb:105:in `lookup_and_filter_ips`
lib/final_destination/http.rb:15:in `connect`
net-http (0.6.0) lib/net/http.rb:1642:in `do_start`
net-http (0.6.0) lib/net/http.rb:1631:in `start`
net-http (0.6.0) lib/net/http.rb:1070:in `start`
plugins/discourse-ai/lib/completions/endpoints/base.rb:105:in `perform_completion!`
plugins/discourse-ai/lib/completions/endpoints/open_ai.rb:44:in `perform_completion!`
plugins/discourse-ai/lib/completions/llm.rb:281:in `generate`
plugins/discourse-ai/lib/configuration/llm_validator.rb:36:in `run_test`
plugins/discourse-ai/app/controllers/discourse_ai/admin/ai_llms_controller.rb:128:in `test`
actionpack (7.2.2.1) lib/action_controller/metal/basic_implicit_render.rb:8:in `send_action`
actionpack (7.2.2.1) lib/abstract_controller/base.rb:226:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/rendering.rb:193:in `process_action`
actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:261:in `block in process_action`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:121:in `block in run_callbacks`
app/controllers/application_controller.rb:427:in `block in with_resolved_locale`
i18n (1.14.7) lib/i18n.rb:353:in `with_locale`
app/controllers/application_controller.rb:427:in `with_resolved_locale`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:130:in `block in run_callbacks`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:141:in `run_callbacks`
actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:260:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/rescue.rb:27:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:77:in `block in process_action`
activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `block in instrument`
activesupport (7.2.2.1) lib/active_support/notifications/instrumenter.rb:58:in `instrument`
activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `instrument`
actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:76:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/params_wrapper.rb:259:in `process_action`
activerecord (7.2.2.1) lib/active_record/railties/controller_runtime.rb:39:in `process_action`
actionpack (7.2.2.1) lib/abstract_controller/base.rb:163:in `process`
actionview (7.2.2.1) lib/action_view/rendering.rb:40:in `process`
rack-mini-profiler (3.3.1) lib/mini_profiler/profiling_methods.rb:115:in `block in profile_method`
actionpack (7.2.2.1) lib/action_controller/metal.rb:252:in `dispatch`
actionpack (7.2.2.1) lib/action_controller/metal.rb:335:in `dispatch`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:67:in `dispatch`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:50:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/routing/mapper.rb:32:in `block in <class:Constraints>`
actionpack (7.2.2.1) lib/action_dispatch/routing/mapper.rb:62:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:53:in `block in serve`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:133:in `block in find_routes`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `each`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `find_routes`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:34:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:896:in `call`
lib/middleware/omniauth_bypass_middleware.rb:35:in `call`
rack (2.2.11) lib/rack/tempfile_reaper.rb:15:in `call`
rack (2.2.11) lib/rack/conditional_get.rb:27:in `call`
rack (2.2.11) lib/rack/head.rb:12:in `call`
actionpack (7.2.2.1) lib/action_dispatch/http/permissions_policy.rb:38:in `call`
lib/content_security_policy/middleware.rb:12:in `call`
lib/middleware/anonymous_cache.rb:409:in `call`
lib/middleware/csp_script_nonce_injector.rb:12:in `call`
config/initializers/008-rack-cors.rb:14:in `call`
rack (2.2.11) lib/rack/session/abstract/id.rb:266:in `context`
rack (2.2.11) lib/rack/session/abstract/id.rb:260:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/cookies.rb:704:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:31:in `block in call`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:101:in `run_callbacks`
actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:30:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/show_exceptions.rb:32:in `call`
logster (2.20.1) lib/logster/middleware/reporter.rb:40:in `call`
railties (7.2.2.1) lib/rails/rack/logger.rb:41:in `call_app`
railties (7.2.2.1) lib/rails/rack/logger.rb:29:in `call`
config/initializers/100-quiet_logger.rb:20:in `call`
config/initializers/100-silence_logger.rb:29:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/request_id.rb:33:in `call`
lib/middleware/enforce_hostname.rb:24:in `call`
rack (2.2.11) lib/rack/method_override.rb:24:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/executor.rb:16:in `call`
rack (2.2.11) lib/rack/sendfile.rb:110:in `call`
rack-mini-profiler (3.3.1) lib/mini_profiler.rb:334:in `call`
lib/middleware/processing_request.rb:12:in `call`
message_bus (4.3.9) lib/message_bus/rack/middleware.rb:60:in `call`
lib/middleware/request_tracker.rb:385:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/remote_ip.rb:96:in `call`
railties (7.2.2.1) lib/rails/engine.rb:535:in `call`
railties (7.2.2.1) lib/rails/railtie.rb:226:in `public_send`
railties (7.2.2.1) lib/rails/railtie.rb:226:in `method_missing`
rack (2.2.11) lib/rack/urlmap.rb:74:in `block in call`
rack (2.2.11) lib/rack/urlmap.rb:58:in `each`
rack (2.2.11) lib/rack/urlmap.rb:58:in `call`
unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client`
unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop`
unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers`
unicorn (6.1.0) lib/unicorn/http_server.rb:143:in `start`
unicorn (6.1.0) bin/unicorn:128:in `<top (required)>`
vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `load`
vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `<main>`
这个 Discourse 安装相对较新,我还没有配置任何 IP 地址阻止。我也是上面的唯一用户。我在 Docker 容器中运行 ollama,但这不应该是个问题;我使用 open-webui(也来自另一个 Docker 容器)与该实例配合使用,运行正常。我使用的是本地 IP 地址而不是“localhost”,但“localhost”的行为也没有任何不同。
感谢您花时间帮助我弄清楚这里发生了什么。
附注:我在 Discourse Docker 容器中安装了 jq,并运行了 curl 命令(用我的本地 IP 地址替换 localhost),它确实从那里运行了——所以容器之间有连接,URL 也是正确的)。
这是我们默认的 SSRF 保护机制在起作用。您可以通过 DISCOURSE_ALLOWED_INTERNAL_HOSTS 环境变量添加例外。
当 Discourse 尝试连接被视为内部的 IP 时,它会被触发。
太好了,解决了——我是通过设置而不是通过环境变量来完成的,但测试现在通过了。再次感谢您的所有帮助!


