Skip to content

Add MetalRetriever #613

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions docs/docs/modules/indexes/retrievers/metal-retriever.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Remote Retriever

This example shows how to use the Metal Retriever in a `RetrievalQAChain` to retrieve documents from Metal index.

## Setup

```bash npm2yarn
npm i @getmetal/metal-sdk
```

## Usage

import CodeBlock from "@theme/CodeBlock";
import Example from "@examples/retrievers/metal.ts";

<CodeBlock language="typescript">{Example}</CodeBlock>
2 changes: 1 addition & 1 deletion docs/docs/modules/indexes/retrievers/remote-retriever.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Remote Retriever

This example shows how to use the a Remote Retriever in a `RetrievalQAChain` to retrieve documents from a remote server.
This example shows how to use a Remote Retriever in a `RetrievalQAChain` to retrieve documents from a remote server.

## Usage

Expand Down
1 change: 1 addition & 0 deletions examples/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"license": "MIT",
"dependencies": {
"@dqbd/tiktoken": "^1.0.2",
"@getmetal/metal-sdk": "^1.0.12",
"@pinecone-database/pinecone": "^0.0.10",
"@supabase/supabase-js": "^2.10.0",
"chromadb": "^1.3.0",
Expand Down
17 changes: 17 additions & 0 deletions examples/src/retrievers/metal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Metal from "@getmetal/metal-sdk";
import { MetalRetriever } from "langchain/retrievers";

export const run = async () => {
const MetalSDK = Metal.default;

const client = new MetalSDK(
process.env.METAL_API_KEY!,
process.env.METAL_CLIENT_ID!,
process.env.METAL_APP_ID
);
const retriever = new MetalRetriever({ client });

const docs = await retriever.getRelevantDocuments("hello");

console.log(docs);
};
5 changes: 5 additions & 0 deletions langchain/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
"@babel/preset-env": "^7.20.2",
"@dqbd/tiktoken": "^1.0.2",
"@faker-js/faker": "^7.6.0",
"@getmetal/metal-sdk": "^1.0.12",
"@huggingface/inference": "^1.5.1",
"@jest/globals": "^29.5.0",
"@pinecone-database/pinecone": "^0.0.10",
Expand Down Expand Up @@ -147,6 +148,7 @@
},
"peerDependencies": {
"@dqbd/tiktoken": "^1.0.2",
"@getmetal/metal-sdk": "*",
"@huggingface/inference": "^1.5.1",
"@pinecone-database/pinecone": "^0.0.10",
"@supabase/supabase-js": "^2.10.0",
Expand All @@ -169,6 +171,9 @@
"@dqbd/tiktoken": {
"optional": true
},
"@getmetal/metal-sdk": {
"optional": true
},
"@huggingface/inference": {
"optional": true
},
Expand Down
1 change: 1 addition & 0 deletions langchain/src/retrievers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export {
SupabaseHybridSearchParams,
} from "./supabase-hybrid-search.js";
export { RemoteLangChainRetriever } from "./remote/remote-retriever.js";
export { MetalRetriever } from "./metal.js";
36 changes: 36 additions & 0 deletions langchain/src/retrievers/metal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type MetalSDK from "@getmetal/metal-sdk";

import { BaseRetriever } from "../schema/index.js";
import { Document } from "../document.js";

export interface MetalRetrieverFields {
client: MetalSDK.default;
}

interface ResponseItem {
text: string;
[key: string]: unknown;
}

export class MetalRetriever extends BaseRetriever {
client: MetalSDK.default;

constructor(fields: MetalRetrieverFields) {
super();

this.client = fields.client;
}

async getRelevantDocuments(query: string): Promise<Document[]> {
const res = await this.client.search({ text: query });

const items = ("data" in res ? res.data : res) as ResponseItem[];
return items.map(
({ text, metadata }) =>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we also return a dist which shows the similarity distance when running a search with a text query. Perhaps we should include this in the metadata of Document below?

new Document({
pageContent: text,
metadata: metadata as Record<string, unknown>,
})
);
}
}
22 changes: 22 additions & 0 deletions langchain/src/retrievers/tests/metal.int.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* eslint-disable no-process-env */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { test, expect } from "@jest/globals";
import Metal from "@getmetal/metal-sdk";

import { MetalRetriever } from "../metal.js";

test("MetalRetriever", async () => {
const MetalSDK = Metal.default;
const client = new MetalSDK(
process.env.METAL_API_KEY!,
process.env.METAL_CLIENT_ID!,
process.env.METAL_APP_ID
);
const retriever = new MetalRetriever({ client });

const docs = await retriever.getRelevantDocuments("hello");

expect(docs.length).toBeGreaterThan(0);

console.log(docs);
});
29 changes: 27 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2506,6 +2506,15 @@ __metadata:
languageName: node
linkType: hard

"@getmetal/metal-sdk@npm:^1.0.12":
version: 1.0.12
resolution: "@getmetal/metal-sdk@npm:1.0.12"
dependencies:
axios: ^1.3.2
checksum: 46e3f7876b2aaad759c32a348df078c093fae89205e7050040f80300d04a0c7f1973562d1b9df74b453e2aad316fbfa5d88565e38b33c285d474cdb0356f18f3
languageName: node
linkType: hard

"@hapi/hoek@npm:^9.0.0":
version: 9.3.0
resolution: "@hapi/hoek@npm:9.3.0"
Expand Down Expand Up @@ -5052,6 +5061,17 @@ __metadata:
languageName: node
linkType: hard

"axios@npm:^1.3.2":
version: 1.3.4
resolution: "axios@npm:1.3.4"
dependencies:
follow-redirects: ^1.15.0
form-data: ^4.0.0
proxy-from-env: ^1.1.0
checksum: 7440edefcf8498bc3cdf39de00443e8101f249972c83b739c6e880d9d669fea9486372dbe8739e88b3bf8bb1ad15f6106693f206f078f4516fe8fd47b1c3093c
languageName: node
linkType: hard

"axobject-query@npm:^3.1.1":
version: 3.1.1
resolution: "axobject-query@npm:3.1.1"
Expand Down Expand Up @@ -8692,7 +8712,7 @@ __metadata:
languageName: node
linkType: hard

"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8":
"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.0":
version: 1.15.2
resolution: "follow-redirects@npm:1.15.2"
peerDependenciesMeta:
Expand Down Expand Up @@ -11387,6 +11407,7 @@ __metadata:
resolution: "langchain-examples@workspace:examples"
dependencies:
"@dqbd/tiktoken": ^1.0.2
"@getmetal/metal-sdk": ^1.0.12
"@pinecone-database/pinecone": ^0.0.10
"@supabase/supabase-js": ^2.10.0
"@tsconfig/recommended": ^1.0.2
Expand Down Expand Up @@ -11421,6 +11442,7 @@ __metadata:
"@dqbd/tiktoken": ^1.0.2
"@faker-js/faker": ^7.6.0
"@fortaine/fetch-event-source": ^3.0.6
"@getmetal/metal-sdk": ^1.0.12
"@huggingface/inference": ^1.5.1
"@jest/globals": ^29.5.0
"@pinecone-database/pinecone": ^0.0.10
Expand Down Expand Up @@ -11479,6 +11501,7 @@ __metadata:
zod: ^3.21.4
peerDependencies:
"@dqbd/tiktoken": ^1.0.2
"@getmetal/metal-sdk": "*"
"@huggingface/inference": ^1.5.1
"@pinecone-database/pinecone": ^0.0.10
"@supabase/supabase-js": ^2.10.0
Expand All @@ -11499,6 +11522,8 @@ __metadata:
peerDependenciesMeta:
"@dqbd/tiktoken":
optional: true
"@getmetal/metal-sdk":
optional: true
"@huggingface/inference":
optional: true
"@pinecone-database/pinecone":
Expand Down Expand Up @@ -14237,7 +14262,7 @@ __metadata:
languageName: node
linkType: hard

"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.0.0":
"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4
Expand Down