python调用ollama.client读取本地向量数据库实现问答。解决503报错!

'''
rzb
2025-7-20
用于演示ollama调用客户端的方法
读取本地向量数据库,使用指定的向量模型生成输入文本的嵌入,
'''


import ollama
import chromadb

import os
# os.environ['NO_PROXY'] = '127.0.0.1,localhost'

# 初始化 Ollama 客户端
client_ollama = ollama.Client(host='http://127.0.0.1:11434')


# 设定向量数据库路径
vector_db_path = "D:/pythonProject/openwebui/chroma_db_20230728"

# 初始化 ChromaDB 客户端
client_chromadb = chromadb.PersistentClient(path=vector_db_path)
collection = client_chromadb.get_collection("docs")  # 选择存储的文档集合

input_question = input("请输入问题:")

# 生成输入文本的嵌入
response  = client_ollama.embed(model="quentinz/bge-large-zh-v1.5:latest",  # 使用指定的向量模型
                                input=input_question
                                )

results = collection.query(query_embeddings=response["embeddings"],
                           n_results=10
                           )

response = client_ollama.generate(
        model="deepseek-r1:14b",
        prompt=f''' 
                    【用户问题】:
                    {input_question}
                    【本次素材】:
                    {results}
                    
                    结合所有【历史对话】、【用户问题】、【本次素材】,回答【最新问题】。回答的格式如下:
                    【回答】:整理关键信息,回答问题。具体要求为:
                    (1)回答内容要概括、简明扼要,针对问题。
                    (2)不要脱离任何上下文的内容,不要用任何模型的预训练知识。
                    (3)如果不知道,就明确说不知道.
                    (4)默认都是对普通机动车和驾驶人的问题,答案也是围绕普通机动车和驾驶人。
                    (5)摩托车、拖拉机等特殊车辆和驾驶人会特别说明。
                    (6)尽量保留【本次素材】中的法律原文并给出第几条,给出一个严谨的答案。
                ''',
        stream=True
    )
for chunk in response:
    print(chunk["response"], end="", flush=True)  # 逐词输出

这个代码可以很清楚的展示如何使用python调用ollama.client,确定ollama的具体服务IP端口,然后读取本地向量数据库,最后对输入的问题进行回答的过程。

个别的情况

当我们使用网络,有时候会提示错误:

Traceback (most recent call last):
  File "D:\pythonProject\openwebui\test.py", line 29, in <module>
    response  = client_ollama.embed(model="quentinz/bge-large-zh-v1.5:latest",  # 使用指定的向量模型
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\CondaEnv\openwebui\Lib\site-packages\ollama\_client.py", line 357, in embed
    return self._request(
           ^^^^^^^^^^^^^^
  File "D:\CondaEnv\openwebui\Lib\site-packages\ollama\_client.py", line 178, in _request
    return cls(**self._request_raw(*args, **kwargs).json())
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\CondaEnv\openwebui\Lib\site-packages\ollama\_client.py", line 122, in _request_raw
    raise ResponseError(e.response.text, e.response.status_code) from None
ollama._types.ResponseError:  (status code: 503)

可以看出,在使用client调用本地模型的时候,就报网络错误,经查询,503 Service Unavailable 错误通常表示服务器在处理请求时遇到问题。

出现这个问题最常见原因是你的 HTTP 请求走了全局或者whitelist代理,这导致访问本地 127.0.0.1:11434 时被代理拦截或返回 Service Unavailable。Ollama 本地服务本应直连,不走代理。
我们可以在命令行中输入以下命令来解决:

$env:NO_PROXY = "127.0.0.1,localhost"
python your_script.py

另外,最简单的,我们可以在python代码中声明操作系统的环境变量:

import os
os.environ['NO_PROXY'] = '127.0.0.1,localhost'

当我们在程序中增加这个命令,程序就可以正常运行了。