alanchan808 commited on
Commit
bcbb061
0 Parent(s):

Duplicate from alanchan808/Ask_Tennis_Coach_Patrick_Mouratoglou

Browse files
Files changed (4) hide show
  1. .gitattributes +35 -0
  2. README.md +13 -0
  3. app.py +136 -0
  4. requirements.txt +6 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Ask Coach Patrick Mouratoglou
3
+ emoji: 🏆
4
+ colorFrom: gray
5
+ colorTo: gray
6
+ sdk: gradio
7
+ sdk_version: 3.35.2
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: alanchan808/Ask_Tennis_Coach_Patrick_Mouratoglou
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #import json
2
+ import os
3
+ import pprint
4
+ #import shutil
5
+ #import requests
6
+
7
+ import gradio as gr
8
+
9
+ from transformers.utils import logging
10
+ from langchain.embeddings import HuggingFaceInstructEmbeddings, GooglePalmEmbeddings
11
+ import pinecone
12
+ from langchain.vectorstores import Pinecone
13
+
14
+ logging.set_verbosity_debug()
15
+
16
+ instructor_embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl", model_kwargs={"device": "cpu"})
17
+
18
+ HF_TOKEN = os.environ.get("HF_TOKEN", None)
19
+ PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY", None)
20
+ PINECONE_ENV = os.environ.get("PINECONE_ENV", None)
21
+ GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY", None)
22
+
23
+ pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENV)
24
+
25
+ from langchain.llms import GooglePalm
26
+ from langchain.chains import RetrievalQAWithSourcesChain
27
+ llm=GooglePalm(google_api_key=GOOGLE_API_KEY, temperature=0.1, max_output_tokens=2048)
28
+ vectorStore = Pinecone.from_existing_index('tennis', instructor_embeddings)
29
+ retriever = vectorStore.as_retriever(search_kwargs={"k": 3})
30
+ qa_chain_instrucEmbed = RetrievalQAWithSourcesChain.from_chain_type(llm=llm,
31
+ chain_type="stuff",
32
+ retriever=retriever,
33
+ return_source_documents=True,
34
+ verbose=True
35
+ )
36
+
37
+ theme = gr.themes.Monochrome(
38
+ primary_hue="indigo",
39
+ secondary_hue="blue",
40
+ neutral_hue="slate",
41
+ radius_size=gr.themes.sizes.radius_sm,
42
+ font=[
43
+ gr.themes.GoogleFont("Open Sans"),
44
+ "ui-sans-serif",
45
+ "system-ui",
46
+ "sans-serif",
47
+ ],
48
+ )
49
+
50
+ def generate(question):
51
+ ret = qa_chain_instrucEmbed(question)
52
+ pprint.pprint(ret)
53
+ answer = ret['answer']
54
+ sources = ret['sources']
55
+ embed_video_html = '<div>'
56
+ if sources is not None and len(sources) > 0:
57
+ sources = [s.strip() for s in sources.split(',')]
58
+ for source in sources:
59
+ embed_video_html += f'''
60
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/{source}"
61
+ title="YouTube video player" frameborder="0" allow="accelerometer; autoplay;
62
+ clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
63
+ '''
64
+ return answer, embed_video_html+'</div>'
65
+
66
+ examples = [
67
+ "Tell me step by step how to find out my dominant eye when I play tennis.",
68
+ "What do we look for in a great tennis player? Write out the essential attributes.",
69
+ "Who has the best tennis serve? Explain in details.",
70
+ "Compare Novak and Nadal gamestyle in details. Who is better?",
71
+ "Who is the tennis GOAT?"
72
+ ]
73
+
74
+ def process_example(args):
75
+ for x in generate(args):
76
+ pass
77
+ return x
78
+
79
+
80
+ css = ".generating {visibility: hidden}"
81
+
82
+ monospace_css = """
83
+ #q-input textarea {
84
+ font-family: monospace, 'Consolas', Courier, monospace;
85
+ }
86
+ """
87
+
88
+ css += monospace_css + ".gradio-container {color: black}"
89
+
90
+ description = """
91
+ <div style="text-align: center;">
92
+ <h1>Ask Tennis Coach Patrick Mouratoglou</h1>
93
+ </div>
94
+ <div style="text-align: left;">
95
+ <p>This is a demo to answer some popular questions from tennis fans to Coach Patrick. The information is being extracted from his official <a href="https://www.youtube.com/@patrickmouratoglou_official" style='color: #e6b800;'>Youtube channel</a>. It's using the following technologies:</p>
96
+ <ul>
97
+ <li>Google PALM</li>
98
+ <li>Gradio</li>
99
+ <li>hkunlp/instructor-xl</li>
100
+ <li>HuggingFace</li>
101
+ <li>Langchain</li>
102
+ <li>Pinecone</li>
103
+ </ul>
104
+ </div>
105
+ """
106
+ disclaimer = """⚠️<b>This is an unofficial website.</b>\
107
+ <br>**Intended Use**: this app for demonstration purposes; not to serve as replacement for Coach Patrick official media channels or personal expertise."""
108
+
109
+ with gr.Blocks(theme=theme, analytics_enabled=False, css=css) as demo:
110
+ with gr.Column():
111
+ gr.Markdown(description)
112
+ gr.Markdown(disclaimer)
113
+ with gr.Row():
114
+ with gr.Column():
115
+ question = gr.Textbox(
116
+ placeholder="Enter your question here",
117
+ lines=5,
118
+ label="Question"
119
+ )
120
+ submit = gr.Button("Ask", variant="primary")
121
+ output = gr.Textbox(elem_id="q-output", lines=10, label="Answer")
122
+ video = gr.HTML('')
123
+ gr.Examples(
124
+ examples=examples,
125
+ inputs=[question],
126
+ cache_examples=False,
127
+ fn=process_example,
128
+ outputs=[output, video],
129
+ )
130
+
131
+ submit.click(
132
+ generate,
133
+ inputs=[question],
134
+ outputs=[output, video],
135
+ )
136
+ demo.queue(concurrency_count=16).launch(debug=True)
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ langchain
2
+ pinecone-client
3
+ sentence_transformers
4
+ InstructorEmbedding
5
+ transformers
6
+ google-generativeai