'''
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'
当我们在程序中增加这个命令,程序就可以正常运行了。