LangChain实战课AI练中学:调用HuggingFace模型 | 豆包MarsCode AI刷题

122 阅读4分钟

一句话:

由于AI练中学环境的网络限制,LangChain暂时无法调用HuggingFace模型,需要在本地环境中运行才能成功。

问题描述

当我在运行03文件夹下的04_ModelIO_HuggingFace示例代码时,发现存在如下的报错

image.png

很显然这是一个网络连接问题,我的第一个想法就是HuggingFace是需要魔法才能使用。但是当我把梯子挂上再运行这段代码,发现依然还是同样的报错。

我首先尝试langchain_huggingface模块中的HuggingFaceEndpoint类来调用模型,这个类的实例化能够显示是否成功调用了HuggingFace的api。

image.png

在运行之后返回发现调用是成功的,所以不是这里的问题。于是我先尝试了一段代码来测试代理连接:

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练中学中的环境运行了一下,结果返回失败:

image.png

然后我又尝试了一下在本地环境,结果返回成功:

image.png

这说明在AI练中学环境中,系统代理设置不可用,且常见代理端口均不可用,这表明环境对网络访问进行了限制。于是我决定改为在本地环境运行。(如何把AI练中学项目部署到本地的操作我就不再赘述,已经有了相关教程)

再部署并配置完后重新运行代码:

image.png

结果显示成功,但是代码中使用的google/flan-t5-large模型的生成内容确实有点难评。

于是我尝试了HuggingFace上的其他模型,以下是使用模型mistralai/Mistral-7B-Instruct-v0.2生成的结果:

image.png

结果似乎不错,但是细看就会发现也有点问题,模型把售价的50理解成了数量。

让我们修改一下prompt:

image.png

这次的结果就很让人满意了。

总结

在AI练中学环境中暂时无法使用LangChain调用HuggingFace模型,主要是由于环境限制导致代理配置问题。通过将环境迁移到本地,配置必要的包、Token和代理设置后,可以成功实现模型调用。