-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
web_services_slim_fx.py
203 lines (145 loc) · 9.07 KB
/
web_services_slim_fx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
""" This example illustrates a more complex recipe to generate a structured financial research dictionary with
30 keys and values produced, using a combination of models and web services:
Models
1. slim-extract-tool
2. slim-summary-tool
3. bling-stablelm-3b-tool
Web Services
1. Yfinance - stock ticker
2. Wikipedia - company background information
The example shows how to extract keys from one source that can then be used as a lookup in a web service to
supplement the original source materials, and provide a secondary source, which can then also be prompted and
used to extract, analyze and summarize key information.
NOTE: to run this example, please install yfinance library, e.g., 'pip3 install yfinance'
"""
from llmware.web_services import YFinance
from llmware.models import ModelCatalog
from llmware.parsers import WikiParser
from importlib import util
if not util.find_spec("yfinance"):
print("\nto run this example, you need to install yfinance first, e.g., pip3 install yfinance")
# our input - financial news article
text=("BEAVERTON, Ore.--(BUSINESS WIRE)--NIKE, Inc. (NYSE:NKE) today reported fiscal 2024 financial results for its "
"third quarter ended February 29, 2024.) “We are making the necessary adjustments to drive NIKE’s next chapter "
"of growth Post this Third quarter revenues were slightly up on both a reported and currency-neutral basis* "
"at $12.4 billion NIKE Direct revenues were $5.4 billion, slightly up on a reported and currency-neutral basis "
"NIKE Brand Digital sales decreased 3 percent on a reported basis and 4 percent on a currency-neutral basis "
"Wholesale revenues were $6.6 billion, up 3 percent on a reported and currency-neutral basis Gross margin "
"increased 150 basis points to 44.8 percent, including a detriment of 50 basis points due to restructuring charges "
"Selling and administrative expense increased 7 percent to $4.2 billion, including $340 million of restructuring "
"charges Diluted earnings per share was $0.77, including $0.21 of restructuring charges. Excluding these "
"charges, Diluted earnings per share would have been $0.98* “We are making the necessary adjustments to "
"drive NIKE’s next chapter of growth,” said John Donahoe, President & CEO, NIKE, Inc. “We’re encouraged by "
"the progress we’ve seen, as we build a multiyear cycle of new innovation, sharpen our brand storytelling and "
"work with our wholesale partners to elevate and grow the marketplace.")
def research_example1():
""" End-to-end example generating 30 output key:value pairs """
# load three models in this example
model = ModelCatalog().load_model("slim-extract-tool", temperature=0.0, sample=False)
model2 = ModelCatalog().load_model("slim-summary-tool", sample=False,temperature=0.0,max_output=200)
model3 = ModelCatalog().load_model("bling-stablelm-3b-tool", sample=False, temperature=0.0)
research_summary = {}
# extract information from the source materials
extract_keys = ["stock ticker", "company name",
"total revenues", "restructuring charges",
"digital growth", "ceo comment", "quarter end date"]
print("\nStep 1 - extract information from source text\n")
for keys in extract_keys:
response = model.function_call(text,params=[keys])
dict_keys = keys.replace(" ", "_")
print(f"update: extracting - {keys} - {response['llm_response']}")
if dict_keys in response["llm_response"]:
value = response["llm_response"][dict_keys][0]
research_summary.update({dict_keys: value})
else:
print("could not find look up key successfully - ", response["llm_response"])
# secondary lookups using extracted information
print("\nStep 2 - use extracted stock ticker in web service lookup to YFinance\n")
if "stock_ticker" in research_summary:
ticker = research_summary["stock_ticker"]
# a little kludge related to yfinance api
ticker_core = ticker.split(":")[-1]
yf = YFinance().get_stock_summary(ticker=ticker_core)
print("yahoo finance stock info: ", yf)
research_summary.update({"current_stock_price": yf["currentPrice"]})
research_summary.update({"high_ltm": yf["fiftyTwoWeekHigh"]})
research_summary.update({"low_ltm": yf["fiftyTwoWeekLow"]})
research_summary.update({"trailing_pe": yf["trailingPE"]})
research_summary.update({"forward_pe": yf["forwardPE"]})
research_summary.update({"volume": yf["volume"]})
yf2 = YFinance().get_financial_summary(ticker=ticker_core)
print("yahoo finance fin info - ", yf2)
research_summary.update({"market_cap": yf2["marketCap"]})
research_summary.update({"price_to_sales": yf2["priceToSalesTrailing12Months"]})
research_summary.update({"revenue_growth": yf2["revenueGrowth"]})
research_summary.update({"ebitda": yf2["ebitda"]})
research_summary.update({"gross_margin": yf2["grossMargins"]})
research_summary.update({"currency": yf2["currency"]})
yf3 = YFinance().get_company_summary(ticker=ticker_core)
print("yahoo finance company info - ", yf3)
research_summary.update({"sector": yf3["sector"]})
research_summary.update({"website": yf3["website"]})
research_summary.update({"industry": yf3["industry"]})
research_summary.update({"employees": yf3["fullTimeEmployees"]})
execs = []
if "companyOfficers" in yf3:
for entries in yf3["companyOfficers"]:
if "totalPay" in entries:
pay = entries["totalPay"]
else:
pay = "pay-NA"
if "age" in entries:
age = entries["age"]
else:
age = "age-NA"
execs.append((entries["name"], entries["title"], age, pay))
research_summary.update({"officers": execs})
print("\nStep 3 - use extracted company name to lookup in Wikipedia web service - and add background data\n")
if "company_name" in research_summary:
company_name = research_summary["company_name"]
output = WikiParser().add_wiki_topic(company_name, target_results=1)
# get company summary
company_overview = ""
for i, blocks in enumerate(output["blocks"]):
if i < 3:
company_overview += blocks["text"]
# call summary model to summarize
print("-- calling summary model to summarize the first part of the Wikipedia article")
summary = model2.function_call(company_overview, params=["company history (5)"])
print("-- slim-summary - summary (5 points): ", summary)
research_summary.update({"summary": summary["llm_response"]})
# get founding date
print("\n-- calling extract model to get key piece of information from the Wikipedia article - company founding date")
response = model.function_call(company_overview, params=["founding date"])
print("-- slim-extract - founding date: ", response)
research_summary.update({"founding_date": response["llm_response"]["founding_date"][0]})
print("\n-- calling extract model to get a short company business")
response = model.function_call(company_overview, params=["company description"])
print("-- slim-extract - response: ", response)
research_summary.update({"company_description": response["llm_response"]["company_description"][0]})
# ask other questions directly
print("\n-- asking a question directly to the Wikipedia article about the business")
response = model3.inference("What is an overview of company's business?", add_context=company_overview)
print("-- bling-answer model - response: ", response)
research_summary.update({"business_overview": response["llm_response"] })
print("\n-- asking a question about the origin of the company's name")
response = model3.inference("What is the origin of the company's name?", add_context=company_overview)
print("-- bling-answer model - response: ", response)
research_summary.update({"origin_of_name": response["llm_response"]})
print("\n-- asking a question about the company's products")
response = model3.inference("What are the product names", add_context=company_overview)
print("-- bling-answer model - response: ", response)
research_summary.update({"products": response["llm_response"]})
print("\n\nStep 4 - Completed Research - Summary Output\n")
print("research summary: ", research_summary)
item_counter = 1
for keys, values in research_summary.items():
if isinstance(values, str):
values = values.replace("\n", "")
values = values.replace("\r", "")
values = values.replace("\t", "")
print(f"\t\t -- {item_counter} - \t - {keys.ljust(25)} - {str(values).ljust(40)}")
item_counter += 1
return research_summary
if __name__ == "__main__":
research_example1()