From 2ee532be113f4202a6250235032cde5552763b37 Mon Sep 17 00:00:00 2001 From: Dhruv Singh Date: Tue, 17 Sep 2024 12:09:50 -0400 Subject: [PATCH 1/5] typescript example running --- .gitignore | 3 + .../observability_tutorial.py | 6 +- observability-tutorial-typescript/index.ts | 77 +++++++++++++++++++ .../package.json | 20 +++++ .../tsconfig.json | 11 +++ 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 observability-tutorial-typescript/index.ts create mode 100644 observability-tutorial-typescript/package.json create mode 100644 observability-tutorial-typescript/tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4640b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/node_modules +**/package-lock.json +**/.env \ No newline at end of file diff --git a/observability-tutorial-python/observability_tutorial.py b/observability-tutorial-python/observability_tutorial.py index c59d845..9e83f19 100644 --- a/observability-tutorial-python/observability_tutorial.py +++ b/observability-tutorial-python/observability_tutorial.py @@ -11,8 +11,8 @@ # Initialize HoneyHive Tracer HoneyHiveTracer.init( - api_key="your-honeyhive-api-key", - project="your-honeyhive-project-name", + api_key=os.environ["HH_API_KEY"], + project=os.environ["HH_PROJECT"], source="dev", session_name="RAG Session" ) @@ -20,7 +20,7 @@ # Initialize clients openai_client = OpenAI() pc = Pinecone() -index = pc.Index("your-index-name") +index = pc.Index("chunk-size-512") def embed_query(query): res = openai_client.embeddings.create( diff --git a/observability-tutorial-typescript/index.ts b/observability-tutorial-typescript/index.ts new file mode 100644 index 0000000..67774e4 --- /dev/null +++ b/observability-tutorial-typescript/index.ts @@ -0,0 +1,77 @@ +import * as dotenv from 'dotenv'; +import { OpenAI } from 'openai'; +import { Pinecone } from '@pinecone-database/pinecone'; +import { HoneyHiveTracer } from 'honeyhive'; + +dotenv.config(); + +// Initialize clients +const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); +const pc = new Pinecone(); +const index = pc.index("chunk-size-512"); + +async function embedQuery(query: string): Promise { + const res = await openai.embeddings.create({ + model: "text-embedding-ada-002", + input: query + }); + return res.data[0].embedding; +} + +async function getRelevantDocuments(query: string): Promise { + const queryVector = await embedQuery(query); + const res = await index.query({ + vector: queryVector, + topK: 3, + includeMetadata: true + }); + return res.matches.map(item => item.metadata!._node_content as string); +} + +async function generateResponse(context: string, query: string): Promise { + const prompt = `Context: ${context}\n\nQuestion: ${query}\n\nAnswer:`; + const response = await openai.chat.completions.create({ + model: "gpt-4", + messages: [ + { role: "system", content: "You are a helpful assistant." }, + { role: "user", content: prompt } + ] + }); + return response.choices[0].message.content || ""; +} + +async function ragPipeline(query: string): Promise { + const docs = await getRelevantDocuments(query); + const response = await generateResponse(docs.join("\n"), query); + return response; +} + +async function main() { + // Initialize HoneyHive Tracer + const tracer = await HoneyHiveTracer.init({ + apiKey: process.env.HH_API_KEY!, + project: process.env.HH_PROJECT!, + source: "dev", + sessionName: "TS RAG Session" + }); + + await tracer.trace(async () => { + const query = "What does the document talk about?"; + const response = await ragPipeline(query); + console.log(`Query: ${query}`); + console.log(`Response: ${response}`); + }); + + tracer.setMetadata({ + "experiment-id": 123 + }); + + // Simulate getting user feedback + const userRating = 4; + tracer.setFeedback({ + rating: userRating, + comment: "The response was accurate and helpful." + }); +} + +main().catch(console.error); \ No newline at end of file diff --git a/observability-tutorial-typescript/package.json b/observability-tutorial-typescript/package.json new file mode 100644 index 0000000..833eda8 --- /dev/null +++ b/observability-tutorial-typescript/package.json @@ -0,0 +1,20 @@ +{ + "name": "typescript-rag-implementation", + "version": "1.0.0", + "description": "TypeScript implementation of RAG pipeline with OpenAI, Pinecone, and HoneyHive", + "main": "index.ts", + "scripts": { + "start": "npx tsx index.ts" + }, + "dependencies": { + "@pinecone-database/pinecone": "^3.0.3", + "dotenv": "^16.0.3", + "honeyhive": "^1.0.5", + "openai": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^18.0.0", + "tsx": "^3.12.0", + "typescript": "^4.9.5" + } +} diff --git a/observability-tutorial-typescript/tsconfig.json b/observability-tutorial-typescript/tsconfig.json new file mode 100644 index 0000000..2dd05ba --- /dev/null +++ b/observability-tutorial-typescript/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + } + } \ No newline at end of file From 9a2987aad6f3e68be3bbfd1af6de1258a46ff866 Mon Sep 17 00:00:00 2001 From: Dhruv Singh Date: Tue, 17 Sep 2024 12:10:39 -0400 Subject: [PATCH 2/5] rollback unintentional changes --- observability-tutorial-python/observability_tutorial.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/observability-tutorial-python/observability_tutorial.py b/observability-tutorial-python/observability_tutorial.py index 9e83f19..c59d845 100644 --- a/observability-tutorial-python/observability_tutorial.py +++ b/observability-tutorial-python/observability_tutorial.py @@ -11,8 +11,8 @@ # Initialize HoneyHive Tracer HoneyHiveTracer.init( - api_key=os.environ["HH_API_KEY"], - project=os.environ["HH_PROJECT"], + api_key="your-honeyhive-api-key", + project="your-honeyhive-project-name", source="dev", session_name="RAG Session" ) @@ -20,7 +20,7 @@ # Initialize clients openai_client = OpenAI() pc = Pinecone() -index = pc.Index("chunk-size-512") +index = pc.Index("your-index-name") def embed_query(query): res = openai_client.embeddings.create( From ea544e92372da7fb16faaa1ff931910ae9a9ddcd Mon Sep 17 00:00:00 2001 From: Dhruv Singh Date: Tue, 17 Sep 2024 12:11:51 -0400 Subject: [PATCH 3/5] minor cleanup --- observability-tutorial-typescript/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/observability-tutorial-typescript/index.ts b/observability-tutorial-typescript/index.ts index 67774e4..522d643 100644 --- a/observability-tutorial-typescript/index.ts +++ b/observability-tutorial-typescript/index.ts @@ -6,9 +6,9 @@ import { HoneyHiveTracer } from 'honeyhive'; dotenv.config(); // Initialize clients -const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); +const openai = new OpenAI(); const pc = new Pinecone(); -const index = pc.index("chunk-size-512"); +const index = pc.index("your-index-name"); async function embedQuery(query: string): Promise { const res = await openai.embeddings.create({ From 187e18ab2c896917a50239d7eec53a3ad4b4d741 Mon Sep 17 00:00:00 2001 From: Dhruv Singh Date: Tue, 17 Sep 2024 12:35:10 -0400 Subject: [PATCH 4/5] move from ts to js, no esm --- .../{index.ts => observability-example.js} | 35 +++++++++---------- .../package.json | 13 +++---- .../tsconfig.json | 11 ------ 3 files changed, 21 insertions(+), 38 deletions(-) rename observability-tutorial-typescript/{index.ts => observability-example.js} (68%) delete mode 100644 observability-tutorial-typescript/tsconfig.json diff --git a/observability-tutorial-typescript/index.ts b/observability-tutorial-typescript/observability-example.js similarity index 68% rename from observability-tutorial-typescript/index.ts rename to observability-tutorial-typescript/observability-example.js index 522d643..f65731b 100644 --- a/observability-tutorial-typescript/index.ts +++ b/observability-tutorial-typescript/observability-example.js @@ -1,16 +1,23 @@ -import * as dotenv from 'dotenv'; -import { OpenAI } from 'openai'; +import OpenAI from 'openai'; import { Pinecone } from '@pinecone-database/pinecone'; import { HoneyHiveTracer } from 'honeyhive'; - +import dotenv from 'dotenv'; dotenv.config(); +// Initialize HoneyHive Tracer +const tracer = await HoneyHiveTracer.init({ + apiKey: process.env.HH_API_KEY, + project: process.env.HH_PROJECT, + source: "dev", + sessionName: "JS RAG Session" +}); + // Initialize clients const openai = new OpenAI(); const pc = new Pinecone(); -const index = pc.index("your-index-name"); +const index = pc.index("chunk-size-512"); -async function embedQuery(query: string): Promise { +async function embedQuery(query) { const res = await openai.embeddings.create({ model: "text-embedding-ada-002", input: query @@ -18,20 +25,20 @@ async function embedQuery(query: string): Promise { return res.data[0].embedding; } -async function getRelevantDocuments(query: string): Promise { +async function getRelevantDocuments(query) { const queryVector = await embedQuery(query); const res = await index.query({ vector: queryVector, topK: 3, includeMetadata: true }); - return res.matches.map(item => item.metadata!._node_content as string); + return res.matches.map(item => item.metadata._node_content); } -async function generateResponse(context: string, query: string): Promise { +async function generateResponse(context, query) { const prompt = `Context: ${context}\n\nQuestion: ${query}\n\nAnswer:`; const response = await openai.chat.completions.create({ - model: "gpt-4", + model: "gpt-4o-mini", messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: prompt } @@ -40,21 +47,13 @@ async function generateResponse(context: string, query: string): Promise return response.choices[0].message.content || ""; } -async function ragPipeline(query: string): Promise { +async function ragPipeline(query) { const docs = await getRelevantDocuments(query); const response = await generateResponse(docs.join("\n"), query); return response; } async function main() { - // Initialize HoneyHive Tracer - const tracer = await HoneyHiveTracer.init({ - apiKey: process.env.HH_API_KEY!, - project: process.env.HH_PROJECT!, - source: "dev", - sessionName: "TS RAG Session" - }); - await tracer.trace(async () => { const query = "What does the document talk about?"; const response = await ragPipeline(query); diff --git a/observability-tutorial-typescript/package.json b/observability-tutorial-typescript/package.json index 833eda8..e833ee1 100644 --- a/observability-tutorial-typescript/package.json +++ b/observability-tutorial-typescript/package.json @@ -1,20 +1,15 @@ { - "name": "typescript-rag-implementation", + "name": "honeyhive-js-implementation", "version": "1.0.0", - "description": "TypeScript implementation of RAG pipeline with OpenAI, Pinecone, and HoneyHive", - "main": "index.ts", + "description": "JavaScript implementation of RAG pipeline with OpenAI, Pinecone, and HoneyHive", + "main": "observability-example.js", "scripts": { - "start": "npx tsx index.ts" + "start": "node observability-example.js" }, "dependencies": { "@pinecone-database/pinecone": "^3.0.3", "dotenv": "^16.0.3", "honeyhive": "^1.0.5", "openai": "^4.0.0" - }, - "devDependencies": { - "@types/node": "^18.0.0", - "tsx": "^3.12.0", - "typescript": "^4.9.5" } } diff --git a/observability-tutorial-typescript/tsconfig.json b/observability-tutorial-typescript/tsconfig.json deleted file mode 100644 index 2dd05ba..0000000 --- a/observability-tutorial-typescript/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "es2022", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node" - } - } \ No newline at end of file From 1ac2b8347c48b0486adaceed139bd69dec6cd936 Mon Sep 17 00:00:00 2001 From: Michael Acar Date: Tue, 17 Sep 2024 14:34:53 -0400 Subject: [PATCH 5/5] Factor out Pinecone index --- observability-tutorial-typescript/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/observability-tutorial-typescript/index.ts b/observability-tutorial-typescript/index.ts index 522d643..3dfa582 100644 --- a/observability-tutorial-typescript/index.ts +++ b/observability-tutorial-typescript/index.ts @@ -8,7 +8,7 @@ dotenv.config(); // Initialize clients const openai = new OpenAI(); const pc = new Pinecone(); -const index = pc.index("your-index-name"); +const index = pc.index(process.env.PINECONE_INDEX!); async function embedQuery(query: string): Promise { const res = await openai.embeddings.create({ @@ -74,4 +74,4 @@ async function main() { }); } -main().catch(console.error); \ No newline at end of file +main().catch(console.error);