55 カスタム・ドキュメント・ローダー
特殊なユース・ケースの場合、ユーザーは特定のニーズに合せたカスタム・ドキュメント・ローダーを定義できます。
カスタム・ドキュメント・ローダーを実装するには、`com.oracle.coherence.rag.DocumentLoader`インタフェースを実装するCDI Beanを作成し、`@Named`クラス注釈を介して処理するURIプロトコルの名前を指定する必要があります。
`load`メソッドは指定された`uri`の内容に基づいてドキュメントをフェッチし、注入された`DocumentParser`を使用して解析し、抽出されたテキストおよびメタデータを含むLangChain4J `dev.langchain4j.data.document.Document`のインスタンスを返します。
例として、前述のすべてを実行する`OciObjectStorageDocumentLoader`の実際の実装を次に示します:
java
@Named("oci.os")
@ApplicationScoped
public class OciObjectStorageDocumentLoader
implements DocumentLoader
{
@Inject
DocumentParser documentParser; // <1>
@Inject
ObjectStorageClient client; // <2>
public Document load(URI uri)
{
String ns = uri.getHost();
Path path = Path.of(uri.getPath());
String bucket = path.getName(0).toString();
String object = path.subpath(1, path.getNameCount()).toString();
var request = GetObjectRequest.builder() // <3>
.namespaceName(ns)
.bucketName(bucket)
.objectName(object)
.build();
var response = client.getObject(request); // <4>
var source = new DocumentSource() // <5>
{
public InputStream inputStream() throws IOException
{
return response.getInputStream(); // <6>
}
public Metadata metadata()
{
var metadata = Metadata.metadata("url", uri.toString()); // <7>
metadata.put("ns", ns);
metadata.put("bucket", bucket);
metadata.put("object", object);
metadata.put("content_type", response.getContentType());
metadata.put("content_md5", response.getContentMd5());
metadata.put("content_length", response.getContentLength());
return metadata;
}
};
return dev.langchain4j.data.document.DocumentLoader.load(source, documentParser); // <8>
}
}
- 使用する`DocumentParser`はストア構成に基づいて注入されます
- `ObjectStorageClient`は構成に基づいて作成および注入されます
- 指定された`uri`からの情報に基づいて`GetObjectRequest`を作成します
- リクエストを実行し、サービスからレスポンスを取得します
- ドキュメント・コンテンツおよびメタデータへのアクセスに使用するLangChain4J `DocumentSource`を作成します
- レスポンスからドキュメント・コンテンツを返します
- レスポンスに基づいてドキュメント・メタデータを作成します
- ステップ#5で作成した`DocumentSource`から`Document`のインスタンスを作成します。注入された`DocumentParser`を使用して、ドキュメント・コンテンツからテキストを抽出します。