langchain4j [BUG] 在摄取阶段无效的嵌入API调用

nr9pn0ug  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(174)

描述bug

我尝试通过OpenAI嵌入模型text-embedding-ada-002(设置为默认)使用parsing -> splitting -> ingesting PDF文档进行重现,并遇到了以下异常:
**Caused by: dev.ai4j.openai4j.OpenAiHttpException:**

{
  "error": {
    "message": "'$.input' is invalid. Please check the API reference: https://platform.openai.com/docs/api-reference.",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

初始PDF文档大小为10.7 MB,
Langchain4j的Document类大小为4.4 MB
块大小:1000
块数量:2300

日志和堆栈跟踪

https://gist.github.com/OTR/aab5b0d1918dd2be709e554a3cf30d52

重现方法

pom.xml:

https://gist.github.com/OTR/7b1617757068fcf957a93551f13cbb39

重现代码片段:

https://gist.github.com/OTR/46475c3ab6b856e733d592a493768538
在第46行失败:storeIngestor.ingest(document);

预期行为

应该正确地摄取和检索,我尝试使用不同的PDF(一个是500 KB,另一个是12.2 MB,它们都处理得很好)运行相同的代码。

请补充以下信息:

  • LangChain4j版本:0.27.1
  • Java版本:17

依赖项:

https://gist.github.com/OTR/b820d63973bfd6b0e3c16fa1e31bc17e

其他上下文

我尝试使用调试器检查,这是我能够在异常之前设置断点的最后一行:
langchain4j/langchain4j-open-ai/src/main/java/dev/langchain4j/model/openai/OpenAiEmbeddingModel.java
第91行中的3e43248 | | EmbeddingRequestrequest = EmbeddingRequest.builder() |
或者截图上的第58行:

vohkndzv

vohkndzv1#

感谢OTR的报告和详细的错误描述!
似乎在Document和/或TextSegments(拆分后)存在一些问题。请问您能否提供PDF或者查看Document加载后的内部内容以及List<String> textsembedTexts方法中的信息?谢谢!

zc0qhyus

zc0qhyus2#

这个bug与segments的大小(一个TextSegments的列表)有关。我在类EmbeddingStoreIngestor的方法public void ingest(List<Document> documents)中设置了一个断点,或者在截图的第53行。

然后我尝试使用二分查找来定位引发异常的特定TextSegment,首先在运行时将segments变量重新分配给它的前半部分,然后释放执行,然后将其重新分配为后半部分并释放执行。

结果发现,列表的每一半都可以单独正常工作。但是整个段列表会导致异常。

接下来,我尝试了不同的子列表组合segments。假设整个列表的大小为2293个元素,那么subList方法的参数和测试结果如下表所示:

结果起始索引结束索引
✔️01146
✔️11462293
✔️02000
✔️02025
✔️02037
✔️02042
✔️02046
✔️02048
x02049
x02050
x02100

文档分割器的参数与我在源代码sample中提到的相同。

相关问题