【动手学大模型开发】使用Embedding API 做知识嵌入

🌈 嗨,我是青松,很高兴遇到你!

🌟 希望用我的经验,让每个人的AI学习之路走的更容易些~

🔥 专栏:大模型(LLMs)高频面题全面整理(★2025最新版★)| 动手学大模型开发


目录

一、使用OpenAI API

二、使用文心千帆API

三、使用讯飞星火API

尚未开放

四、使用智谱API


本文对应源代码在此处,如需复现可下载运行源代码。

一、使用OpenAI API

GPT有封装好的接口,我们简单封装即可。目前GPT embedding mode有三种,性能如下所示:

  • MTEB得分为embedding model分类、聚类、配对等八个任务的平均得分。
  • MIRACL得分为embedding model在检索任务上的平均得分。

从以上三个embedding model我们可以看出text-embedding-3-large有最好的性能和最贵的价格,当我们搭建的应用需要更好的表现且成本充足的情况下可以使用;text-embedding-3-small有着较好的性能跟价格,当我们预算有限时可以选择该模型;而text-embedding-ada-002是OpenAI上一代的模型,无论在性能还是价格都不如及前两者,因此不推荐使用。

import os
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv


# 读取本地/项目的环境变量。
# find_dotenv()寻找并定位.env文件的路径
# load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中  
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())

# 如果你需要通过代理端口访问,你需要如下配置
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
os.environ["HTTP_PROXY"] = 'http://127.0.0.1:7890'

def openai_embedding(text: str, model: str=None):
    # 获取环境变量 OPENAI_API_KEY
    api_key=os.environ['OPENAI_API_KEY']
    client = OpenAI(api_key=api_key)

    # embedding model:'text-embedding-3-small', 'text-embedding-3-large', 'text-embedding-ada-002'
    if model == None:
        model="text-embedding-3-small"

    response = client.embeddings.create(
        input=text,
        model=model
    )
    return response

response = openai_embedding(text='要生成 embedding 的输入文本,字符串形式。')Copy to clipboardErrorCopied

API返回的数据为json格式,除object向量类型外还有存放数据的data、embedding model 型号model以及本次 token 使用情况usage等数据,具体如下所示:

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422,
        ... (省略)
        -4.547132266452536e-05,
      ],
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}Copy to clipboardErrorCopied

我们可以调用response的object来获取embedding的类型。

print(f'返回的embedding类型为:{response.object}')Copy to clipboardErrorCopied
返回的embedding类型为:listCopy to clipboardErrorCopied

embedding存放在data中,我们可以查看embedding的长度及生成的embedding。

print(f'embedding长度为:{len(response.data[0].embedding)}')
print(f'embedding(前10)为:{response.data[0].embedding[:10]}')Copy to clipboardErrorCopied
embedding长度为:1536
embedding(前10)为:[0.03884002938866615, 0.013516489416360855, -0.0024250170681625605, -0.01655769906938076, 0.024130908772349358, -0.017382603138685226, 0.04206013306975365, 0.011498954147100449, -0.028245486319065094, -0.00674333656206727]Copy to clipboardErrorCopied

我们也可以查看此次embedding的模型及token使用情况。

print(f'本次embedding model为:{response.model}')
print(f'本次token使用情况为:{response.usage}')Copy to clipboardErrorCopied
本次embedding model为:text-embedding-3-small
本次token使用情况为:Usage(prompt_tokens=12, total_tokens=12)Copy to clipboardErrorCopied

二、使用文心千帆API

Embedding-V1是基于百度文心大模型技术的文本表示模型,Access token为调用接口的凭证,使用Embedding-V1时应先凭API Key、Secret Key获取Access token,再通过Access token调用接口来embedding text。同时千帆大模型平台还支持bge-large-zh等embedding model。

import requests
import json

def wenxin_embedding(text: str):
    # 获取环境变量 wenxin_api_key、wenxin_secret_key
    api_key = os.environ['QIANFAN_AK']
    secret_key = os.environ['QIANFAN_SK']

    # 使用API Key、Secret Key向https://aip.baidubce.com/oauth/2.0/token 获取Access token
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={0}&client_secret={1}".format(api_key, secret_key)
    payload = json.dumps("")
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    
    # 通过获取的Access token 来embedding text
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/embeddings/embedding-v1?access_token=" + str(response.json().get("access_token"))
    input = []
    input.append(text)
    payload = json.dumps({
        "input": input
    })
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    return json.loads(response.text)
# text应为List(string)
text = "要生成 embedding 的输入文本,字符串形式。"
response = wenxin_embedding(text=text)Copy to clipboardErrorCopied

Embedding-V1每次embedding除了有单独的id外,还有时间戳记录embedding的时间。

print('本次embedding id为:{}'.format(response['id']))
print('本次embedding产生时间戳为:{}'.format(response['created']))Copy to clipboardErrorCopied
本次embedding id为:as-hvbgfuk29u
本次embedding产生时间戳为:1711435238Copy to clipboardErrorCopied

同样的我们也可以从response中获取embedding的类型和embedding。

print('返回的embedding类型为:{}'.format(response['object']))
print('embedding长度为:{}'.format(len(response['data'][0]['embedding'])))
print('embedding(前10)为:{}'.format(response['data'][0]['embedding'][:10]))Copy to clipboardErrorCopied
返回的embedding类型为:embedding_list
embedding长度为:384
embedding(前10)为:[0.060567744076251984, 0.020958080887794495, 0.053234219551086426, 0.02243831567466259, -0.024505289271473885, -0.09820500761270523, 0.04375714063644409, -0.009092536754906178, -0.020122773945331573, 0.015808865427970886]Copy to clipboardErrorCopied

三、使用讯飞星火API

尚未开放

四、使用智谱API

智谱有封装好的SDK,我们调用即可。

from zhipuai import ZhipuAI
def zhipu_embedding(text: str):

    api_key = os.environ['ZHIPUAI_API_KEY']
    client = ZhipuAI(api_key=api_key)
    response = client.embeddings.create(
        model="embedding-2",
        input=text,
    )
    return response

text = '要生成 embedding 的输入文本,字符串形式。'
response = zhipu_embedding(text=text)Copy to clipboardErrorCopied

response为zhipuai.types.embeddings.EmbeddingsResponded类型,我们可以调用objectdatamodelusage来查看response的embedding类型、embedding、embedding model及使用情况。

print(f'response类型为:{type(response)}')
print(f'embedding类型为:{response.object}')
print(f'生成embedding的model为:{response.model}')
print(f'生成的embedding长度为:{len(response.data[0].embedding)}')
print(f'embedding(前10)为: {response.data[0].embedding[:10]}')Copy to clipboardErrorCopied
response类型为:<class 'zhipuai.types.embeddings.EmbeddingsResponded'>
embedding类型为:list
生成embedding的model为:embedding-2
生成的embedding长度为:1024
embedding(前10)为: [0.017892399802803993, 0.0644201710820198, -0.009342825971543789, 0.02707476168870926, 0.004067837726324797, -0.05597858875989914, -0.04223804175853729, -0.03003198653459549, -0.016357755288481712, 0.06777040660381317]Copy to clipboardErrorCopied

本文对应源代码在此处,如需复现可下载运行源代码。

### Dify 配置模型 API 网络服务错误解决方案 在网络服务配置过程中,如果遇到类似于 `HTTPConnectionPool` 的连接错误[^2],通常表明客户端无法成功建立与目标服务器的通信。以下是可能的原因以及对应的解决方法: #### 1. **检查本地服务状态** 如果报错显示 `[Errno 111] Connection refused`,这说明请求的目标地址未启动监听服务或者端口被占用。需确认以下几点: - 确认昇腾服务器上的 embedding 和 rerank 模型服务已正常运行。 - 使用命令行工具验证服务是否可用,例如执行如下命令测试端口连通性: ```bash curl http://127.0.0.1:11434/api/generate ``` #### 2. **API Key 设置问题** 在某些情况下,即使随意填写一个无效的 API Key(如 `123456`),也可能暂时绕过校验并完成设置[^1]。然而,这种行为并不意味着实际认证机制失效,而是可能存在默认允许策略或调试模式启用的情况。建议采取以下措施: - 查阅官方文档获取合法有效的 API Key 并替换当前占位符值; - 若仍存在问题,则联系技术支持团队进一步排查。 #### 3. **防火墙/SELinux 影响** Linux 系统中的安全模块可能会阻止外部访问特定程序实例。可以通过调整规则来解除限制: - 关闭 SELinux 或将其设为宽容模式(Permissive Mode)以排除干扰因素; - 添加例外规则允许指定进程绑定至公网接口而非仅限于 localhost 地址范围。 #### 4. **资源不足引发超时异常** 当尝试多次重试却始终失败时,可能是由于硬件性能瓶颈所致。此时应考虑优化资源配置方案: - 增加内存分配量给容器镜像文件; - 调整线程池大小参数适应高并发需求场景下的负载均衡表现; ```python import requests url = "http://localhost:11434/api/generate" payload = {"text": "example input"} headers = {'Content-Type': 'application/json'} try: response = requests.post(url, json=payload, headers=headers) print(response.json()) except Exception as e: print(f"Request failed due to {e}") ``` 上述脚本可用于初步诊断是否存在其他潜在隐患点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值