├── README.md ├── components ├── .DS_Store ├── Answer │ ├── Answer.tsx │ └── answer.module.css ├── Footer.tsx └── Navbar.tsx ├── license ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── .DS_Store ├── _app.tsx ├── _document.tsx ├── api │ ├── .DS_Store │ ├── search.ts │ └── vectordbqa.ts └── index.tsx ├── postcss.config.js ├── public ├── .DS_Store ├── 0001.jpg ├── 0002.jpg ├── 0003.jpg ├── 0004.jpg ├── 0005.jpg ├── 0006.jpg ├── 0007.jpg ├── 0008.jpg ├── 0009.jpg ├── 0010.jpg ├── 0011.jpg ├── 0012.jpg ├── 0013.jpg ├── 0014.jpg ├── 0015.jpg ├── 0016.jpg ├── 0017.jpg ├── 0018.jpg ├── 0019.jpg ├── 0020.jpg ├── 0021.jpg ├── 0022.jpg ├── 0023.jpg ├── 0024.jpg ├── 0025.jpg ├── 0026.jpg ├── 0027.jpg ├── 0028.jpg ├── 0029.jpg ├── 0030.jpg ├── 0031.jpg ├── 0032.jpg ├── 0033.jpg ├── 0034.jpg ├── 0035.jpg ├── 0036.jpg ├── 0037.jpg ├── 0038.jpg ├── 0039.jpg ├── 0040.jpg ├── 0041.jpg ├── 0042.jpg ├── 0043.jpg ├── 0044.jpg ├── 0045.jpg ├── 0046.jpg ├── 0047.jpg ├── 0048.jpg ├── 0049.jpg ├── 0050.jpg ├── 0051.jpg ├── 0052.jpg ├── 0053.jpg ├── 0054.jpg ├── 0055.jpg ├── 0056.jpg ├── 0057.jpg ├── 0058.jpg ├── 0059.jpg ├── 0060.jpg ├── 0061.jpg ├── 0062.jpg ├── 0063.jpg ├── 0064.jpg ├── 0065.jpg ├── 0066.jpg ├── 0067.jpg ├── 0068.jpg ├── 0069.jpg ├── 0070.jpg ├── 0071.jpg ├── 0072.jpg ├── 0073.jpg ├── 0074.jpg ├── 0075.jpg ├── 0076.jpg ├── 0077.jpg ├── 0078.jpg ├── 0079.jpg ├── 0080.jpg ├── 0081.jpg ├── 0082.jpg ├── 0083.jpg ├── 0084.jpg ├── 0085.jpg ├── 0086.jpg ├── 0087.jpg ├── 0088.jpg ├── 0089.jpg ├── 0090.jpg ├── 0091.jpg ├── 0092.jpg ├── 0093.jpg ├── 0094.jpg ├── 0095.jpg ├── 0096.jpg ├── 0097.jpg ├── 0098.jpg ├── 0099.jpg ├── 0101.jpg ├── 0102.jpg ├── 0103.jpg ├── 0104.jpg ├── 0105.jpg ├── 0106.jpg ├── 0107.jpg ├── 0108.jpg ├── 0109.jpg ├── 0110.jpg ├── 0111.jpg ├── 0112.jpg ├── 0113.jpg ├── 0114.jpg ├── 0115.jpg ├── 0116.jpg ├── 0117.jpg ├── 0118.jpg ├── 0119.jpg ├── 0120.jpg ├── 0121.jpg ├── 0122.jpg ├── 0123.jpg ├── 0124.jpg ├── 0125.jpg ├── 0126.jpg ├── 0127.jpg ├── 0128.jpg ├── 0129.jpg ├── 0130.jpg ├── 0131.jpg ├── 0132.jpg ├── 0133.jpg ├── 0134.jpg ├── 0135.jpg ├── 0136.jpg ├── 0137.jpg ├── 0138.jpg ├── 0139.jpg ├── 0140.jpg ├── 0141.jpg ├── 0142.jpg ├── 0143.jpg ├── 0144.jpg ├── 0145.jpg ├── 0146.jpg ├── 0147.jpg ├── 0148.jpg ├── 0149.jpg ├── 0150.jpg ├── 0151.jpg ├── 0152.jpg ├── 0153.jpg ├── 0154.jpg ├── 0155.jpg ├── 0156.jpg ├── 0157.jpg ├── 0158.jpg ├── 0159.jpg ├── 0160.jpg ├── 0161.jpg ├── 0162.jpg ├── 0163.jpg ├── 0164.jpg ├── 0165.jpg ├── 0166.jpg ├── 0167.jpg ├── 0168.jpg ├── 0169.jpg ├── 0170.jpg ├── 0171.jpg ├── 0172.jpg ├── 0173.jpg ├── 0174.jpg ├── 0175.jpg ├── 0176.jpg ├── 0177.jpg ├── 0178.jpg ├── 0179.jpg ├── 0180.jpg ├── 0181.jpg ├── 0182.jpg ├── 0183.jpg ├── 0184.jpg ├── 0185.jpg ├── 0186.jpg ├── 0187.jpg ├── 0188.jpg ├── 0189.jpg ├── 0190.jpg ├── 0191.jpg ├── 0192.jpg ├── 0193.jpg ├── 0194.jpg ├── 0195.jpg ├── 0196.jpg ├── 0197.jpg ├── 0198.jpg ├── 0199.jpg ├── 0200.jpg ├── 0201.jpg ├── 0202.jpg ├── 0203.jpg ├── 0204.jpg ├── 0205.jpg ├── 0206.jpg ├── 0207.jpg ├── 0208.jpg ├── 0209.jpg ├── 0210.jpg ├── 0211.jpg ├── 0212.jpg ├── 0213.jpg ├── 0214.jpg ├── 0215.jpg ├── 0216.jpg ├── 0217.jpg ├── 0218.jpg ├── 0219.jpg ├── 0220.jpg ├── 0221.jpg ├── 0222.jpg ├── 0223.jpg ├── 0224.jpg ├── 0225.jpg ├── 0226.jpg ├── 0227.jpg ├── 0228.jpg ├── 0229.jpg ├── 0230.jpg ├── 0231.jpg ├── 0232.jpg ├── 0233.jpg ├── 0234.jpg ├── 0235.jpg ├── 0236.jpg ├── 0237.jpg ├── 0238.jpg ├── 0239.jpg ├── 0240.jpg ├── 0241.jpg ├── 0242.jpg ├── 0243.jpg ├── 0244.jpg ├── 0245.jpg ├── 0246.jpg ├── 0247.jpg ├── 0248.jpg ├── 0249.jpg ├── 0250.jpg ├── 0251.jpg ├── 0252.jpg ├── 0253.jpg ├── 0254.jpg ├── 0255.jpg ├── 0256.jpg ├── 0257.jpg ├── 0258.jpg ├── 0259.jpg ├── 0260.jpg ├── 0261.jpg ├── 0262.jpg ├── 0263.jpg ├── 0264.jpg ├── 0265.jpg ├── 0266.jpg ├── 0267.jpg ├── 0269.jpg ├── 0270.jpg ├── 0271.jpg ├── 0272.jpg ├── 0273.jpg ├── 0274.jpg ├── 0275.jpg ├── 0276.jpg ├── 0277.jpg ├── 0278.jpg ├── 0279.jpg ├── 0280.jpg ├── 0281.jpg ├── 0284.jpg ├── 0285.jpg ├── 0286.jpg ├── 0288.jpg ├── 0289.jpg ├── 0290.jpg ├── 0292.jpg ├── 0293.jpg ├── 0294.jpg ├── 0295.jpg ├── 0296.jpg ├── 0297.jpg ├── 0298.jpg ├── 0299.jpg ├── 0300.jpg ├── 0301.jpg ├── 0302.jpg ├── 0303.jpg ├── 0304.jpg ├── 0305.jpg ├── 0306.jpg ├── 0307.jpg ├── 0308.jpg ├── 0309.jpg ├── 0310.jpg ├── 0311.jpg ├── 0312.jpg ├── 0313.jpg ├── 0314.jpg ├── 0315.jpg ├── 0316.jpg ├── 0317.jpg ├── 0318.jpg ├── 0319.jpg ├── 0320.jpg ├── 0321.jpg ├── 0322.jpg ├── 0323.jpg ├── 0324.jpg ├── 0325.jpg ├── 0326.jpg ├── 0327.jpg ├── 0328.jpg ├── 0329.jpg ├── 0330.jpg ├── 0331.jpg ├── 0332.jpg ├── 0333.jpg ├── 0334.jpg ├── 0335.jpg ├── 0336.jpg ├── 0337.jpg ├── 0338.jpg ├── 0339.jpg ├── 0340.jpg ├── 0341.jpg ├── 0342.jpg ├── 0343.jpg ├── 0344.jpg ├── 0345.jpg ├── 0346.jpg ├── 0347.jpg ├── 0348.jpg ├── 0349.jpg ├── 0350.jpg ├── 0351.jpg ├── 0352.jpg ├── 0353.jpg ├── 0354.jpg ├── 0355.jpg ├── 0356.jpg ├── 0357.jpg ├── 0358.jpg ├── 0359.jpg ├── 0360.jpg ├── 0361.jpg ├── 0362.jpg ├── 0363.jpg ├── 0364.jpg ├── 0365.jpg ├── 0366.jpg ├── 0367.jpg ├── 0368.jpg ├── 0369.jpg ├── favicon.jpeg └── lex.jpeg ├── scripts ├── audio_transcription │ ├── 0366.txt │ ├── 0367.txt │ ├── 0368.txt │ ├── 0369.txt │ └── episodes.csv ├── dump_audio.py ├── eval.ipynb ├── get_data.ipynb └── run_whisper.py ├── styles └── globals.css ├── tailwind.config.js ├── tsconfig.json └── types └── index.ts /README.md: -------------------------------------------------------------------------------- 1 | # Lex GPT 2 | 3 | This app enables AI-powered search for Lex Fridman podcast. 4 | 5 | This is also a testbed for exploring Langchain functionality. 6 | 7 | ## Dataset 8 | 9 | Scrape ep 1-325 Whisper transcriptions via @karpathy for first 325 episodes: 10 | 11 | https://karpathy.ai/lexicap/index.html 12 | 13 | Trascribe remaining episodes (through episode 365) with Whisper. 14 | 15 | Transcribed data is split / embedded (Pinecone) with Langchain. 16 | 17 | All steps outlined in: `scripts/get_data.ipynb` 18 | 19 | ## Search 20 | 21 | Use Langchain `VectorDBQAChain` to: 22 | * Embed the user query 23 | * Perform similarity search on Pinecone embeddings 24 | * Synthesize the answer from relevant chunks with `GPT 3.5` 25 | 26 | ## Search 27 | 28 | Relevant chunks with metadata (links) are displayed as source documents. 29 | 30 | This builds on the excellent UI from https://github.com/mckaywrigley/wait-but-why-gpt. 31 | 32 | ## Deploy 33 | 34 | Note: the app that supports streaming is deployed to fly.io: https://lex-gpt.fly.dev/ 35 | 36 | This is because Vercel requires edge functions for streaming. 37 | 38 | We are working on getting edge functions working with Langchain. 39 | 40 | In the meantime, use https://lex-gpt.fly.dev/ for the more performant app. 41 | 42 | ## Credits 43 | 44 | Thanks to [Mckay Wrigley](https://twitter.com/mckaywrigley) for open-sourcing his UI. 45 | 46 | Thanks to Lex Fridman for the excellent podcast. 47 | 48 | Thanks to Karapthy for the Whisper transcriptions. 49 | 50 | ## Contact 51 | 52 | If you have any questions, feel free to reach out to me on [Twitter](https://twitter.com/RLanceMartin)! 53 | -------------------------------------------------------------------------------- /components/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/components/.DS_Store -------------------------------------------------------------------------------- /components/Answer/Answer.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import styles from "./answer.module.css"; 3 | 4 | interface AnswerProps { 5 | text: string; 6 | } 7 | 8 | export const Answer: React.FC = ({ text }) => { 9 | const [words, setWords] = useState([]); 10 | 11 | useEffect(() => { 12 | setWords(text.split(" ")); 13 | }, [text]); 14 | 15 | return ( 16 |
17 | {words.map((word, index) => ( 18 | 23 | {word}{" "} 24 | 25 | ))} 26 |
27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /components/Answer/answer.module.css: -------------------------------------------------------------------------------- 1 | .fadeIn { 2 | animation: fadeIn 0.5s ease-in-out forwards; 3 | opacity: 0; 4 | } 5 | 6 | @keyframes fadeIn { 7 | from { 8 | opacity: 0; 9 | } 10 | to { 11 | opacity: 1; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import { IconBrandGithub, IconBrandTwitter } from "@tabler/icons-react"; 2 | import { FC } from "react"; 3 | 4 | export const Footer: FC = () => { 5 | return ( 6 |
7 |
8 | 9 |
10 | Created by 11 | 17 | Lance Martin 18 | 19 | based on 20 | 26 | Lex Fridman 27 | 28 | {`'s blog`} 29 | 35 | Podcast 36 | 37 | . 38 |
39 | 40 |
41 | 47 | 48 | 49 | 50 | 56 | 57 | 58 |
59 |
60 | ); 61 | }; 62 | -------------------------------------------------------------------------------- /components/Navbar.tsx: -------------------------------------------------------------------------------- 1 | import { IconExternalLink } from "@tabler/icons-react"; 2 | import Image from "next/image"; 3 | import { FC } from "react"; 4 | import king from "../public/lex.jpeg"; 5 | 6 | export const Navbar: FC = () => { 7 | return ( 8 |
9 |
10 | 14 | The Network State GPT 20 |
Lex GPT
21 |
22 |
23 |
24 | 30 |
lexfridman.com
31 | 32 | 36 |
37 |
38 |
39 | ); 40 | }; 41 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Lance Martin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | images: { 5 | remotePatterns: [ 6 | { 7 | protocol: "https", 8 | hostname: "**" 9 | } 10 | ] 11 | }, 12 | webpack(config) { 13 | config.experiments = { 14 | asyncWebAssembly: true, 15 | layers: true, 16 | }; 17 | 18 | return config; 19 | }, 20 | }; 21 | 22 | module.exports = nextConfig; 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint", 10 | "scrape": "tsx scripts/scrape.ts", 11 | "embed": "tsx scripts/embed.ts", 12 | "images": "tsx scripts/images.ts" 13 | }, 14 | "dependencies": { 15 | "@dqbd/tiktoken": "^1.0.2", 16 | "@huggingface/inference": "^1.5.2", 17 | "@microsoft/fetch-event-source": "^2.0.1", 18 | "@next/font": "^13.2.3", 19 | "@pinecone-database/pinecone": "^0.0.10", 20 | "@tabler/icons-react": "^2.7.0", 21 | "@types/node": "18.14.2", 22 | "@types/react": "18.0.28", 23 | "@types/react-dom": "18.0.11", 24 | "chromadb": "^1.3.1", 25 | "cohere-ai": "^5.1.0", 26 | "endent": "^2.1.0", 27 | "eslint": "8.35.0", 28 | "eslint-config-next": "13.2.1", 29 | "eventsource-parser": "^0.1.0", 30 | "hnswlib-node": "^1.4.1", 31 | "langchain": "^0.0.52-0", 32 | "memory-cache": "^0.2.0", 33 | "next": "13.2.1", 34 | "react": "18.2.0", 35 | "react-dom": "18.2.0", 36 | "typescript": "4.9.5" 37 | }, 38 | "devDependencies": { 39 | "@next/env": "^13.2.3", 40 | "@supabase/supabase-js": "^2.10.0", 41 | "autoprefixer": "^10.4.13", 42 | "axios": "^1.3.4", 43 | "cheerio": "^1.0.0-rc.12", 44 | "gpt-3-encoder": "^1.1.4", 45 | "openai": "^3.2.1", 46 | "postcss": "^8.4.21", 47 | "tailwindcss": "^3.2.7", 48 | "tsx": "^3.12.3" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /pages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/pages/.DS_Store -------------------------------------------------------------------------------- /pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import "@/styles/globals.css"; 2 | import { Inter } from "@next/font/google"; 3 | import type { AppProps } from "next/app"; 4 | 5 | const inter = Inter({ subsets: ["latin"] }); 6 | 7 | export default function App({ Component, pageProps }: AppProps<{}>) { 8 | return ( 9 |
10 | 11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Html, Head, Main, NextScript } from 'next/document' 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /pages/api/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/pages/api/.DS_Store -------------------------------------------------------------------------------- /pages/api/search.ts: -------------------------------------------------------------------------------- 1 | import { PineconeStore } from "langchain/vectorstores/pinecone" 2 | import { OpenAIEmbeddings } from "langchain/embeddings/openai"; 3 | import { PineconeClient } from "@pinecone-database/pinecone"; 4 | import { NextApiRequest, NextApiResponse } from "next"; 5 | 6 | type Data = {}; 7 | const handler = async (req: NextApiRequest, res: NextApiResponse) => { 8 | 9 | // Query 10 | const query = req.body.query; 11 | 12 | // Vector DB 13 | const pinecone = new PineconeClient(); 14 | await pinecone.init({ 15 | environment: "us-east1-gcp", 16 | apiKey: process.env.PINECONE_API_KEY ?? "", 17 | }); 18 | const index = pinecone.Index("lex-gpt"); 19 | const vectorStore = await PineconeStore.fromExistingIndex( 20 | new OpenAIEmbeddings(), {pineconeIndex: index}, 21 | ); 22 | // Return chunks to display as references 23 | const results = await vectorStore.similaritySearch(query, 7); 24 | res.status(200).send(results); 25 | } 26 | 27 | export default handler; -------------------------------------------------------------------------------- /pages/api/vectordbqa.ts: -------------------------------------------------------------------------------- 1 | import { PineconeStore } from "langchain/vectorstores/pinecone" 2 | import { OpenAIEmbeddings } from "langchain/embeddings/openai"; 3 | import { PineconeClient } from "@pinecone-database/pinecone"; 4 | import { VectorDBQAChain } from "langchain/chains"; 5 | import { ChatOpenAI } from "langchain/chat_models/openai"; 6 | import { CallbackManager } from "langchain/callbacks"; 7 | import type { NextApiRequest, NextApiResponse } from "next"; 8 | import { NextRequest, NextResponse } from "next/server"; 9 | 10 | export const config = { 11 | runtime: "edge" 12 | }; 13 | export default async function handler(req: NextRequest) 14 | { 15 | 16 | // Inputs 17 | const { prompt } = (await req.json()) as { prompt: string; }; 18 | 19 | // Vector DB 20 | const pinecone = new PineconeClient(); 21 | await pinecone.init({ 22 | environment: "us-east1-gcp", 23 | apiKey: process.env.PINECONE_API_KEY ?? "", 24 | }); 25 | 26 | const index = pinecone.Index("lex-gpt"); 27 | const vectorStore = await PineconeStore.fromExistingIndex( 28 | new OpenAIEmbeddings(), {pineconeIndex: index}, 29 | ); 30 | 31 | // Call LLM and stream output 32 | const encoder = new TextEncoder(); 33 | const stream = new TransformStream(); 34 | const writer = stream.writable.getWriter(); 35 | const llm = new ChatOpenAI({ 36 | temperature: 0.0, 37 | streaming: true, 38 | callbackManager: CallbackManager.fromHandlers({ 39 | handleLLMNewToken: async (token) => { 40 | await writer.ready; 41 | await writer.write(encoder.encode(`data: ${token.replace(/["'\n\r]/g,'')}\n\n`)); 42 | }, 43 | handleLLMEnd: async () => { 44 | await writer.ready; 45 | await writer.close(); 46 | }, 47 | handleLLMError: async (e) => { 48 | await writer.ready; 49 | await writer.abort(e); 50 | }, 51 | }), 52 | }); 53 | 54 | const chain = VectorDBQAChain.fromLLM(llm, vectorStore); 55 | chain.returnSourceDocuments=false; 56 | chain.k=4; 57 | 58 | chain.call({ 59 | query: prompt, 60 | }).catch(console.error); 61 | 62 | return new NextResponse(stream.readable, { 63 | headers: { 64 | "Content-Type": "text/event-stream", 65 | "Cache-Control": "no-cache", 66 | }, 67 | }); 68 | } -------------------------------------------------------------------------------- /pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { Answer } from "@/components/Answer/Answer"; 2 | import { Footer } from "@/components/Footer"; 3 | import { Navbar } from "@/components/Navbar"; 4 | import { LEXChunk } from "@/types"; 5 | import { IconArrowRight, IconExternalLink, IconSearch } from "@tabler/icons-react"; 6 | import Head from "next/head"; 7 | import Image from "next/image"; 8 | import { KeyboardEvent, useEffect, useRef, useState } from "react"; 9 | import { fetchEventSource } from '@microsoft/fetch-event-source'; 10 | 11 | export default function Home() { 12 | 13 | const inputRef = useRef(null); 14 | const [query, setQuery] = useState(""); 15 | const [chunks, setChunks] = useState([]); 16 | const [answer, setAnswer] = useState(""); 17 | const [loading, setLoading] = useState(false); 18 | const [showSettings, setShowSettings] = useState(false); 19 | 20 | // Handle answer 21 | const handleAnswer = async () => { 22 | 23 | if (!query) { 24 | alert("Please enter a query."); 25 | return; 26 | } 27 | 28 | setAnswer(""); 29 | setChunks([]); 30 | setLoading(true); 31 | 32 | // Similarity search for relevant chunks 33 | const search_results = await fetch("/api/search", { 34 | method: "POST", 35 | headers: { 36 | "Content-Type": "application/json" 37 | }, 38 | body: JSON.stringify({ query }) 39 | }); 40 | 41 | if (!search_results.ok) { 42 | setLoading(false); 43 | throw new Error(search_results.statusText); 44 | } 45 | const results: LEXChunk[] = await search_results.json(); 46 | setChunks(results); 47 | 48 | // Prompt for LLM summarization 49 | const prompt = `You are a helpful assistant that accurately answers queries using Lex Fridman podcast episodes. Use the text provided to form your answer, but avoid copying word-for-word from the posts. Try to use your own words when possible. Keep your answer under 5 sentences. Be accurate, helpful, concise, and clear. Use the following passages to provide an answer to the query: "${query}"` 50 | const ctrl = new AbortController(); 51 | 52 | fetchEventSource("/api/vectordbqa", { 53 | method: "POST", 54 | headers: { 55 | "Content-Type": "application/json" 56 | }, 57 | body: JSON.stringify({ prompt }), 58 | onmessage: (event) => { 59 | setLoading(false); 60 | if (event.data === "DONE") { 61 | // Complete 62 | } else { 63 | // Stream text 64 | setAnswer((prev) => prev + event.data); 65 | } 66 | }}); 67 | 68 | }; 69 | 70 | const handleKeyDown = (e: KeyboardEvent) => { 71 | if (e.key === "Enter") { 72 | handleAnswer(); 73 | } 74 | }; 75 | 76 | // Render page 77 | return ( 78 | <> 79 | 80 | Lex GPT 81 | 85 | 89 | 93 | 94 | 95 |
96 | 97 |
98 |
99 | { ( 100 |
101 | 102 | setQuery(e.target.value)} 109 | onKeyDown={handleKeyDown} 110 | /> 111 |
112 | ) } 113 | {loading ? ( 114 |
115 | 116 |
Passages
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | ) : answer ? ( 126 |
127 |
Answer
128 | 129 | 130 |
131 |
Passages
132 | 133 | {chunks.map((chunk, index) => ( 134 |
135 |
136 |
137 |
138 | {chunk.metadata.title} 145 |
146 |
{chunk.metadata.title}
147 |
148 |
149 | 155 | 156 | 157 |
158 |
{chunk.pageContent}
159 |
160 |
161 | ))} 162 |
163 |
164 | ) : chunks.length > 0 ? ( 165 |
166 |
Passages
167 | {chunks.map((chunk, index) => ( 168 |
169 |
170 |
171 |
172 | {chunk.metadata.title} 179 |
180 |
{chunk.metadata.title}
181 |
182 |
183 | 189 | 190 | 191 |
192 |
{chunk.pageContent}
193 |
194 |
195 | ))} 196 |
197 | ) : ( 198 |
{`AI-powered search and chat for the Lex Fridman podcast.`}
199 | )} 200 |
201 |
202 |
203 |
204 | 205 | ); 206 | } 207 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/.DS_Store -------------------------------------------------------------------------------- /public/0001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0001.jpg -------------------------------------------------------------------------------- /public/0002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0002.jpg -------------------------------------------------------------------------------- /public/0003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0003.jpg -------------------------------------------------------------------------------- /public/0004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0004.jpg -------------------------------------------------------------------------------- /public/0005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0005.jpg -------------------------------------------------------------------------------- /public/0006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0006.jpg -------------------------------------------------------------------------------- /public/0007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0007.jpg -------------------------------------------------------------------------------- /public/0008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0008.jpg -------------------------------------------------------------------------------- /public/0009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0009.jpg -------------------------------------------------------------------------------- /public/0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0010.jpg -------------------------------------------------------------------------------- /public/0011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0011.jpg -------------------------------------------------------------------------------- /public/0012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0012.jpg -------------------------------------------------------------------------------- /public/0013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0013.jpg -------------------------------------------------------------------------------- /public/0014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0014.jpg -------------------------------------------------------------------------------- /public/0015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0015.jpg -------------------------------------------------------------------------------- /public/0016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0016.jpg -------------------------------------------------------------------------------- /public/0017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0017.jpg -------------------------------------------------------------------------------- /public/0018.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0018.jpg -------------------------------------------------------------------------------- /public/0019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0019.jpg -------------------------------------------------------------------------------- /public/0020.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0020.jpg -------------------------------------------------------------------------------- /public/0021.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0021.jpg -------------------------------------------------------------------------------- /public/0022.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0022.jpg -------------------------------------------------------------------------------- /public/0023.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0023.jpg -------------------------------------------------------------------------------- /public/0024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0024.jpg -------------------------------------------------------------------------------- /public/0025.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0025.jpg -------------------------------------------------------------------------------- /public/0026.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0026.jpg -------------------------------------------------------------------------------- /public/0027.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0027.jpg -------------------------------------------------------------------------------- /public/0028.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0028.jpg -------------------------------------------------------------------------------- /public/0029.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0029.jpg -------------------------------------------------------------------------------- /public/0030.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0030.jpg -------------------------------------------------------------------------------- /public/0031.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0031.jpg -------------------------------------------------------------------------------- /public/0032.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0032.jpg -------------------------------------------------------------------------------- /public/0033.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0033.jpg -------------------------------------------------------------------------------- /public/0034.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0034.jpg -------------------------------------------------------------------------------- /public/0035.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0035.jpg -------------------------------------------------------------------------------- /public/0036.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0036.jpg -------------------------------------------------------------------------------- /public/0037.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0037.jpg -------------------------------------------------------------------------------- /public/0038.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0038.jpg -------------------------------------------------------------------------------- /public/0039.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0039.jpg -------------------------------------------------------------------------------- /public/0040.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0040.jpg -------------------------------------------------------------------------------- /public/0041.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0041.jpg -------------------------------------------------------------------------------- /public/0042.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0042.jpg -------------------------------------------------------------------------------- /public/0043.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0043.jpg -------------------------------------------------------------------------------- /public/0044.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0044.jpg -------------------------------------------------------------------------------- /public/0045.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0045.jpg -------------------------------------------------------------------------------- /public/0046.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0046.jpg -------------------------------------------------------------------------------- /public/0047.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0047.jpg -------------------------------------------------------------------------------- /public/0048.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0048.jpg -------------------------------------------------------------------------------- /public/0049.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0049.jpg -------------------------------------------------------------------------------- /public/0050.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0050.jpg -------------------------------------------------------------------------------- /public/0051.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0051.jpg -------------------------------------------------------------------------------- /public/0052.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0052.jpg -------------------------------------------------------------------------------- /public/0053.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0053.jpg -------------------------------------------------------------------------------- /public/0054.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0054.jpg -------------------------------------------------------------------------------- /public/0055.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0055.jpg -------------------------------------------------------------------------------- /public/0056.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0056.jpg -------------------------------------------------------------------------------- /public/0057.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0057.jpg -------------------------------------------------------------------------------- /public/0058.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0058.jpg -------------------------------------------------------------------------------- /public/0059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0059.jpg -------------------------------------------------------------------------------- /public/0060.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0060.jpg -------------------------------------------------------------------------------- /public/0061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0061.jpg -------------------------------------------------------------------------------- /public/0062.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0062.jpg -------------------------------------------------------------------------------- /public/0063.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0063.jpg -------------------------------------------------------------------------------- /public/0064.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0064.jpg -------------------------------------------------------------------------------- /public/0065.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0065.jpg -------------------------------------------------------------------------------- /public/0066.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0066.jpg -------------------------------------------------------------------------------- /public/0067.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0067.jpg -------------------------------------------------------------------------------- /public/0068.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0068.jpg -------------------------------------------------------------------------------- /public/0069.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0069.jpg -------------------------------------------------------------------------------- /public/0070.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0070.jpg -------------------------------------------------------------------------------- /public/0071.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0071.jpg -------------------------------------------------------------------------------- /public/0072.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0072.jpg -------------------------------------------------------------------------------- /public/0073.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0073.jpg -------------------------------------------------------------------------------- /public/0074.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0074.jpg -------------------------------------------------------------------------------- /public/0075.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0075.jpg -------------------------------------------------------------------------------- /public/0076.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0076.jpg -------------------------------------------------------------------------------- /public/0077.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0077.jpg -------------------------------------------------------------------------------- /public/0078.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0078.jpg -------------------------------------------------------------------------------- /public/0079.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0079.jpg -------------------------------------------------------------------------------- /public/0080.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0080.jpg -------------------------------------------------------------------------------- /public/0081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0081.jpg -------------------------------------------------------------------------------- /public/0082.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0082.jpg -------------------------------------------------------------------------------- /public/0083.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0083.jpg -------------------------------------------------------------------------------- /public/0084.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0084.jpg -------------------------------------------------------------------------------- /public/0085.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0085.jpg -------------------------------------------------------------------------------- /public/0086.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0086.jpg -------------------------------------------------------------------------------- /public/0087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0087.jpg -------------------------------------------------------------------------------- /public/0088.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0088.jpg -------------------------------------------------------------------------------- /public/0089.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0089.jpg -------------------------------------------------------------------------------- /public/0090.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0090.jpg -------------------------------------------------------------------------------- /public/0091.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0091.jpg -------------------------------------------------------------------------------- /public/0092.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0092.jpg -------------------------------------------------------------------------------- /public/0093.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0093.jpg -------------------------------------------------------------------------------- /public/0094.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0094.jpg -------------------------------------------------------------------------------- /public/0095.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0095.jpg -------------------------------------------------------------------------------- /public/0096.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0096.jpg -------------------------------------------------------------------------------- /public/0097.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0097.jpg -------------------------------------------------------------------------------- /public/0098.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0098.jpg -------------------------------------------------------------------------------- /public/0099.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0099.jpg -------------------------------------------------------------------------------- /public/0101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0101.jpg -------------------------------------------------------------------------------- /public/0102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0102.jpg -------------------------------------------------------------------------------- /public/0103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0103.jpg -------------------------------------------------------------------------------- /public/0104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0104.jpg -------------------------------------------------------------------------------- /public/0105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0105.jpg -------------------------------------------------------------------------------- /public/0106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0106.jpg -------------------------------------------------------------------------------- /public/0107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0107.jpg -------------------------------------------------------------------------------- /public/0108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0108.jpg -------------------------------------------------------------------------------- /public/0109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0109.jpg -------------------------------------------------------------------------------- /public/0110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0110.jpg -------------------------------------------------------------------------------- /public/0111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0111.jpg -------------------------------------------------------------------------------- /public/0112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0112.jpg -------------------------------------------------------------------------------- /public/0113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0113.jpg -------------------------------------------------------------------------------- /public/0114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0114.jpg -------------------------------------------------------------------------------- /public/0115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0115.jpg -------------------------------------------------------------------------------- /public/0116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0116.jpg -------------------------------------------------------------------------------- /public/0117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0117.jpg -------------------------------------------------------------------------------- /public/0118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0118.jpg -------------------------------------------------------------------------------- /public/0119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0119.jpg -------------------------------------------------------------------------------- /public/0120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0120.jpg -------------------------------------------------------------------------------- /public/0121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0121.jpg -------------------------------------------------------------------------------- /public/0122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0122.jpg -------------------------------------------------------------------------------- /public/0123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0123.jpg -------------------------------------------------------------------------------- /public/0124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0124.jpg -------------------------------------------------------------------------------- /public/0125.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0125.jpg -------------------------------------------------------------------------------- /public/0126.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0126.jpg -------------------------------------------------------------------------------- /public/0127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0127.jpg -------------------------------------------------------------------------------- /public/0128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0128.jpg -------------------------------------------------------------------------------- /public/0129.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0129.jpg -------------------------------------------------------------------------------- /public/0130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0130.jpg -------------------------------------------------------------------------------- /public/0131.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0131.jpg -------------------------------------------------------------------------------- /public/0132.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0132.jpg -------------------------------------------------------------------------------- /public/0133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0133.jpg -------------------------------------------------------------------------------- /public/0134.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0134.jpg -------------------------------------------------------------------------------- /public/0135.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0135.jpg -------------------------------------------------------------------------------- /public/0136.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0136.jpg -------------------------------------------------------------------------------- /public/0137.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0137.jpg -------------------------------------------------------------------------------- /public/0138.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0138.jpg -------------------------------------------------------------------------------- /public/0139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0139.jpg -------------------------------------------------------------------------------- /public/0140.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0140.jpg -------------------------------------------------------------------------------- /public/0141.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0141.jpg -------------------------------------------------------------------------------- /public/0142.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0142.jpg -------------------------------------------------------------------------------- /public/0143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0143.jpg -------------------------------------------------------------------------------- /public/0144.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0144.jpg -------------------------------------------------------------------------------- /public/0145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0145.jpg -------------------------------------------------------------------------------- /public/0146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0146.jpg -------------------------------------------------------------------------------- /public/0147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0147.jpg -------------------------------------------------------------------------------- /public/0148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0148.jpg -------------------------------------------------------------------------------- /public/0149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0149.jpg -------------------------------------------------------------------------------- /public/0150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0150.jpg -------------------------------------------------------------------------------- /public/0151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0151.jpg -------------------------------------------------------------------------------- /public/0152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0152.jpg -------------------------------------------------------------------------------- /public/0153.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0153.jpg -------------------------------------------------------------------------------- /public/0154.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0154.jpg -------------------------------------------------------------------------------- /public/0155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0155.jpg -------------------------------------------------------------------------------- /public/0156.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0156.jpg -------------------------------------------------------------------------------- /public/0157.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0157.jpg -------------------------------------------------------------------------------- /public/0158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0158.jpg -------------------------------------------------------------------------------- /public/0159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0159.jpg -------------------------------------------------------------------------------- /public/0160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0160.jpg -------------------------------------------------------------------------------- /public/0161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0161.jpg -------------------------------------------------------------------------------- /public/0162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0162.jpg -------------------------------------------------------------------------------- /public/0163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0163.jpg -------------------------------------------------------------------------------- /public/0164.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0164.jpg -------------------------------------------------------------------------------- /public/0165.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0165.jpg -------------------------------------------------------------------------------- /public/0166.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0166.jpg -------------------------------------------------------------------------------- /public/0167.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0167.jpg -------------------------------------------------------------------------------- /public/0168.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0168.jpg -------------------------------------------------------------------------------- /public/0169.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0169.jpg -------------------------------------------------------------------------------- /public/0170.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0170.jpg -------------------------------------------------------------------------------- /public/0171.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0171.jpg -------------------------------------------------------------------------------- /public/0172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0172.jpg -------------------------------------------------------------------------------- /public/0173.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0173.jpg -------------------------------------------------------------------------------- /public/0174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0174.jpg -------------------------------------------------------------------------------- /public/0175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0175.jpg -------------------------------------------------------------------------------- /public/0176.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0176.jpg -------------------------------------------------------------------------------- /public/0177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0177.jpg -------------------------------------------------------------------------------- /public/0178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0178.jpg -------------------------------------------------------------------------------- /public/0179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0179.jpg -------------------------------------------------------------------------------- /public/0180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0180.jpg -------------------------------------------------------------------------------- /public/0181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0181.jpg -------------------------------------------------------------------------------- /public/0182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0182.jpg -------------------------------------------------------------------------------- /public/0183.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0183.jpg -------------------------------------------------------------------------------- /public/0184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0184.jpg -------------------------------------------------------------------------------- /public/0185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0185.jpg -------------------------------------------------------------------------------- /public/0186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0186.jpg -------------------------------------------------------------------------------- /public/0187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0187.jpg -------------------------------------------------------------------------------- /public/0188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0188.jpg -------------------------------------------------------------------------------- /public/0189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0189.jpg -------------------------------------------------------------------------------- /public/0190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0190.jpg -------------------------------------------------------------------------------- /public/0191.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0191.jpg -------------------------------------------------------------------------------- /public/0192.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0192.jpg -------------------------------------------------------------------------------- /public/0193.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0193.jpg -------------------------------------------------------------------------------- /public/0194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0194.jpg -------------------------------------------------------------------------------- /public/0195.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0195.jpg -------------------------------------------------------------------------------- /public/0196.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0196.jpg -------------------------------------------------------------------------------- /public/0197.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0197.jpg -------------------------------------------------------------------------------- /public/0198.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0198.jpg -------------------------------------------------------------------------------- /public/0199.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0199.jpg -------------------------------------------------------------------------------- /public/0200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0200.jpg -------------------------------------------------------------------------------- /public/0201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0201.jpg -------------------------------------------------------------------------------- /public/0202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0202.jpg -------------------------------------------------------------------------------- /public/0203.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0203.jpg -------------------------------------------------------------------------------- /public/0204.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0204.jpg -------------------------------------------------------------------------------- /public/0205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0205.jpg -------------------------------------------------------------------------------- /public/0206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0206.jpg -------------------------------------------------------------------------------- /public/0207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0207.jpg -------------------------------------------------------------------------------- /public/0208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0208.jpg -------------------------------------------------------------------------------- /public/0209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0209.jpg -------------------------------------------------------------------------------- /public/0210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0210.jpg -------------------------------------------------------------------------------- /public/0211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0211.jpg -------------------------------------------------------------------------------- /public/0212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0212.jpg -------------------------------------------------------------------------------- /public/0213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0213.jpg -------------------------------------------------------------------------------- /public/0214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0214.jpg -------------------------------------------------------------------------------- /public/0215.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0215.jpg -------------------------------------------------------------------------------- /public/0216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0216.jpg -------------------------------------------------------------------------------- /public/0217.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0217.jpg -------------------------------------------------------------------------------- /public/0218.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0218.jpg -------------------------------------------------------------------------------- /public/0219.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0219.jpg -------------------------------------------------------------------------------- /public/0220.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0220.jpg -------------------------------------------------------------------------------- /public/0221.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0221.jpg -------------------------------------------------------------------------------- /public/0222.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0222.jpg -------------------------------------------------------------------------------- /public/0223.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0223.jpg -------------------------------------------------------------------------------- /public/0224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0224.jpg -------------------------------------------------------------------------------- /public/0225.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0225.jpg -------------------------------------------------------------------------------- /public/0226.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0226.jpg -------------------------------------------------------------------------------- /public/0227.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0227.jpg -------------------------------------------------------------------------------- /public/0228.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0228.jpg -------------------------------------------------------------------------------- /public/0229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0229.jpg -------------------------------------------------------------------------------- /public/0230.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0230.jpg -------------------------------------------------------------------------------- /public/0231.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0231.jpg -------------------------------------------------------------------------------- /public/0232.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0232.jpg -------------------------------------------------------------------------------- /public/0233.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0233.jpg -------------------------------------------------------------------------------- /public/0234.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0234.jpg -------------------------------------------------------------------------------- /public/0235.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0235.jpg -------------------------------------------------------------------------------- /public/0236.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0236.jpg -------------------------------------------------------------------------------- /public/0237.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0237.jpg -------------------------------------------------------------------------------- /public/0238.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0238.jpg -------------------------------------------------------------------------------- /public/0239.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0239.jpg -------------------------------------------------------------------------------- /public/0240.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0240.jpg -------------------------------------------------------------------------------- /public/0241.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0241.jpg -------------------------------------------------------------------------------- /public/0242.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0242.jpg -------------------------------------------------------------------------------- /public/0243.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0243.jpg -------------------------------------------------------------------------------- /public/0244.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0244.jpg -------------------------------------------------------------------------------- /public/0245.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0245.jpg -------------------------------------------------------------------------------- /public/0246.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0246.jpg -------------------------------------------------------------------------------- /public/0247.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0247.jpg -------------------------------------------------------------------------------- /public/0248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0248.jpg -------------------------------------------------------------------------------- /public/0249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0249.jpg -------------------------------------------------------------------------------- /public/0250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0250.jpg -------------------------------------------------------------------------------- /public/0251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0251.jpg -------------------------------------------------------------------------------- /public/0252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0252.jpg -------------------------------------------------------------------------------- /public/0253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0253.jpg -------------------------------------------------------------------------------- /public/0254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0254.jpg -------------------------------------------------------------------------------- /public/0255.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0255.jpg -------------------------------------------------------------------------------- /public/0256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0256.jpg -------------------------------------------------------------------------------- /public/0257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0257.jpg -------------------------------------------------------------------------------- /public/0258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0258.jpg -------------------------------------------------------------------------------- /public/0259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0259.jpg -------------------------------------------------------------------------------- /public/0260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0260.jpg -------------------------------------------------------------------------------- /public/0261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0261.jpg -------------------------------------------------------------------------------- /public/0262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0262.jpg -------------------------------------------------------------------------------- /public/0263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0263.jpg -------------------------------------------------------------------------------- /public/0264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0264.jpg -------------------------------------------------------------------------------- /public/0265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0265.jpg -------------------------------------------------------------------------------- /public/0266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0266.jpg -------------------------------------------------------------------------------- /public/0267.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0267.jpg -------------------------------------------------------------------------------- /public/0269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0269.jpg -------------------------------------------------------------------------------- /public/0270.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0270.jpg -------------------------------------------------------------------------------- /public/0271.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0271.jpg -------------------------------------------------------------------------------- /public/0272.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0272.jpg -------------------------------------------------------------------------------- /public/0273.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0273.jpg -------------------------------------------------------------------------------- /public/0274.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0274.jpg -------------------------------------------------------------------------------- /public/0275.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0275.jpg -------------------------------------------------------------------------------- /public/0276.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0276.jpg -------------------------------------------------------------------------------- /public/0277.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0277.jpg -------------------------------------------------------------------------------- /public/0278.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0278.jpg -------------------------------------------------------------------------------- /public/0279.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0279.jpg -------------------------------------------------------------------------------- /public/0280.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0280.jpg -------------------------------------------------------------------------------- /public/0281.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0281.jpg -------------------------------------------------------------------------------- /public/0284.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0284.jpg -------------------------------------------------------------------------------- /public/0285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0285.jpg -------------------------------------------------------------------------------- /public/0286.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0286.jpg -------------------------------------------------------------------------------- /public/0288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0288.jpg -------------------------------------------------------------------------------- /public/0289.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0289.jpg -------------------------------------------------------------------------------- /public/0290.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0290.jpg -------------------------------------------------------------------------------- /public/0292.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0292.jpg -------------------------------------------------------------------------------- /public/0293.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0293.jpg -------------------------------------------------------------------------------- /public/0294.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0294.jpg -------------------------------------------------------------------------------- /public/0295.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0295.jpg -------------------------------------------------------------------------------- /public/0296.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0296.jpg -------------------------------------------------------------------------------- /public/0297.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0297.jpg -------------------------------------------------------------------------------- /public/0298.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0298.jpg -------------------------------------------------------------------------------- /public/0299.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0299.jpg -------------------------------------------------------------------------------- /public/0300.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0300.jpg -------------------------------------------------------------------------------- /public/0301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0301.jpg -------------------------------------------------------------------------------- /public/0302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0302.jpg -------------------------------------------------------------------------------- /public/0303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0303.jpg -------------------------------------------------------------------------------- /public/0304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0304.jpg -------------------------------------------------------------------------------- /public/0305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0305.jpg -------------------------------------------------------------------------------- /public/0306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0306.jpg -------------------------------------------------------------------------------- /public/0307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0307.jpg -------------------------------------------------------------------------------- /public/0308.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0308.jpg -------------------------------------------------------------------------------- /public/0309.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0309.jpg -------------------------------------------------------------------------------- /public/0310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0310.jpg -------------------------------------------------------------------------------- /public/0311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0311.jpg -------------------------------------------------------------------------------- /public/0312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0312.jpg -------------------------------------------------------------------------------- /public/0313.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0313.jpg -------------------------------------------------------------------------------- /public/0314.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0314.jpg -------------------------------------------------------------------------------- /public/0315.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0315.jpg -------------------------------------------------------------------------------- /public/0316.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0316.jpg -------------------------------------------------------------------------------- /public/0317.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0317.jpg -------------------------------------------------------------------------------- /public/0318.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0318.jpg -------------------------------------------------------------------------------- /public/0319.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0319.jpg -------------------------------------------------------------------------------- /public/0320.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0320.jpg -------------------------------------------------------------------------------- /public/0321.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0321.jpg -------------------------------------------------------------------------------- /public/0322.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0322.jpg -------------------------------------------------------------------------------- /public/0323.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0323.jpg -------------------------------------------------------------------------------- /public/0324.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0324.jpg -------------------------------------------------------------------------------- /public/0325.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0325.jpg -------------------------------------------------------------------------------- /public/0326.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0326.jpg -------------------------------------------------------------------------------- /public/0327.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0327.jpg -------------------------------------------------------------------------------- /public/0328.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0328.jpg -------------------------------------------------------------------------------- /public/0329.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0329.jpg -------------------------------------------------------------------------------- /public/0330.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0330.jpg -------------------------------------------------------------------------------- /public/0331.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0331.jpg -------------------------------------------------------------------------------- /public/0332.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0332.jpg -------------------------------------------------------------------------------- /public/0333.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0333.jpg -------------------------------------------------------------------------------- /public/0334.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0334.jpg -------------------------------------------------------------------------------- /public/0335.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0335.jpg -------------------------------------------------------------------------------- /public/0336.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0336.jpg -------------------------------------------------------------------------------- /public/0337.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0337.jpg -------------------------------------------------------------------------------- /public/0338.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0338.jpg -------------------------------------------------------------------------------- /public/0339.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0339.jpg -------------------------------------------------------------------------------- /public/0340.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0340.jpg -------------------------------------------------------------------------------- /public/0341.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0341.jpg -------------------------------------------------------------------------------- /public/0342.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0342.jpg -------------------------------------------------------------------------------- /public/0343.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0343.jpg -------------------------------------------------------------------------------- /public/0344.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0344.jpg -------------------------------------------------------------------------------- /public/0345.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0345.jpg -------------------------------------------------------------------------------- /public/0346.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0346.jpg -------------------------------------------------------------------------------- /public/0347.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0347.jpg -------------------------------------------------------------------------------- /public/0348.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0348.jpg -------------------------------------------------------------------------------- /public/0349.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0349.jpg -------------------------------------------------------------------------------- /public/0350.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0350.jpg -------------------------------------------------------------------------------- /public/0351.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0351.jpg -------------------------------------------------------------------------------- /public/0352.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0352.jpg -------------------------------------------------------------------------------- /public/0353.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0353.jpg -------------------------------------------------------------------------------- /public/0354.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0354.jpg -------------------------------------------------------------------------------- /public/0355.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0355.jpg -------------------------------------------------------------------------------- /public/0356.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0356.jpg -------------------------------------------------------------------------------- /public/0357.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0357.jpg -------------------------------------------------------------------------------- /public/0358.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0358.jpg -------------------------------------------------------------------------------- /public/0359.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0359.jpg -------------------------------------------------------------------------------- /public/0360.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0360.jpg -------------------------------------------------------------------------------- /public/0361.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0361.jpg -------------------------------------------------------------------------------- /public/0362.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0362.jpg -------------------------------------------------------------------------------- /public/0363.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0363.jpg -------------------------------------------------------------------------------- /public/0364.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0364.jpg -------------------------------------------------------------------------------- /public/0365.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0365.jpg -------------------------------------------------------------------------------- /public/0366.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0366.jpg -------------------------------------------------------------------------------- /public/0367.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0367.jpg -------------------------------------------------------------------------------- /public/0368.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0368.jpg -------------------------------------------------------------------------------- /public/0369.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/0369.jpg -------------------------------------------------------------------------------- /public/favicon.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/favicon.jpeg -------------------------------------------------------------------------------- /public/lex.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rlancemartin/lex-gpt/07b05e8c36f5087a4614e0e716415825d25d81a1/public/lex.jpeg -------------------------------------------------------------------------------- /scripts/audio_transcription/episodes.csv: -------------------------------------------------------------------------------- 1 | ,index,number,link,title,img 2 | 0,"Paul Rosolie: Amazon Jungle, Uncontacted Tribes, Anacondas, and Ayahuasca | Lex Fridman Podcast #369",369.0,https://www.youtube.com/watch?v=gPfriiHBBek&list=UUSHZKyawb77ixDdsGog4iWA&index=1&pp=iAQB,"Paul Rosolie: Amazon Jungle, Uncontacted Tribes, Anacondas, and Ayahuasca | Lex Fridman Podcast #369",https://i.ytimg.com/vi/gPfriiHBBek/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAgoUYvKbwt5oSKCoM2YGR__0bmVQ 3 | -------------------------------------------------------------------------------- /scripts/dump_audio.py: -------------------------------------------------------------------------------- 1 | import yt_dlp 2 | import logging 3 | import argparse 4 | import requests 5 | import pandas as pd 6 | from youtubesearchpython import * 7 | 8 | def get_episodes(channel_id,last_episode,logging): 9 | 10 | # Get playlist 11 | playlist = Playlist(playlist_from_channel_id(channel_id)) 12 | while playlist.hasMoreVideos: 13 | print('Getting more videos...') 14 | playlist.getNextVideos() 15 | print(f'Videos Retrieved: {len(playlist.videos)}') 16 | 17 | # Store 18 | stor_metadata=pd.DataFrame() 19 | for v in playlist.videos: 20 | try: 21 | ep_number = int(v['title'].split("|")[-1].split("#")[-1]) 22 | stor_metadata.loc[v['title'],'number']=ep_number 23 | stor_metadata.loc[v['title'],'link']=v['link'] 24 | stor_metadata.loc[v['title'],'title']=v['title'] 25 | stor_metadata.loc[v['title'],'img']=v['thumbnails'][3]['url'] 26 | except: 27 | logging.info("Metadata extraction failed on %s", v['title']) 28 | 29 | stor_metadata = stor_metadata[stor_metadata.number > last_episode] 30 | return stor_metadata 31 | 32 | def dump_audio(stor_metadata,logging): 33 | # Iterate through episodes 34 | for ix in stor_metadata.index: 35 | ep_number=int(stor_metadata.loc[ix,'number']) 36 | logging.info("Dumping audio for: %s"%ep_number) 37 | img_url=stor_metadata.loc[ix,'img'] 38 | ep_link=stor_metadata.loc[ix,'link'] 39 | # Write img 40 | with open("../public/0%s.jpg"%str(ep_number), 'wb') as f: 41 | response = requests.get(img_url) 42 | f.write(response.content) 43 | # Write audio 44 | ydl_opts = { 45 | 'format': 'm4a/bestaudio/best', 46 | 'outtmpl': 'audio/%s.m4a'%str(ep_number), 47 | 'noplaylist': True, 48 | 'postprocessors': [{ 49 | 'key': 'FFmpegExtractAudio', 50 | 'preferredcodec': 'm4a', 51 | }]} 52 | with yt_dlp.YoutubeDL(ydl_opts) as ydl: 53 | error_code = ydl.download(ep_link) 54 | # Save 55 | stor_metadata.reset_index().to_csv("audio_transcription/episodes.csv") 56 | 57 | def get_last_episode(): 58 | parser = argparse.ArgumentParser(description='Process last_episode') 59 | parser.add_argument('last_episode', type=int, help='the last episode number') 60 | args = parser.parse_args() 61 | return args.last_episode 62 | 63 | def main(): 64 | # Set up logger 65 | logging.basicConfig(filename='audio_dump.log', 66 | filemode='w', 67 | level=logging.DEBUG) 68 | 69 | # Lex Fridman 70 | last_episode = get_last_episode() 71 | channel_id = "UCSHZKyawb77ixDdsGog4iWA" 72 | stor_metadata = get_episodes(channel_id,last_episode,logging) 73 | dump_audio(stor_metadata,logging) 74 | 75 | if __name__ == '__main__': 76 | main() 77 | -------------------------------------------------------------------------------- /scripts/eval.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import re\n", 10 | "import json\n", 11 | "import numpy as np\n", 12 | "import pandas as pd\n", 13 | "from langchain.vectorstores import Chroma\n", 14 | "from langchain.chat_models import ChatOpenAI\n", 15 | "from langchain.chains import QAGenerationChain\n", 16 | "from langchain.document_loaders import TextLoader\n", 17 | "from langchain.embeddings.openai import OpenAIEmbeddings\n", 18 | "from langchain.text_splitter import RecursiveCharacterTextSplitter" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "# Read\n", 28 | "episode_id = \"0333\"\n", 29 | "doc = pd.read_csv(\"audio_transcription/%s.txt\"%episode_id,sep='\\t')\n", 30 | "doc.columns=['links','time','chunks']\n", 31 | "\n", 32 | "# Clean text chunks \n", 33 | "doc['clean_chunks']=doc['chunks'].astype(str).apply(lambda x: x.strip())\n", 34 | "\n", 35 | "# Write updated file (b/c we isolate sections for question-answer formulation below)\n", 36 | "with open('audio_transcription/%s_text.txt'%episode_id, \"w\") as f:\n", 37 | " for i in doc.index:\n", 38 | " string = doc.loc[i,'clean_chunks']\n", 39 | " f.write(string + \"\\n\") " 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 6, 45 | "metadata": {}, 46 | "outputs": [ 47 | { 48 | "data": { 49 | "text/plain": [ 50 | "[{'question': 'What is the transformer architecture in deep learning?',\n", 51 | " 'answer': 'The transformer architecture is a neural network architecture that is general purpose and can process different sensory modalities like vision, audio, text, and video. It is simultaneously expressive in the forward pass, optimizable via backpropagation, gradient descent, and efficient high parallelism compute graph.'},\n", 52 | " {'question': 'What is a transformer and how is it designed?',\n", 53 | " 'answer': 'A transformer is a series of blocks with attention and a multilayer perceptron. It is designed to be very expressive in a forward pass, optimizable in a backward pass, and efficient in hardware. The residual connections support the ability to learn short algorithms fast and first, and then gradually extend them longer during training.'},\n", 54 | " {'question': 'What is a transformer architecture and why is it important?',\n", 55 | " 'answer': 'A transformer architecture is a type of neural network that is remarkably resilient and can simultaneously optimize for lots of properties of a desirable neural network architecture. It is important because it is a big step in AI and has proven to be extremely powerful and can solve arbitrary problems.'},\n", 56 | " {'question': 'What is a language model and how does it work?',\n", 57 | " 'answer': 'A language model is a system that predicts the next word in a sequence of words. It can be done using count-based models like Ngram models or neural networks like transformers. The objective is simple, but to predict the next word accurately, the model needs to understand the context of the text, which requires a lot of knowledge about the world.'},\n", 58 | " {'question': \"What is the author's opinion on the transition to software 2.0?\",\n", 59 | " 'answer': \"The author believes that neural nets are taking over software and that the way we program computers is going to change. The author thinks that at some point, there's going to be a compilation process from the data sets and the objective and the architecture specification into the binary, which is really just the neural net weights and the forward pass of the neural net.\"},\n", 60 | " {'question': 'What is the task of programming in software 2.0?',\n", 61 | " 'answer': 'The task of programming in software 2.0 is changing the data set and loss functions of the neural net, as well as specifying the architecture of the neural net.'},\n", 62 | " {'question': 'What are the three properties of a good dataset for supervised learning?',\n", 63 | " 'answer': 'The three properties of a good dataset for supervised learning are that it needs to be large, accurate, and diverse.'}]" 64 | ] 65 | }, 66 | "execution_count": 6, 67 | "metadata": {}, 68 | "output_type": "execute_result" 69 | } 70 | ], 71 | "source": [ 72 | "# Note: feeding complete file failed for non-obvious reasons (JSON error; searched at length for invalid chars but could not find)\n", 73 | "# In any case, I fed small chunks of the dataset into the QA generation and it worked (and maybe improved the QA since inputs were selected \n", 74 | "filename = 'audio_transcription/0333_text_transformer.txt'\n", 75 | "loader = TextLoader(filename)\n", 76 | "doc_karpathy = loader.load()[0]\n", 77 | "txt_transformer = doc_karpathy.page_content\n", 78 | "\n", 79 | "filename = 'audio_transcription/0333_text_sw2dot0.txt'\n", 80 | "loader = TextLoader(filename)\n", 81 | "doc_karpathy = loader.load()[0]\n", 82 | "txt_sw20 = doc_karpathy.page_content\n", 83 | "\n", 84 | "filename = 'audio_transcription/0333_text_sd.txt'\n", 85 | "loader = TextLoader(filename)\n", 86 | "doc_karpathy = loader.load()[0]\n", 87 | "txt_sd= doc_karpathy.page_content\n", 88 | "\n", 89 | "chain = QAGenerationChain.from_llm(ChatOpenAI(temperature = 0))\n", 90 | "qa_karpathy_transformer = chain.run(txt_transformer)\n", 91 | "\n", 92 | "chain = QAGenerationChain.from_llm(ChatOpenAI(temperature = 0))\n", 93 | "qa_karpathy_sw20 = chain.run(txt_sw20)\n", 94 | "\n", 95 | "chain = QAGenerationChain.from_llm(ChatOpenAI(temperature = 0))\n", 96 | "qa_karpathy_sd= chain.run(txt_sd)\n", 97 | "\n", 98 | "qa_all = qa_karpathy_transformer + qa_karpathy_sw20 + qa_karpathy_sd\n", 99 | "qa_all" 100 | ] 101 | }, 102 | { 103 | "attachments": {}, 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "`Notes -` \n", 108 | "\n", 109 | "https://langchain.readthedocs.io/en/latest/use_cases/evaluation/qa_generation.html" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 22, 115 | "metadata": {}, 116 | "outputs": [], 117 | "source": [ 118 | "from langchain.llms import OpenAI\n", 119 | "from langchain.vectorstores import Chroma\n", 120 | "from langchain.vectorstores import FAISS\n", 121 | "from langchain.chains import VectorDBQA\n", 122 | "from langchain.evaluation.qa import QAEvalChain\n", 123 | "\n", 124 | "def make_splits(chunk_size,overlap,texts,links,episode_id):\n", 125 | "\n", 126 | " text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=overlap) \n", 127 | " splits = text_splitter.split_text(texts)\n", 128 | " bins = np.linspace(0,len(links)-1,len(splits),dtype=int)\n", 129 | " sampled_links = [links[i] for i in bins]\n", 130 | " metadatas=[{\"source\":link,\"id\":episode_id,\"link\":link} for link in sampled_links]\n", 131 | " db = FAISS.from_texts(splits, OpenAIEmbeddings(), metadatas=metadatas) \n", 132 | " chain = VectorDBQA.from_chain_type(llm=ChatOpenAI(temperature=0), \n", 133 | " chain_type=\"stuff\", \n", 134 | " vectorstore=db, \n", 135 | " input_key=\"question\")\n", 136 | " \n", 137 | " return chain \n", 138 | "\n", 139 | "episode_id = \"0333\"\n", 140 | "doc = pd.read_csv(\"audio_transcription/%s.txt\"%episode_id,sep='\\t')\n", 141 | "doc.columns=['links','time','chunks']\n", 142 | "doc['clean_chunks']=doc['chunks'].astype(str).apply(lambda x: x.strip())\n", 143 | "\n", 144 | "chains = {}\n", 145 | "overlap = 50\n", 146 | "for chunk_size in [250,500,1000,2000,3000]:\n", 147 | " chain = make_splits(chunk_size,overlap,list(doc['clean_chunks']),list(doc['links']),episode_id)\n", 148 | " chains[chunk_size] = chain\n" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 36, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "def run_eval(chain):\n", 158 | " predictions = []\n", 159 | " predicted_dataset = []\n", 160 | " for data in qa_all:\n", 161 | " new_data = {\"question\": data[\"question\"],\"answer\": data[\"answer\"]}\n", 162 | " predictions.append(chain(new_data))\n", 163 | " predicted_dataset.append(new_data)\n", 164 | " return predictions,predicted_dataset\n", 165 | "\n", 166 | "predictions_list = []\n", 167 | "scores_list = []\n", 168 | "eval_chain = QAEvalChain.from_llm(llm=ChatOpenAI(temperature=0))\n", 169 | "for chunk_size in [250,500,1000,2000,3000]:\n", 170 | " predictions,predicted_dataset=run_eval(chains[chunk_size])\n", 171 | " predictions_list.append(predictions)\n", 172 | " graded_outputs = eval_chain.evaluate(predicted_dataset, predictions, question_key=\"question\", prediction_key=\"result\")\n", 173 | " scores_list.append(graded_outputs)" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 35, 179 | "metadata": {}, 180 | "outputs": [ 181 | { 182 | "data": { 183 | "text/plain": [ 184 | "[{'text': 'INCORRECT'},\n", 185 | " {'text': 'INCORRECT'},\n", 186 | " {'text': 'CORRECT'},\n", 187 | " {'text': 'CORRECT'},\n", 188 | " {'text': 'CORRECT'},\n", 189 | " {'text': 'INCORRECT'},\n", 190 | " {'text': 'INCORRECT'}]" 191 | ] 192 | }, 193 | "execution_count": 35, 194 | "metadata": {}, 195 | "output_type": "execute_result" 196 | } 197 | ], 198 | "source": [ 199 | "# 250 -\n", 200 | "graded_outputs" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 38, 206 | "metadata": {}, 207 | "outputs": [], 208 | "source": [ 209 | "stor=pd.DataFrame()\n", 210 | "for i,chunk_size in enumerate([250,500,1000,2000,3000]):\n", 211 | " d=scores_list[i]\n", 212 | " incorrect_counts = []\n", 213 | " for dictionary in d:\n", 214 | " if dictionary['text'] == 'INCORRECT':\n", 215 | " incorrect_counts.append(1)\n", 216 | " else:\n", 217 | " incorrect_counts.append(0)\n", 218 | " stor.loc[chunk_size,'num_incorrect']=sum(incorrect_counts)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 42, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [ 227 | "stor['pct_incorrect'] = stor['num_incorrect'] / 7" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 51, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "data": { 237 | "image/png": "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ww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJiuThJjExEWq1GpaWlggODkZmZuZd+yckJKBdu3awsrKCp6cn3njjDdy6dauOqiUiIqL6TtJws379emg0GsyYMQP79u1D586dER4ejvz8fKP9165diylTpmDGjBk4duwYVqxYgfXr12Pq1Kl1XDkRERHVV5KGm/j4eIwdOxbR0dHw9fVFUlISrK2tkZycbLT/L7/8gh49euDpp5+GWq3GgAEDMGrUqP882kNERESNh2ThprS0FFlZWQgLC/unGKUSYWFhyMjIMDpP9+7dkZWVpQ8zZ8+exbZt2zBw4MAq11NSUoKioiKDFxEREcmXuVQrLigoQHl5OVxdXQ3aXV1dcfz4caPzPP300ygoKEDPnj0hhEBZWRlefvnlu56WiouLw6xZs2q1diIiIqq/JB9QXBPp6emYP38+PvroI+zbtw+bNm3C1q1bMWfOnCrniY2NRWFhof514cKFOqyYiIiI6ppkR26cnJxgZmaGvLw8g/a8vDy4ubkZneedd97B6NGjMWbMGACAn58fiouL8eKLL+Ltt9+GUlk5q6lUKqhUqtrfACIiIqqXJDtyY2FhgYCAAGi1Wn2bTqeDVqtFSEiI0Xlu3LhRKcCYmZkBAIQQ969YIiIiajAkO3IDABqNBlFRUQgMDERQUBASEhJQXFyM6OhoAEBkZCQ8PDwQFxcHABg8eDDi4+PRpUsXBAcH4/Tp03jnnXcwePBgfcghIiKixk3ScBMREYFLly5h+vTpyM3Nhb+/P1JSUvSDjHNycgyO1EybNg0KhQLTpk3DxYsX4ezsjMGDB2PevHlSbQIRERHVMwrRyM7nFBUVwd7eHoWFhbCzs5O6HKJGRT1lq9Ql1IrsBYOkLqFWyGF/yGVf0H+ryfd3g7paioiIiOi/MNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsMNwQERGRrDDcEBERkaww3BAREZGsmEtdANH9pp6yVeoSakX2gkFSl0BE94kcfk/Vp99RPHJDREREslIvwk1iYiLUajUsLS0RHByMzMzMKvv26dMHCoWi0mvQoPqTGImIiEg6koeb9evXQ6PRYMaMGdi3bx86d+6M8PBw5OfnG+2/adMm/PXXX/rX4cOHYWZmhuHDh9dx5URERFQfSR5u4uPjMXbsWERHR8PX1xdJSUmwtrZGcnKy0f6Ojo5wc3PTv3744QdYW1sz3BAREREAicNNaWkpsrKyEBYWpm9TKpUICwtDRkZGtZaxYsUKjBw5EjY2Nkanl5SUoKioyOBFRERE8iVpuCkoKEB5eTlcXV0N2l1dXZGbm/uf82dmZuLw4cMYM2ZMlX3i4uJgb2+vf3l6et5z3URERFR/SX5a6l6sWLECfn5+CAoKqrJPbGwsCgsL9a8LFy7UYYVERERU1yS9z42TkxPMzMyQl5dn0J6Xlwc3N7e7zltcXIx169Zh9uzZd+2nUqmgUqnuuVYiIiJqGCQ9cmNhYYGAgABotVp9m06ng1arRUhIyF3n3bBhA0pKSvDss8/e7zKJiIioAZH8DsUajQZRUVEIDAxEUFAQEhISUFxcjOjoaABAZGQkPDw8EBcXZzDfihUrMHToUDRv3lyKsomIiKiekjzcRERE4NKlS5g+fTpyc3Ph7++PlJQU/SDjnJwcKJWGB5hOnDiBXbt2Yfv27VKUTERERPWY5OEGAGJiYhATE2N0Wnp6eqW2du3aQQhxn6siIiKihqhBXy1FRERE9G8MN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkKww3REREJCsMN0RERCQrDDdEREQkK5KHm8TERKjValhaWiI4OBiZmZl37X/16lWMHz8e7u7uUKlUaNu2LbZt21ZH1RIR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dSIiImqETH4q+JkzZ/Dpp5/izJkzWLx4MVxcXPD999+jZcuW6NixY42WFRMTY/Q0FACkp6ffdd6VK1fWaF1EREQkbyYdEvnxxx/h5+eHvXv3YtOmTbh+/TqAO49fmDFjRq0WSERERFQTJoWbKVOmYO7cufjhhx9gYWGhb+/bty/27NlTa8URERER1ZRJ4ebQoUN44oknKrW7uLigoKDgnosiIiIiMpVJ4cbBwQF//fVXpfb9+/fDw8PjnosiIiIiMpVJ4WbkyJGYPHkycnNzoVAooNPpsHv3brz11luIjIys7RqJiIiIqs2kcDN//nx06NABLVu2xPXr1+Hr64vevXuje/fumDZtWm3XSERERFRtNboUXKfTYeHChdiyZQtKS0sxevRoDBs2DNevX0eXLl3u6SGaRERERLWhRuFm3rx5mDlzJsLCwmBlZYW1a9dCCIHk5OT7VR8RERFRjdTotNSqVavw0UcfITU1FZs3b8a3336LNWvW6B9eSURERCS1GoWbnJwcDBw4UP8+LCwMCoUCf/75Z60XRkRERGSKGoWbsrIyWFpaGrQ1adIEt2/frtWiiIiIiExVozE3Qgg899xzUKlU+rZbt27h5Zdfho2Njb5t06ZNtVchERERUQ3UKNwYexr4s88+W2vFEBEREd2rGoWbTz/99H7VQURERFQrTLqJHxEREVF9xXBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESywnBDREREssJwQ0RERLLCcENERESyUi/CTWJiItRqNSwtLREcHIzMzMwq+27atAmBgYFwcHCAjY0N/P39sXr16jqsloiIiOozycPN+vXrodFoMGPGDOzbtw+dO3dGeHg48vPzjfZ3dHTE22+/jYyMDBw8eBDR0dGIjo5GampqHVdORERE9ZHk4SY+Ph5jx45FdHQ0fH19kZSUBGtrayQnJxvt36dPHzzxxBPo0KEDvL298frrr+PBBx/Erl276rhyIiIiqo8kDTelpaXIyspCWFiYvk2pVCIsLAwZGRn/Ob8QAlqtFidOnEDv3r2N9ikpKUFRUZHBi4iIiORL0nBTUFCA8vJyuLq6GrS7uroiNze3yvkKCwtha2sLCwsLDBo0CP/73//Qv39/o33j4uJgb2+vf3l6etbqNhAREVH9IvlpKVM0bdoUBw4cwK+//op58+ZBo9EgPT3daN/Y2FgUFhbqXxcuXKjbYomIiKhOmUu5cicnJ5iZmSEvL8+gPS8vD25ublXOp1Qq4ePjAwDw9/fHsWPHEBcXhz59+lTqq1KpoFKparVuIiIiqr8kPXJjYWGBgIAAaLVafZtOp4NWq0VISEi1l6PT6VBSUnI/SiQiIqIGRtIjNwCg0WgQFRWFwMBABAUFISEhAcXFxYiOjgYAREZGwsPDA3FxcQDujKEJDAyEt7c3SkpKsG3bNqxevRpLly6VcjOIiIionpA83ERERODSpUuYPn06cnNz4e/vj5SUFP0g45ycHCiV/xxgKi4uxrhx4/DHH3/AysoK7du3x+eff46IiAipNoGIiIjqEcnDDQDExMQgJibG6LR/DxSeO3cu5s6dWwdVERERUUPUIK+WIiIiIqoKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyQrDDREREckKww0RERHJCsMNERERyUq9CDeJiYlQq9WwtLREcHAwMjMzq+z78ccfo1evXmjWrBmaNWuGsLCwu/YnIiKixkXycLN+/XpoNBrMmDED+/btQ+fOnREeHo78/Hyj/dPT0zFq1CikpaUhIyMDnp6eGDBgAC5evFjHlRMREVF9JHm4iY+Px9ixYxEdHQ1fX18kJSXB2toaycnJRvuvWbMG48aNg7+/P9q3b49PPvkEOp0OWq22jisnIiKi+kjScFNaWoqsrCyEhYXp25RKJcLCwpCRkVGtZdy4cQO3b9+Go6Oj0eklJSUoKioyeBEREZF8SRpuCgoKUF5eDldXV4N2V1dX5ObmVmsZkydPRosWLQwC0v8XFxcHe3t7/cvT0/Oe6yYiIqL6S/LTUvdiwYIFWLduHb7++mtYWloa7RMbG4vCwkL968KFC3VcJREREdUlcylX7uTkBDMzM+Tl5Rm05+Xlwc3N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", 238 | "text/plain": [ 239 | "
" 240 | ] 241 | }, 242 | "metadata": {}, 243 | "output_type": "display_data" 244 | } 245 | ], 246 | "source": [ 247 | "import matplotlib.pyplot as plt\n", 248 | "%matplotlib inline\n", 249 | "stor['pct_correct'] = 1 - stor['pct_incorrect']\n", 250 | "stor['pct_correct'].plot(kind='bar')\n", 251 | "plt.title('Percentage of Correct Answers')\n", 252 | "plt.xlabel('Chunk Size')\n", 253 | "plt.ylabel('Percentage')\n", 254 | "plt.show()" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 46, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "text/html": [ 265 | "
\n", 266 | "\n", 279 | "\n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | "
num_incorrectpct_incorrect
2504.00.571429
5002.00.285714
10001.00.142857
20001.00.142857
30002.00.285714
\n", 315 | "
" 316 | ], 317 | "text/plain": [ 318 | " num_incorrect pct_incorrect\n", 319 | "250 4.0 0.571429\n", 320 | "500 2.0 0.285714\n", 321 | "1000 1.0 0.142857\n", 322 | "2000 1.0 0.142857\n", 323 | "3000 2.0 0.285714" 324 | ] 325 | }, 326 | "execution_count": 46, 327 | "metadata": {}, 328 | "output_type": "execute_result" 329 | } 330 | ], 331 | "source": [ 332 | "stor" 333 | ] 334 | } 335 | ], 336 | "metadata": { 337 | "kernelspec": { 338 | "display_name": "Python 3 (ipykernel)", 339 | "language": "python", 340 | "name": "python3" 341 | }, 342 | "language_info": { 343 | "codemirror_mode": { 344 | "name": "ipython", 345 | "version": 3 346 | }, 347 | "file_extension": ".py", 348 | "mimetype": "text/x-python", 349 | "name": "python", 350 | "nbconvert_exporter": "python", 351 | "pygments_lexer": "ipython3", 352 | "version": "3.9.16" 353 | }, 354 | "orig_nbformat": 4 355 | }, 356 | "nbformat": 4, 357 | "nbformat_minor": 2 358 | } 359 | -------------------------------------------------------------------------------- /scripts/get_data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import os,re\n", 10 | "import yt_dlp\n", 11 | "import json\n", 12 | "import time\n", 13 | "import math \n", 14 | "import httplib2\n", 15 | "import requests\n", 16 | "import pinecone \n", 17 | "import pandas as pd\n", 18 | "import numpy as np\n", 19 | "import urllib.request\n", 20 | "from bs4 import BeautifulSoup\n", 21 | "from bs4.element import Comment\n", 22 | "from youtubesearchpython import *\n", 23 | "from langchain.llms import OpenAIChat\n", 24 | "from bs4 import BeautifulSoup, SoupStrainer\n", 25 | "from langchain.vectorstores import Pinecone\n", 26 | "from langchain.chains import VectorDBQAWithSourcesChain\n", 27 | "from langchain.embeddings.openai import OpenAIEmbeddings\n", 28 | "from langchain.text_splitter import RecursiveCharacterTextSplitter" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## Lext GPT\n", 36 | "\n", 37 | "`Here, we will prepare the VectorDB index for Lex Fridman podcast:`\n", 38 | "\n", 39 | "* Scrape source data from: https://karpathy.ai/lexicap/\n", 40 | "* Use Whisper to transcribe episodes that Karpathy has not already done\n", 41 | "* Chunk data\n", 42 | "* Embed it to Pinecone\n", 43 | "* Test VectorDBQA chain on it \n", 44 | "* App (https://lex-gpt.vercel.app/) will read from same Pinecone DB\n", 45 | " \n", 46 | "`1. Get video urls -` " 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "# Videos\n", 56 | "channel_id = \"UCSHZKyawb77ixDdsGog4iWA\" # Get ID from ChannelsSearch\n", 57 | "playlist = Playlist(playlist_from_channel_id(channel_id))\n", 58 | "\n", 59 | "# Episode data\n", 60 | "stor_metadata=pd.DataFrame()\n", 61 | "for v in playlist.videos:\n", 62 | " try:\n", 63 | " ep_number = int(v['title'].split(\"|\")[-1].split(\"#\")[-1])\n", 64 | " stor_metadata.loc[v['title'],'number']=ep_number\n", 65 | " stor_metadata.loc[v['title'],'link']=v['link']\n", 66 | " stor_metadata.loc[v['title'],'title']=v['title']\n", 67 | " stor_metadata.loc[v['title'],'img']=v['thumbnails'][3]['url']\n", 68 | " except:\n", 69 | " print(\"Failed on %s\", v['title'])\n", 70 | "\n", 71 | "last_complete_video = 365\n", 72 | "new_ep = stor_metadata[stor_metadata.number > last_complete_video]" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "`2. Get audio -` " 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "# Iterate through episodes \n", 89 | "for ix in new_ep.index:\n", 90 | " \n", 91 | " ep_number=int(new_ep.loc[ix,'number'])\n", 92 | " print(\"EPISODE: %s\"%ep_number)\n", 93 | " img_url=new_ep.loc[ix,'img']\n", 94 | " ep_link=new_ep.loc[ix,'link']\n", 95 | " # Write img \n", 96 | " with open(\"../public/0%s.jpg\"%str(ep_number), 'wb') as f:\n", 97 | " response = requests.get(img_url)\n", 98 | " f.write(response.content)\n", 99 | " # Write audio\n", 100 | " ydl_opts = {\n", 101 | " 'format': 'm4a/bestaudio/best',\n", 102 | " 'outtmpl': 'audio/%s.m4a'%str(ep_number),\n", 103 | " 'noplaylist': True,\n", 104 | " 'postprocessors': [{ \n", 105 | " 'key': 'FFmpegExtractAudio',\n", 106 | " 'preferredcodec': 'm4a',\n", 107 | " }]}\n", 108 | " with yt_dlp.YoutubeDL(ydl_opts) as ydl:\n", 109 | " error_code = ydl.download(ep_link)\n", 110 | " \n", 111 | "new_ep.reset_index().to_csv(\"audio_transcription/episodes.csv\")" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "`3. Run Whisper -`\n", 119 | " \n", 120 | "* On GPU, ideally: 10-20 min / video on 2080Ti with `medium` model\n", 121 | "* Run `python run_whisper.py`\n", 122 | "\n", 123 | "If running this step on a remote machine:\n", 124 | "* scp the transcription: `audio_transcription/episodes.csv`\n", 125 | "* scp the audio files: `audio/*`\n", 126 | "* Run `python run_whisper.py`\n", 127 | "* Then, scp the `audio_transcription/` back to local " 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": null, 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "! python run_whisper.py" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "`4. Scrape Karpathy transcriptions -`" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": null, 149 | "metadata": {}, 150 | "outputs": [], 151 | "source": [ 152 | "# Get text -\n", 153 | "def tag_visible(element):\n", 154 | " if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:\n", 155 | " return False\n", 156 | " if isinstance(element, Comment):\n", 157 | " return False\n", 158 | " return True\n", 159 | "\n", 160 | "def text_from_html(body):\n", 161 | " soup = BeautifulSoup(body, 'html.parser')\n", 162 | " texts = soup.findAll(string=True)\n", 163 | " visible_texts = filter(tag_visible, texts) \n", 164 | " return u\" \".join(t.strip() for t in visible_texts)\n", 165 | "\n", 166 | "def get_text_and_title(url):\n", 167 | " html = urllib.request.urlopen(url).read()\n", 168 | " t=(text_from_html(html))\n", 169 | " title=t.split(\"|\")[0].split(\"back to index\")[1].strip()\n", 170 | " return t, title\n", 171 | "\n", 172 | "# Get links -\n", 173 | "def get_links(URL):\n", 174 | " http = httplib2.Http()\n", 175 | " status, response = http.request(URL)\n", 176 | " links = []\n", 177 | " for link in BeautifulSoup(response, 'html.parser', parse_only=SoupStrainer('a')):\n", 178 | " if link.has_attr('href'):\n", 179 | " links.append(link['href'])\n", 180 | " links_clean = [l for l in links if \"https\" in l]\n", 181 | " return links_clean\n", 182 | "\n", 183 | "# Get image -\n", 184 | "def get_img(URL,title,episode_id):\n", 185 | " response = requests.get(URL)\n", 186 | " soup = BeautifulSoup(response.text, 'html.parser')\n", 187 | " img_tags = soup.find_all('img')\n", 188 | " urls = [img['src'] for img in img_tags]\n", 189 | " for url in urls:\n", 190 | " response = requests.get(url)\n", 191 | " imgpath=\"../public/0%s.jpg\"%episode_id\n", 192 | " with open(imgpath, 'wb') as f:\n", 193 | " if 'http' not in url:\n", 194 | " url = '{}{}'.format(site, url)\n", 195 | " response = requests.get(url)\n", 196 | " f.write(response.content)\n", 197 | " return imgpath\n", 198 | "\n", 199 | "# Full pipeline - \n", 200 | "def pre_process(URL,episode_id):\n", 201 | "\n", 202 | " t,title=get_text_and_title(URL)\n", 203 | " links=get_links(URL)\n", 204 | " img=get_img(URL,title,episode_id)\n", 205 | " stor_chunk = pd.DataFrame()\n", 206 | " stor_chunk['chunks']= t.split(\"link |\")\n", 207 | " stor_chunk['clean_chunks']=stor_chunk['chunks'].apply(lambda x: re.sub(r\"[^a-zA-Z ]+\", '', x)).apply(lambda x: x.strip())\n", 208 | " stor_chunk['links']=links\n", 209 | " all_text = stor_chunk['clean_chunks'].str.cat(sep=' ')\n", 210 | " return all_text, links, title\n", 211 | "\n", 212 | "# Make splits - \n", 213 | "def make_splits(chunks,URL):\n", 214 | "\n", 215 | " # ID\n", 216 | " episode_id=URL.split(\"/\")[-1].split(\"-\")[0]\n", 217 | "\n", 218 | " # Pre-processing\n", 219 | " texts,links,title=pre_process(URL,episode_id)\n", 220 | " \n", 221 | " # Splits \n", 222 | " text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunks, \n", 223 | " chunk_overlap=50) \n", 224 | " texts_recusive = text_splitter.split_text(texts)\n", 225 | " print(len(texts_recusive)) \n", 226 | "\n", 227 | " # Metadata \n", 228 | " N = len(texts_recusive) \n", 229 | " bins = np.linspace(0, len(links)-1, N, dtype=int)\n", 230 | " sampled_links = [links[i] for i in bins]\n", 231 | " # Here we can add \"link\", \"title\", etc that can be fetched in the app \n", 232 | " metadatas=[{\"source\":title + \" \" +link,\"id\":episode_id,\"link\":link,\"title\":title} for link in sampled_links]\n", 233 | " print(len(metadatas))\n", 234 | " return texts_recusive,metadatas,title,episode_id" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": null, 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [ 243 | "# Get all pages \n", 244 | "http = httplib2.Http()\n", 245 | "status, response = http.request(\"https://karpathy.ai/lexicap/\")\n", 246 | "links = []\n", 247 | "for link in BeautifulSoup(response, 'html.parser', parse_only=SoupStrainer('a')):\n", 248 | " if link.has_attr('href'):\n", 249 | " links.append(link['href'])\n", 250 | "links_tx = [\"https://karpathy.ai/lexicap/\"+l for l in links if \"0\" in l]" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": null, 256 | "metadata": {}, 257 | "outputs": [], 258 | "source": [ 259 | "# *** Chunk size: key parameter *** \n", 260 | "chunks = 1500\n", 261 | "splits_scrape = [ ]\n", 262 | "metadatas_scrape = [ ]\n", 263 | " \n", 264 | "# Iterate \n", 265 | "stor=pd.DataFrame()\n", 266 | "for page in links_tx:\n", 267 | " try:\n", 268 | " print(\"Writing: %s\"%page)\n", 269 | " # Make splits\n", 270 | " splits,metadatas,title,episode_id=make_splits(chunks,page)\n", 271 | " stor.loc[episode_id,'title']=title \n", 272 | " with open('docs/%s.txt'%episode_id, \"w\") as f:\n", 273 | " for string in splits:\n", 274 | " f.write(string + \"\\n\") \n", 275 | " f.close()\n", 276 | " with open('metadatas/%s.json'%episode_id, \"w\") as f:\n", 277 | " json.dump(metadatas, f)\n", 278 | " f.close()\n", 279 | " splits_scrape.append(splits)\n", 280 | " metadatas_scrape.append(metadatas)\n", 281 | " except:\n", 282 | " print(\"Error on page: %s\"%page)" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "`5. Get newer transcripts -`" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": null, 295 | "metadata": {}, 296 | "outputs": [], 297 | "source": [ 298 | "# *** Chunk size: key parameter *** \n", 299 | "chunks = 1500\n", 300 | "splits_new = [ ]\n", 301 | "metadatas_new = [ ]\n", 302 | "\n", 303 | "# Read the csv file\n", 304 | "new_ep=pd.read_csv(\"audio_transcription/episodes.csv\",index_col=None)\n", 305 | "\n", 306 | "for ix in new_ep.index:\n", 307 | "\n", 308 | " # Get data\n", 309 | " title=new_ep.loc[ix,'title']\n", 310 | " ep_number=int(new_ep.loc[ix,'number'])\n", 311 | " \n", 312 | " # Consistency w/ convention used in Karpathy transcription\n", 313 | " episode_id=\"0\"+str(ep_number) \n", 314 | " file_path='audio_transcription/%s.txt'%str(episode_id)\n", 315 | " transcript=pd.read_csv(file_path,sep='\\t',header=None)\n", 316 | " transcript.columns=['links','time','chunks']\n", 317 | " \n", 318 | " # Clean text chunks \n", 319 | " transcript['clean_chunks']=transcript['chunks'].astype(str).apply(lambda x: x.strip())\n", 320 | " links = list(transcript['links'])\n", 321 | " texts = transcript['clean_chunks'].str.cat(sep=' ')\n", 322 | "\n", 323 | " # Splits \n", 324 | " text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunks, \n", 325 | " chunk_overlap=50) \n", 326 | " splits = text_splitter.split_text(texts)\n", 327 | " print(len(splits)) \n", 328 | "\n", 329 | " # Metadata \n", 330 | " N = len(splits) \n", 331 | " bins = np.linspace(0, len(links)-1, N, dtype=int)\n", 332 | " sampled_links = [links[i] for i in bins]\n", 333 | " \n", 334 | " # Here we can add \"link\", \"title\", etc that can be fetched in the app \n", 335 | " metadatas=[{\"source\":title + \" \" +link,\"id\":episode_id,\"link\":link,\"title\":title} for link in sampled_links]\n", 336 | " print(len(metadatas)) \n", 337 | "\n", 338 | " # Append to output \n", 339 | " splits_new.append(splits)\n", 340 | " metadatas_new.append(metadatas)" 341 | ] 342 | }, 343 | { 344 | "cell_type": "markdown", 345 | "metadata": {}, 346 | "source": [ 347 | "`6. Assemble final list -`" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "execution_count": null, 353 | "metadata": {}, 354 | "outputs": [], 355 | "source": [ 356 | "# Join the list of lists \n", 357 | "splits_all = []\n", 358 | "# For the initial write \n", 359 | "# for sublist in [splits_scrape+splits_new]:\n", 360 | "# For updates -- \n", 361 | "for sublist in splits_new:\n", 362 | " splits_all.extend(sublist)\n", 363 | "\n", 364 | "metadatas_all = []\n", 365 | "# For the initial write \n", 366 | "# for sublist in [metadatas_scrape+metadatas_new]:\n", 367 | "# For updates -- \n", 368 | "for sublist in metadatas_new:\n", 369 | " metadatas_all.extend(sublist)" 370 | ] 371 | }, 372 | { 373 | "cell_type": "markdown", 374 | "metadata": {}, 375 | "source": [ 376 | "`7. Embed full dataset in Pinecone VectorDB -`" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "# Pinecone\n", 386 | "pinecone.init(\n", 387 | " api_key=os.environ.get('PINECONE_API_KEY'), \n", 388 | " environment=\"us-east1-gcp\" \n", 389 | ")\n", 390 | "\n", 391 | "# Initialize with small set of data - \n", 392 | "# p = Pinecone.from_texts(splits_all[0:2], \n", 393 | "# embeddings, \n", 394 | "# index_name=index_name, \n", 395 | "# metadatas=metadatas_all[0:2])\n", 396 | "\n", 397 | "# Update - \n", 398 | "index_name = \"lex-gpt\"\n", 399 | "embeddings = OpenAIEmbeddings()\n", 400 | "p = Pinecone.from_existing_index(index_name=index_name,embedding=embeddings)" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": null, 406 | "metadata": {}, 407 | "outputs": [], 408 | "source": [ 409 | "# Add data in chunk to avoid data ingest errors\n", 410 | "chunk_size = 100\n", 411 | "last_chunk = 0\n", 412 | "num_chunks = math.ceil(len(splits_all) / chunk_size)\n", 413 | "for i in range(last_chunk,num_chunks):\n", 414 | " \n", 415 | " print(i)\n", 416 | " start_time = time.time()\n", 417 | " start_idx = i * chunk_size\n", 418 | " end_idx = min(start_idx + chunk_size, len(splits_all))\n", 419 | " \n", 420 | " # Extract the current chunk\n", 421 | " current_splits = splits_all[start_idx:end_idx]\n", 422 | " current_metadatas = metadatas_all[start_idx:end_idx]\n", 423 | " \n", 424 | " # Add the current chunk to the vector database\n", 425 | " p.add_texts(texts = current_splits, metadatas=current_metadatas)\n", 426 | " end_time = time.time()\n", 427 | " elapsed_time = end_time - start_time\n", 428 | " print(f\"Elapsed time: {elapsed_time} seconds\")\n", 429 | " print(\"--------\")" 430 | ] 431 | }, 432 | { 433 | "cell_type": "markdown", 434 | "metadata": {}, 435 | "source": [ 436 | "`8. Read in VectorDB for testing` " 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": {}, 443 | "outputs": [], 444 | "source": [ 445 | "# Pinecone\n", 446 | "pinecone.init(\n", 447 | " api_key=os.environ.get('PINECONE_API_KEY'), \n", 448 | " environment=\"us-east1-gcp\" \n", 449 | ")\n", 450 | "index_name = \"lex-gpt\"\n", 451 | "embeddings = OpenAIEmbeddings()\n", 452 | "p = Pinecone.from_existing_index(index_name=index_name,embedding=embeddings)" 453 | ] 454 | }, 455 | { 456 | "cell_type": "markdown", 457 | "metadata": {}, 458 | "source": [ 459 | "`9. Run VectorDBQAWithSourcesChain`" 460 | ] 461 | }, 462 | { 463 | "cell_type": "code", 464 | "execution_count": null, 465 | "metadata": {}, 466 | "outputs": [], 467 | "source": [ 468 | "def run_vectordb_sources_chain(llm,query,docstore):\n", 469 | "\n", 470 | " start_time = time.time()\n", 471 | " chain = VectorDBQAWithSourcesChain.from_chain_type(llm, chain_type=\"stuff\", vectorstore=docstore)\n", 472 | " a = chain({\"question\": query},return_only_outputs=True)\n", 473 | " print(a[\"answer\"])\n", 474 | " print(a[\"sources\"])\n", 475 | " end_time = time.time()\n", 476 | " elapsed_time = end_time - start_time\n", 477 | " print(f\"Elapsed time: {elapsed_time} seconds\")\n", 478 | " print(\"--------\")\n", 479 | "\n", 480 | "llm = OpenAIChat(temperature=0)\n", 481 | "q = \"What does Paul Rosolie say about the Amazon Jungle?\"\n", 482 | "run_vectordb_sources_chain(llm,q,p)" 483 | ] 484 | }, 485 | { 486 | "cell_type": "code", 487 | "execution_count": null, 488 | "metadata": {}, 489 | "outputs": [], 490 | "source": [] 491 | } 492 | ], 493 | "metadata": { 494 | "kernelspec": { 495 | "display_name": "Python 3 (ipykernel)", 496 | "language": "python", 497 | "name": "python3" 498 | }, 499 | "language_info": { 500 | "codemirror_mode": { 501 | "name": "ipython", 502 | "version": 3 503 | }, 504 | "file_extension": ".py", 505 | "mimetype": "text/x-python", 506 | "name": "python", 507 | "nbconvert_exporter": "python", 508 | "pygments_lexer": "ipython3", 509 | "version": "3.9.16" 510 | } 511 | }, 512 | "nbformat": 4, 513 | "nbformat_minor": 2 514 | } 515 | -------------------------------------------------------------------------------- /scripts/run_whisper.py: -------------------------------------------------------------------------------- 1 | # trascribe audio 2 | import time,os 3 | import logging 4 | import whisper 5 | import numpy as np 6 | import pandas as pd 7 | 8 | # Set up logger 9 | logging.basicConfig(filename='whisper.log', filemode='w', level=logging.DEBUG) 10 | 11 | # Read the csv file 12 | new_ep=pd.read_csv("audio_transcription/episodes.csv",index_col=None) 13 | 14 | # Run whisper on each audio file 15 | for ix in new_ep.index: 16 | 17 | # get data 18 | ep_number=int(new_ep.loc[ix,'number']) 19 | print("EPISODE: %s"%ep_number) 20 | logging.info("EPISODE: %s", ep_number) 21 | 22 | # get audio 23 | audio_file_path='audio/%s.m4a'%str(ep_number) 24 | out_file_path='audio_transcription/0%s.txt'%str(ep_number) 25 | 26 | print(f"Processing file: {audio_file_path}") 27 | logging.info(f"Processing file: {audio_file_path}") 28 | start_time = time.time() 29 | 30 | # load Whisper model and transcribe audio file 31 | model = whisper.load_model("medium") 32 | result = model.transcribe(audio_file_path) 33 | 34 | # write 35 | with open(out_file_path, "w") as f: 36 | for seg in result['segments']: 37 | ts = np.round(seg['start'],1) 38 | f.write(new_ep.loc[ix,'link'] + "&t=%ss"%ts + "\t" + str(ts) + "\t" + seg['text'] + "\n") 39 | 40 | end_time = time.time() 41 | time_diff = end_time - start_time 42 | print(f"Time taken: {time_diff:.2f} seconds") 43 | logging.info(f"File processed: {audio_file_path}") 44 | logging.info(f"Time taken: {time_diff:.2f} seconds") -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./app/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [] 8 | }; 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "nodenext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "baseUrl": ".", 18 | "paths": { 19 | "@/*": ["./*"] 20 | } 21 | }, 22 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 23 | "exclude": ["node_modules"] 24 | } 25 | -------------------------------------------------------------------------------- /types/index.ts: -------------------------------------------------------------------------------- 1 | export enum OpenAIModel { 2 | DAVINCI_TURBO = "gpt-3.5-turbo" 3 | } 4 | 5 | export type LEXChunk = { 6 | pageContent: string; 7 | source: string; 8 | metadata: Metadata; 9 | length: number; 10 | }; 11 | 12 | interface Metadata { 13 | id: string; 14 | title: string; 15 | link: string; 16 | } 17 | --------------------------------------------------------------------------------