基于Ollama和AnythingLLM的API调用(局域网内可用)
上篇博客中,尝试Windows本地部署Ollama+DeepSeek-R1-7b+AnythingLLM,成功实现了本地知识库的检索。实际使用中,往往将DeepSeek装在性能好的机器上,其他机器只需远程访问。因此,本文将讨论如何调用API。以上就是利用Ollama和AnythingLLM的API调用的内容。笔者在实际使用中,发现了一些问题:第一,sources会跟随问答传递,如果sources数
文章目录
前言
上篇博客中,尝试Windows本地部署Ollama+DeepSeek-R1-7b+AnythingLLM,成功实现了本地知识库的检索。实际使用中,往往将DeepSeek装在性能好的机器上,其他机器只需远程访问。因此,本文将讨论如何调用API。
一、Ollama的API
1.配置
1.1 环境变量
为了实现远程访问,需要在环境变量中新建以下指令,以允许Ollama在局域网内被访问:
OLLAMA_HOST "0.0.0.0"
OLLAMA_ORIGINS "*"
重启Ollama服务
1.2 服务器的防火墙开放端口
为了实现在局域网内,供他人使用,需要将Ollama的端口开放。步骤如下:
步骤一、打开防火墙和网络保护,并进入高级设置
步骤二、点击入站规则并新建规则
步骤三、开放端口
规则类型选择“端口”,下一页
协议和端口选择TCP,特定本地端口填入11434(一般默认是这个),下一页,下一页,下一页,最后名字自取
2.使用
在客户端上(台式机A),尝试使用python调用服务器(台式机B)上的Ollama的api(当然要保证服务器上的Ollama处于正常运行)
import requests
url = "http://your_ip:11434/api/generate" # your_ip 替换为 Ollama 所在的服务器 IP
payload = {
"model": "deepseek-r1:7b",
"prompt": "请介绍一下自己?",
"stream": False
}
response = requests.post(url, json=payload)
if response.ok:
print("API 响应:" + response.text)
else:
print(f"请求失败,状态码:{response.status_code}")
运行结果:
二、AnythingLLM的API调用
1.配置
1.1进入软件设置,打开可被LAN访问选项,然后重启软件
在PowerShell中输入下行指令,以查看是否设置成功。如果有0.0.0.0:3001,说明成功
netstat -ano | Select-String ":3001"
1.2服务器的防火墙开放端口
步骤和Ollama的一样,只不过将端口号改成3001。另外注意将下图红框中的两个AnythingLLM规则禁用,不然其他机器无法使用api,会报network error(找了一下午才找出原因。。。)
【2025.3.7更新】今天换了下服务器的ip又出现网络问题,所以提供一个最新的解决方法。有时候规则生效需要重启防火墙,在powershell中,重新启动防火墙:
netsh advfirewall reset
上述指令的潜在风险:
–丢失自定义规则 :执行此命令后,所有手动配置的防火墙规则都会被删除,无法恢复。因此,在运行之前建议备份现有规则 。
–影响网络连接 :如果某些应用程序依赖于特定的防火墙规则(如开放端口),这些规则在重置后将失效,可能导致应用程序无法正常工作。
然后重新放行 3001 端口:
netsh advfirewall firewall add rule name="Allow 3001" dir=in action=allow protocol=TCP localport=3001
2.使用
在客户端上(台式机A),尝试使用python调用服务器(台式机B)上的AnythingLLM的api:
import requests
def ask_anythingllm(question, slug, api_key):
url = f"http://your_ip:3001/api/v1/workspace/{slug}/chat" #替换成你自己的服务器ip
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"accept": "application/json"
}
data = {
"message": question,
"mode": "chat" # 可选chat/query模式
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
# 提取有效回答(去除思考过程)
answer = result['textResponse'].split('</think>')[-1].strip()
sources = result.get('sources', [])
return answer, sources
else:
return f"Error: {response.text}", []
# 示例调用
api_key = "apikey" #替换成你自己的apikey
slug = "test12"
question = "2025年3月4日的头条新闻有哪些"
answer, sources = ask_anythingllm(question, slug, api_key)
print("回答:", answer)
print("来源:", [src['title'] for src in sources])
结果如下:
3.关于AnythingLLM的api详解
参考文献:https://zhuanlan.zhihu.com/p/24228685499
AnythingLLM的官方文档提供了api:
3.1 首先需要生成密匙,然后点击绿色的Authorize登陆:
3.2 列出所有的workspace并找到slug:
3.3 在一个workspace中进行chat
响应:
总结
以上就是利用Ollama和AnythingLLM的API调用的内容。笔者在实际使用中,发现了一些问题:
第一,sources会跟随问答传递,如果sources数据量很大,就麻烦了;
第二,前端调用api时,对于同一个对话的上下文,需要进一步优化;
第三,对于本文使用的deepseek-r1:7b模型,当你问的问题多了,后面他会胡乱作答,答非所问。
更多推荐
所有评论(0)