0 前言

最近尝试使用LangChain来接入国内的大模型,如通义千问,接入聊天模型时很顺利,但是尝试使用向量模型就死活跑不通,去问LangChain官网的AI助手也给不出解决方案,报错如下:

openai.BadRequestError: Error code: 400 - {'error': {'message': 'contents is neither str nor list of str.: payload.input.contents', 'type': 'InvalidParameter', 'param': None, 'code': 'InvalidParameter'}, 'id': '6888b4e3-f57a-437f-a605-0ef1608107ca', 'request_id': '6888b4e3-f57a-437f-a605-0ef1608107ca'}

1 报错的代码

import os
from langchain_community.vectorstores import Chroma

import dotenv
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

dotenv.load_dotenv()

os.environ["OPENAI_BASE_URL"] = os.getenv("QWEN_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("QWEN_API_KEY")

# 获取对话模型
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-v2",
)
# 定义示例组
examples = [{"question": "地球是什么形状的?", "answers": "地球是一个两极稍扁、赤道略鼓的不规则球体"},
            {"question": "水的化学式是什么?", "answers": "水的化学式是 H₂O"},
            {"question": "世界上最高的山峰是什么?", "answers": "世界上最高的山峰是珠穆朗玛峰"},
            {"question": "一年有几个季节?", "answers": "一年有四个季节,分别是春季、夏季、秋季和冬季"},
            {"question": "计算机的基本组成部分有哪些?",
             "answers": "计算机的基本组成部分包括硬件系统和软件系统,硬件系统主要有中央处理器、存储器、输入设备和输出设备"}]

# 定义示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    # 示例列表
    examples=examples,
    # 嵌入模型
    embeddings=embeddings_model,
    # 向量数据库
    vectorstore_cls=Chroma,
    # 生成的示例数量
    k=1
)

question = "世界上哪座山最高?"
selected_example = example_selector.select_examples({"question": question})
print(f"最相近的示例: {selected_example}")

2 解决方案

在大模型构造方法的参数中加入check_embedding_ctx_length=False,如下

# 获取对话模型
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-v2",
    check_embedding_ctx_length=False
)

具体原因也不太确定,这个参数似乎是用于跳过长度检查,但是不知道这个和报错说的无效参数有啥关系,但最终代码成功跑通。

3 运行效果

请添加图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐