17 KiB
17 KiB
In [ ]:
# note, if you use a Mac M1 chip, you might need to install grpcio 1.59.0 first such that installing chromadb works
# !pip install grpcio==1.59.0
!pip install sglang[openai] parea chromadbIn [ ]:
import json
import os
import chromadb
path_qca = "airbnb-2023-10k-qca.json"
if not os.path.exists(path_qca):
!wget https://virattt.github.io/datasets/abnb-2023-10k.json -O airbnb-2023-10k-qca.json
with open(path_qca, 'r') as f:
question_context_answers = json.load(f)
chroma_client = chromadb.PersistentClient()
collection = chroma_client.get_or_create_collection(name="contexts")
if collection.count() == 0:
collection.add(
documents=[qca["context"] for qca in question_context_answers],
ids=[str(i) for i in range(len(question_context_answers))]
)In [2]:
import os
import time
from dotenv import load_dotenv
from sglang import function, user, assistant, gen, set_default_backend, OpenAI
from sglang.lang.interpreter import ProgramState
from parea import Parea, trace
load_dotenv()
os.environ['TOKENIZERS_PARALLELISM'] = "false"
p = Parea(api_key=os.getenv("PAREA_API_KEY"), project_name="rag_sglang")
p.integrate_with_sglang()
set_default_backend(OpenAI("gpt-3.5-turbo"))In [ ]:
@trace
def retrieval(question: str) -> list[str]:
return collection.query(
query_texts=[question],
n_results=1
)['documents'][0]In [ ]:
@function
def generation_sglang(s, question: str, *context: str):
context = "\n".join(context)
s += user(f'Given this question:\n{question}\n\nAnd this context:\n{context}\n\nAnswer the question.')
s += assistant(gen("answer"))
@trace
def generation(question: str, *context):
state: ProgramState = generation_sglang.run(question, *context)
while not state.stream_executor.is_finished:
time.sleep(1)
return state.stream_executor.variables["answer"]In [3]:
@trace
def rag_pipeline(question: str) -> str:
contexts = retrieval(question)
return generation(question, *contexts)
rag_pipeline("When did the World Health Organization formally declare an end to the COVID-19 global health emergency?")Out [3]:
'The World Health Organization formally declared an end to the COVID-19 global health emergency'
In [ ]:
from parea.evals.rag import context_query_relevancy_factory, percent_target_supported_by_context_factory
context_relevancy_eval = context_query_relevancy_factory()
percent_target_supported_by_context = percent_target_supported_by_context_factory()
@trace(eval_funcs=[context_relevancy_eval, percent_target_supported_by_context])
def retrieval(question: str) -> list[str]:
return collection.query(
query_texts=[question],
n_results=1
)['documents'][0]In [ ]:
from parea.evals.general import answer_matches_target_llm_grader_factory
from parea.evals.rag import answer_context_faithfulness_statement_level_factory
answer_context_faithfulness = answer_context_faithfulness_statement_level_factory()
answer_matches_target_llm_grader = answer_matches_target_llm_grader_factory()
@function
def generation_sglang(s, question: str, *context: str):
context = "\n".join(context)
s += user(f'Given this question:\n{question}\n\nAnd this context:\n{context}\n\nAnswer the question.')
s += assistant(gen("answer", max_tokens=1_000))
@trace(eval_funcs=[answer_context_faithfulness, answer_matches_target_llm_grader])
def generation(question: str, *context):
state: ProgramState = generation_sglang.run(question, *context)
while not state.stream_executor.is_finished:
time.sleep(1)
return state.stream_executor.variables["answer"]In [4]:
@trace
def rag_pipeline(question: str) -> str:
contexts = retrieval(question)
return generation(question, *contexts)
rag_pipeline("When did the World Health Organization formally declare an end to the COVID-19 global health emergency?")Out [4]:
'The World Health Organization formally declared an end to the COVID-19 global health emergency in May 2023.'
In [6]:
!pip install nest-asyncio
import nest_asyncio
nest_asyncio.apply()Requirement already satisfied: nest-asyncio in /Users/joschkabraun/miniconda3/envs/sglang/lib/python3.10/site-packages (1.6.0)
In [7]:
e = p.experiment(
'RAG',
data=[
{
"question": qca["question"],
"target": qca["answer"],
}
for qca in question_context_answers
],
func=rag_pipeline
).run()Run name set to: sneak-weal, since a name was not provided.
100%|██████████| 100/100 [00:27<00:00, 3.63it/s] Waiting for evaluations to finish: 100%|██████████| 19/19 [00:10<00:00, 1.89it/s]
Experiment RAG Run sneak-weal stats:
{
"latency": "2.69",
"input_tokens": "61.26",
"output_tokens": "75.88",
"total_tokens": "137.14",
"cost": "0.00",
"answer_context_faithfulness_statement_level": "0.26",
"answer_matches_target_llm_grader": "0.22",
"context_query_relevancy": "0.27",
"percent_target_supported_by_context": "0.40"
}
View experiment & traces at: https://app.parea.ai/experiments/RAG/30f0244a-d56c-44ff-bdfb-8f47626304b6
In [4]:
