ValueError: Expected EmbeddingFunction.__call__ to have the following signature

题意:

使用 langchain 时,特别是在定义或调用嵌入函数(Embedding Function)时,签名(函数的参数列表和返回类型)不符合预期

问题背景:

When I try to pass a Chroma Client to Langchain that uses OpenAIEmbeddings, I get a ValueError:

当我尝试将一个使用 OpenAIEmbeddings 的 Chroma Client 传递给 Langchain 时,我遇到了一个 ValueError:

ValueError: Expected EmbeddingFunction.__call__ to have the following signature: odict_keys(['self', 'input']), got odict_keys(['self', 'args', 'kwargs'])

How do I resolve this error?        怎样处理这个错误?

The error seems to be related to the fact that langchain's embedding function implementation doesn't meet the new requirements introduced by Chroma's latest update because the issue showed up after upgrading Chroma.

在升级 Chroma 之后出现的问题表明,langchain 的嵌入函数实现不符合 Chroma 最新更新引入的新要求。

My code:

import chromadb
from langchain_openai import OpenAIEmbeddings
client = chromadb.PersistentClient()
collection = client.get_or_create_collection(name='chroma', embedding_function=OpenAIEmbeddings()
)

I have langchain==0.1.1, langchain-openai==0.0.3 and chromadb==0.4.22. Looking into github issues, it seems downgrading chromadb to 0.4.15 solves the issue but since these libraries will upgrade even more in the coming months, I don't want to downgrade chroma but find a solution that works in the current version.

我当前使用的库版本是 langchain==0.1.1, langchain-openai==0.0.3 和 chromadb==0.4.22。在查看 GitHub 上的问题时,似乎将 chromadb 降级到 0.4.15 可以解决这个问题。但是,由于这些库在未来几个月内会进一步升级,我不想降级 chromadb,而是想找到一个在当前版本中也能工作的解决方案。

问题解决:

Since version 0.4.16(?), Chroma requires an embedding model that defines a __call__() method that returns list of embeddings. It says as much in the migrations link shown in the error.

从版本 0.4.16(?)开始,Chroma 要求嵌入模型定义一个 __call__() 方法,该方法返回嵌入列表。错误中显示的迁移链接中明确指出了这一点。

Given that we need a method that returns a list of embeddings and it's already defined in OpenAIEmbeddings (embed_documents()), the easiest solution I found was to create a custom class that inherits from OpenAIEmbeddings wherein a __call__ method that triggers a call to OpenAIEmbeddings.embed_documents is defined.

鉴于我们需要一个返回嵌入列表的方法,并且这个方法已经在 OpenAIEmbeddings(embed_documents())中定义,我发现的最简单的解决方案是创建一个继承自 OpenAIEmbeddings 的自定义类,并在其中定义一个 __call__ 方法,该方法触发对 OpenAIEmbeddings.embed_documents 的调用。

A small note: Unless you stored your OpenAI API Key in your .env file, you'll probably need to pass it as openai_api_key parameter.

一个小提示:除非你已经将你的 OpenAI API 密钥存储在 .env 文件中,否则你可能需要将其作为 openai_api_key 参数传递。

import chromadb
from langchain_openai import OpenAIEmbeddingsclass CustomOpenAIEmbeddings(OpenAIEmbeddings):def __init__(self, openai_api_key, *args, **kwargs):super().__init__(openai_api_key=openai_api_key, *args, **kwargs)def _embed_documents(self, texts):return super().embed_documents(texts)  # <--- use OpenAIEmbedding's embedding functiondef __call__(self, input):return self._embed_documents(input)    # <--- get the embeddingsclient = chromadb.PersistentClient()
collection = client.get_or_create_collection(name='chroma', embedding_function=CustomOpenAIEmbeddings(openai_api_key="your very secret OpenAI api key")         # <-- pass the new object instead of OpenAIEmbeddings()
)

Using OpenAI's Embedding object also works too (which can be accessed via self.client). Basically we can define CustomOpenAIEmbeddings like below by invoking the Embedding.create() method in a loop like in this example use case.

使用 OpenAI 的 Embedding 对象也是可行的(可以通过 self.client 访问)。基本上,我们可以通过在循环中调用 Embedding.create() 方法(如本示例用例中所示)来定义 CustomOpenAIEmbeddings,如下所示:

class CustomOpenAIEmbeddings(OpenAIEmbeddings):def __init__(self, openai_api_key, *args, **kwargs):super().__init__(openai_api_key=openai_api_key, *args, **kwargs)def _embed_documents(self, texts):embeddings = [self.client.create(input=text, model="text-embedding-ada-002").data[0].embedding for text in texts]return embeddingsdef __call__(self, input):return self._embed_documents(input)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建论坛和mysql数据库安装和php安装

目录 概念 步骤 安装mysql8.0.30 安装php 安装Discuz 概念 搭建论坛的架构&#xff1a; lnmpDISCUZ l 表示linux操作系统 n 表示nginx前端页面的web服务 m 表示 mysql 数据库 用来保存用户和密码以及论坛的相关内容 p 表示php 动态请求转发的中间件 步骤 &#xff…

【C++深度探索】:继承(定义赋值兼容转换作用域派生类的默认成员函数)

✨ 愿随夫子天坛上&#xff0c;闲与仙人扫落花 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞…

CVE-2024-0603 漏洞复现

CVE-2024-0603 源码&#xff1a;https://gitee.com/dazensun/zhicms 开题&#xff1a; CVE-2024-0603描述&#xff1a;ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化&#xff0c;从而远程…

python脚本“文档”撰写——“诱骗”ai撰写“火火的动态”python“自动”脚本文档

“火火的动态”python“自动”脚本文档&#xff0c;又从ai学习搭子那儿“套”来&#xff0c;可谓良心质量&#x1f44d;&#x1f44d;。 (笔记模板由python脚本于2024年07月07日 15:15:33创建&#xff0c;本篇笔记适合喜欢钻研python和页面源码的coder翻阅) 【学习的细节是欢悦…

【学习笔记】程序设计竞赛

程序设计竞赛 文章目录 程序设计竞赛0x00 基本操作指南0x01 算法分析0x02 STL和基本数据结构栈队列集合map 0x03 排序插入排序归并排序&#xff08;Merge Sort)快速排序 0x04 搜索技术BFSDFS回溯与剪枝 深度迭代ID A*A star双向广搜 0x05 递推方程0x06 高级数据结构并查集二叉树…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

17.优化算法之解决拓扑排序4

0.基础 1.课程表1 207. 课程表 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canFinish(int n, int[][] p) {// 1. 准备⼯作int[] in new int[n]; // 统计每⼀个顶点的⼊度Map<Integer, List<Integer>> edges new HashMap<>…

第六十周:文献精读

目录 摘要 Abstract 文献阅读&#xff1a;可解释多水平时间序列预测的时间融合Transformer 一、多水平预测&#xff08;Multi-horizon forecasting&#xff09; 二、过去相关研究 三、现存问题 四、提出方法 五、模型架构 1、门控残差网络(GRN) 2、变量选择网络 3、…

android中activity与fragment之间的各种跳转

我们以音乐播放、视频播放、用户注册与登录为例【Musicfragment&#xff08;音乐列表页&#xff09;、Videofragment&#xff08;视频列表页&#xff09;、MusicAvtivity&#xff08;音乐详情页&#xff09;、VideoFragment&#xff08;视频详情页&#xff09;、LoginActivity&…

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径&#xff1a;/admin/student 请求方法&#xff1a;POST 请求参数&#xff1a;请求头&#xff1a;Headers&#xff1a;"Content-Type": "application/json" 请求体&#xff1a;Body&#xff1a; id 学生id …

OneFormer

按照INSTALL.md无法安装natten&#xff0c;不建议复现

1120 买地攻略

solution 土地需要连续&#xff0c;联想到用前缀和。用前缀和表示前i块土地的总价钱&#xff0c;易得任意片连续的土地价格 #include<iostream> using namespace std; const int maxn 1e4 10; int main(){int n, m, price[maxn] {0}, ans 0;scanf("%d%d"…

IT高手修炼手册(4)PowerShell命令

一、前言 PowerShell是一个功能强大的命令行界面和脚本环境&#xff0c;它允许用户管理Windows操作系统和应用程序。 二、文件和目录操作 Get-ChildItem&#xff1a;列出指定路径下的文件和文件夹。简写为ls或dir。 Copy-Item&#xff1a;复制文件和文件夹。简写为copy或cp。 M…

python基础篇(8):异常处理

在Python编程中&#xff0c;异常是程序运行时发生的错误&#xff0c;它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误&#xff0c;并进行适当的处理&#xff0c;从而避免程序崩溃。 1 错误类型 代码的错误一般会有语法错误和异常错误两种&#xff0c;语法错…

数据统计与数据分组18-25题(30 天 Pandas 挑战)

数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水&#xff08;数据统计&#xff09…

ESP32CAM物联网教学10

ESP32CAM物联网教学10 MicroPython 应用体验 小智偶然地发现&#xff0c;有一种新兴的编程模式MicroPython&#xff0c;也能编写ESP32Cam的应用程序了&#xff0c;于是欣然地体验了一把。 编程环境搭建 小智偶然地从下面这家店铺买了一块ESP32Cam&#xff0c;并从客服那里得到…

Angular基础保姆级教程 - 1

Angular 基础总结&#xff08;完结版&#xff09; 1. 概述 Angular 是一个使用 HTML、CSS、TypeScript 构建客户端应用的框架&#xff0c;用来构建单页应用程序。 Angular 是一个重量级的框架&#xff0c;内部集成了大量开箱即用的功能模块。 Angular 为大型应用开发而设计…

花所Flower非小号排名20名下载花所Flower

1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台&#xff0c;致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名&#xff0c;为用户提供多样化的数字资产交易服务&#xff0c;涵盖了主流和新兴数字货币的交易需求。 2. Flowe…

怎样让家长单独查到自己孩子的期末成绩?

期末考试的钟声已经敲响&#xff0c;随着最后一份试卷的收卷&#xff0c;学生们的紧张情绪渐渐平息。然而&#xff0c;对于老师们来说&#xff0c;这仅仅是另一个忙碌周期的开始。成绩的统计、分析、反馈&#xff0c;每一项工作都不容小觑。尤其是将成绩单一一私信给家长&#…

计算机图形学bezier曲线曲面B样条曲线曲面

b站视频 文章目录 曲线曲面基本理论曲线&#xff08;面&#xff09;参数表示1、显示、隐式和参数表示2、显式或隐式表示存在的问题3、参数方程 曲线曲面基本理论 计算机图形学三大块内容:光栅图形显示、几何造型技术、真实感图形显示。光栅图形学是图形学的基础&#xff0c;有…