一句话:
由于AI练中学环境的网络限制,LangChain暂时无法调用HuggingFace模型,需要在本地环境中运行才能成功。
问题描述
当我在运行03文件夹下的04_ModelIO_HuggingFace示例代码时,发现存在如下的报错
很显然这是一个网络连接问题,我的第一个想法就是HuggingFace是需要魔法才能使用。但是当我把梯子挂上再运行这段代码,发现依然还是同样的报错。
我首先尝试langchain_huggingface模块中的HuggingFaceEndpoint类来调用模型,这个类的实例化能够显示是否成功调用了HuggingFace的api。
在运行之后返回发现调用是成功的,所以不是这里的问题。于是我先尝试了一段代码来测试代理连接:
import subprocess
import re
import requests
import platform
import os
def get_system_proxy_settings():
"""获取系统代理设置"""
print("=== 系统代理设置检测 ===\n")
try:
# 获取 Windows 代理设置
import winreg
def get_windows_proxy_settings():
proxy_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
key = winreg.OpenKey(
winreg.HKEY_CURRENT_USER, proxy_path, 0, winreg.KEY_ALL_ACCESS
)
try:
proxy_enable = winreg.QueryValueEx(key, "ProxyEnable")[0]
if proxy_enable:
proxy_server = winreg.QueryValueEx(key, "ProxyServer")[0]
return proxy_server
except WindowsError:
pass
finally:
winreg.CloseKey(key)
return None
proxy_settings = get_windows_proxy_settings()
if proxy_settings:
print(f"Windows 系统代理: {proxy_settings}")
return proxy_settings
except Exception as e:
print(f"获取 Windows 代理设置失败: {e}")
print("未找到系统代理设置")
return None
def test_proxy(proxy_string):
"""测试代理配置"""
if not proxy_string:
return False
# 解析代理字符串
if "://" in proxy_string:
proxy_url = proxy_string
else:
proxy_url = f"http://{proxy_string}"
proxies = {"http": proxy_url, "https": proxy_url}
print(f"\n测试代理: {proxy_url}")
try:
response = requests.get("http://ip-api.com/json/", proxies=proxies, timeout=5)
if response.status_code == 200:
data = response.json()
print("\n代理测试成功:")
print(f"IP: {data.get('query')}")
print(f"位置: {data.get('country')}, {data.get('city')}")
return True
except Exception as e:
print(f"代理测试失败: {e}")
return False
def check_common_proxy_ports():
"""检查常见代理端口"""
print("\n=== 检查常见代理端口 ===")
common_ports = [
1080, # 默认 SOCKS 代理端口
7890, # Clash 默认端口
8080, # 常用 HTTP 代理端口
8118, # Privoxy 默认端口
1087, # 部分 VPN 客户端默认端口
1088, # 部分 VPN 客户端默认端口
8888, # 常用代理端口
9090, # 常用代理端口
]
for port in common_ports:
proxies = {
"http": f"http://127.0.0.1:{port}",
"https": f"http://127.0.0.1:{port}",
}
try:
response = requests.get(
"http://ip-api.com/json/", proxies=proxies, timeout=2
)
if response.status_code == 200:
data = response.json()
print(f"\n端口 {port} 可用:")
print(f"IP: {data.get('query')}")
print(f"位置: {data.get('country')}, {data.get('city')}")
return f"127.0.0.1:{port}"
except:
print(f"端口 {port} 不可用")
return None
if __name__ == "__main__":
# 1. 获取系统代理设置
proxy_string = get_system_proxy_settings()
# 2. 如果找到系统代理,测试它
if proxy_string and test_proxy(proxy_string):
print("\n系统代理可用")
else:
print("\n系统代理不可用或未找到")
# 3. 检查常见代理端口
print("\n尝试检查常见代理端口...")
working_proxy = check_common_proxy_ports()
if working_proxy:
print(f"\n找到可用代理: {working_proxy}")
else:
print("\n未找到可用代理")
首先我在AI练中学中的环境运行了一下,结果返回失败:
然后我又尝试了一下在本地环境,结果返回成功:
这说明在AI练中学环境中,系统代理设置不可用,且常见代理端口均不可用,这表明环境对网络访问进行了限制。于是我决定改为在本地环境运行。(如何把AI练中学项目部署到本地的操作我就不再赘述,已经有了相关教程)
再部署并配置完后重新运行代码:
结果显示成功,但是代码中使用的google/flan-t5-large模型的生成内容确实有点难评。
于是我尝试了HuggingFace上的其他模型,以下是使用模型mistralai/Mistral-7B-Instruct-v0.2生成的结果:
结果似乎不错,但是细看就会发现也有点问题,模型把售价的50理解成了数量。
让我们修改一下prompt:
这次的结果就很让人满意了。
总结
在AI练中学环境中暂时无法使用LangChain调用HuggingFace模型,主要是由于环境限制导致代理配置问题。通过将环境迁移到本地,配置必要的包、Token和代理设置后,可以成功实现模型调用。