# 让Discourse AI在本地与Ollama协作

**URL:** <https://meta.discourse.org/t/getting-discourse-ai-to-work-with-ollama-locally/353614>\
**Category:** Product Support\
**Tags:** ai\
**Created:** [2025 年2 月 18 日 21:15 UTC](https://meta.discourse.org/t/getting-discourse-ai-to-work-with-ollama-locally/353614 "2025-02-18T21:15:24Z")\
**Posts on this page:** 1\
**Showing post:** 12

<div class="post-metadata">

作者： ![hendersj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hendersj/32/507887_2.png) [@hendersj](https://meta.discourse.org/u/hendersj)\
发布日期： [2025 年2 月 20 日 19:13 UTC](https://meta.discourse.org/t/getting-discourse-ai-to-work-with-ollama-locally/353614/12 "2025-02-20T19:13:24Z")

</div>

感谢测试。

我注意到我的配置中多了一个选项（禁用流式补全）。是否可能是模型选择导致了我遇到的问题？（我安装了 deepseek-r1:32b）。

```plaintext
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'`

```plaintext
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 也是正确的）。

---

_[View the full topic](https://meta.discourse.org/t/getting-discourse-ai-to-work-with-ollama-locally/353614)._
