Files
2026-07-13 13:35:10 +08:00

302 lines
8.1 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "860c9e4b-dc7c-4f2e-8f60-96cccf61d43c",
"metadata": {},
"source": [
"# OpenLayer\n",
"## Evaluating RAG pipelines with Openlayer and Ragas\n",
"\n",
"[Openlayer](https://www.openlayer.com/) is an evaluation tool that fits into your development and production pipelines to help you ship high-quality models with confidence.\n",
"\n",
"This notebook should be used together with [this blog post](https://www.openlayer.com/blog/post/evaluating-rag-pipelines-with-ragas-and-openlayer)."
]
},
{
"cell_type": "markdown",
"id": "3ad3ed0c-e495-4078-ab95-a70fa6322ab1",
"metadata": {},
"source": [
"## Pre-requisites"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7ded5103-b6ac-482e-9217-347f701333b4",
"metadata": {},
"outputs": [],
"source": [
"%%bash\n",
"git clone https://huggingface.co/datasets/vibrantlabsai/prompt-engineering-papers"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "58f0951f-5de9-4eca-8b0c-e77d5ac99bad",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"os.environ[\"OPENAI_API_KEY\"] = \"YOUR_OPENAI_API_KEY_HERE\""
]
},
{
"cell_type": "markdown",
"id": "93b95703-0826-47b2-8b0b-e0f982b1e170",
"metadata": {},
"source": [
"## Synthetic test data generation"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "69cfc916-148a-4608-8eac-b75cc988b228",
"metadata": {},
"outputs": [],
"source": [
"from llama_index import SimpleDirectoryReader\n",
"\n",
"from ragas.testset.evolutions import multi_context, reasoning, simple\n",
"from ragas.testset.generator import TestsetGenerator\n",
"\n",
"# load documents\n",
"dir_path = \"./prompt-engineering-papers\"\n",
"reader = SimpleDirectoryReader(dir_path, num_files_limit=2)\n",
"documents = reader.load_data()\n",
"\n",
"# generator with openai models\n",
"generator = TestsetGenerator.with_openai()\n",
"\n",
"# set question type distribution\n",
"distribution = {simple: 0.5, reasoning: 0.25, multi_context: 0.25}\n",
"\n",
"# generate testset\n",
"testset = generator.generate_with_llamaindex_docs(\n",
" documents, test_size=10, distributions=distribution\n",
")\n",
"test_df = testset.to_pandas()\n",
"test_df.head()"
]
},
{
"cell_type": "markdown",
"id": "9c802981-892e-4fed-bb73-dede5540fc6c",
"metadata": {},
"source": [
"## Building RAG"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "72167cb6-bd8a-4d8b-a14c-142235f2ebe0",
"metadata": {},
"outputs": [],
"source": [
"import nest_asyncio\n",
"from llama_index import ServiceContext, SimpleDirectoryReader, VectorStoreIndex\n",
"from llama_index.embeddings import OpenAIEmbedding\n",
"\n",
"nest_asyncio.apply()\n",
"\n",
"\n",
"def build_query_engine(documents):\n",
" vector_index = VectorStoreIndex.from_documents(\n",
" documents,\n",
" service_context=ServiceContext.from_defaults(chunk_size=512),\n",
" embed_model=OpenAIEmbedding(),\n",
" )\n",
"\n",
" query_engine = vector_index.as_query_engine(similarity_top_k=2)\n",
" return query_engine"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a5e47e5b-fa1a-4f07-b4a4-7493b1d58cc7",
"metadata": {},
"outputs": [],
"source": [
"query_engine = build_query_engine(documents)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6469b8ef-f9a3-4fb0-887a-0b70bce59dc0",
"metadata": {},
"outputs": [],
"source": [
"def generate_single_response(query_engine, question):\n",
" response = query_engine.query(question)\n",
" return {\n",
" \"answer\": response.response,\n",
" \"contexts\": [c.node.get_content() for c in response.source_nodes],\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2123caed-a573-4e4e-bb60-41c15de6705f",
"metadata": {},
"outputs": [],
"source": [
"question = \"What are some strategies proposed to enhance the in-context learning capability of language models?\"\n",
"generate_single_response(query_engine, question)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3c88035b-3383-44a6-bd8a-08a172f11a36",
"metadata": {},
"outputs": [],
"source": [
"from datasets import Dataset\n",
"\n",
"\n",
"def generate_ragas_dataset(query_engine, test_df):\n",
" test_questions = test_df[\"question\"].values\n",
" responses = [generate_single_response(query_engine, q) for q in test_questions]\n",
"\n",
" dataset_dict = {\n",
" \"question\": test_questions,\n",
" \"answer\": [response[\"answer\"] for response in responses],\n",
" \"contexts\": [response[\"contexts\"] for response in responses],\n",
" \"ground_truth\": test_df[\"ground_truth\"].values.tolist(),\n",
" }\n",
" ds = Dataset.from_dict(dataset_dict)\n",
" return ds"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "437368a5-3819-4ae1-b825-ad95664206ae",
"metadata": {},
"outputs": [],
"source": [
"ragas_dataset = generate_ragas_dataset(query_engine, test_df)\n",
"ragas_df = ragas_dataset.to_pandas()"
]
},
{
"cell_type": "markdown",
"id": "10702a1e-276d-45f9-9d81-2be1bd98ce3d",
"metadata": {},
"source": [
"## Commit to Openlayer"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ced5f583-b849-4aae-8397-2bd9006bb69f",
"metadata": {},
"outputs": [],
"source": [
"import openlayer\n",
"from openlayer.tasks import TaskType\n",
"\n",
"client = openlayer.OpenlayerClient(\"YOUR_OPENLAYER_API_KEY_HERE\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "15c6af02-c9bc-4368-82a1-43cf849446d3",
"metadata": {},
"outputs": [],
"source": [
"project = client.create_project(\n",
" name=\"My-Rag-Project\",\n",
" task_type=TaskType.LLM,\n",
" description=\"Evaluating an LLM used for product development.\",\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "419f1392-4c44-4856-af5f-1bd04de1de7c",
"metadata": {},
"outputs": [],
"source": [
"validation_dataset_config = {\n",
" \"contextColumnName\": \"contexts\",\n",
" \"questionColumnName\": \"question\",\n",
" \"inputVariableNames\": [\"question\"],\n",
" \"label\": \"validation\",\n",
" \"outputColumnName\": \"answer\",\n",
" \"groundTruthColumnName\": \"ground_truth\",\n",
"}\n",
"project.add_dataframe(\n",
" dataset_df=ragas_df,\n",
" dataset_config=validation_dataset_config,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "31c51305-2808-4cae-85c2-b261ca0d98c1",
"metadata": {},
"outputs": [],
"source": [
"model_config = {\n",
" \"inputVariableNames\": [\"question\"],\n",
" \"modelType\": \"shell\",\n",
" \"metadata\": {\"top_k\": 2, \"chunk_size\": 512, \"embeddings\": \"OpenAI\"},\n",
"}\n",
"project.add_model(model_config=model_config)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "471643ba-5e5d-4500-9745-f0c355f744a1",
"metadata": {},
"outputs": [],
"source": [
"project.commit(\"Initial commit!\")\n",
"project.push()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b602dbbc-cc60-48b5-9bab-ae684c61cbff",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.18"
}
},
"nbformat": 4,
"nbformat_minor": 5
}