Building Resilient Multi-Agent System with LangGraph: Lessons from Production
LangGraph로 죽지 않는 멀티 에이전트 만들기: 실전 에이전트 생존기
오성우
PyAI Symposium 2025
All about AI and Python
Speaker
오성우 Sungwoo Oh
PyCon Korea 2019 - 뚱뚱하고 굼뜬 판다(Pandas)를 위한 효과적인 다이어트 전략
PyCon Korea 2020 - 금융 언어 이해를 위해 개발 ALBERT 톺아보기
PyCon Korea 2023 - 로컬 환경에서 사이즈가 큰 데이터를 효과적으로 처리/분석하기 위한 전략
오픈소스와 공유의 힘을 믿는 ,,,
2
�“All about AI and Python”
PyAI Symposium 2025
Contents
3
Introduction
Timeline of Pandas
What’s New in Pandas 2.0 & Features
Validation of 2019’s Efficient Pandas Strategies
I. Memory Optimization
II. Performance Enhancement
III. Method Chaining
If Data Size Larger than Local Hard Disk?
Hugging Face Datasets
4
14
22
35
38
48
60
65
66
�“All about AI and Python”
PyAI Symposium 2025
Do we really need a framework for agents? 🤔
4
�“All about AI and Python”
PyAI Symposium 2025
Anthropic: “Start simple. Use direct API calls first”
5
Introduction
Sources: https://www.anthropic.com/engineering/building-effective-agents
�“All about AI and Python”
PyAI Symposium 2025
Anthropic: “Start simple. Use direct API calls first”
“Over the past year, we've worked with dozens of teams building large language model (LLM) agents across industries. Consistently, the most successful implementations weren't using complex frameworks or specialized libraries. Instead, they were building with simple, composable patterns.”
...
“We suggest that developers start by using LLM APIs directly: many patterns can be implemented in a few lines of code. If you do use a framework, ensure you understand the underlying code. Incorrect assumptions about what's under the hood are a common source of customer error.”
6
Sources: https://www.anthropic.com/engineering/building-effective-agents
�“All about AI and Python”
PyAI Symposium 2025
Other voices: Karpathy, Hamel, …
7
Reference 추가
�“All about AI and Python”
PyAI Symposium 2025
Framework? Just use raw Python conde…
8
�“All about AI and Python”
PyAI Symposium 2025
Why we don’t hand-roll LLM serving?
9
�“All about AI and Python”
PyAI Symposium 2025
Same logics can apply to Agent Framework
10
�“All about AI and Python”
PyAI Symposium 2025
Small Teams: Not Desperate, Strategic
11
�“All about AI and Python”
PyAI Symposium 2025
d
12
그림 그리는 중
�“All about AI and Python”
PyAI Symposium 2025
The stack of Doom for Small Agent Teams ☠️
13
�“All about AI and Python”
PyAI Symposium 2025
3-4 Engineers, 3 Months: What’s Realistic?
14
�“All about AI and Python”
PyAI Symposium 2025
Why we chose LangGraph (Not settled for it)
15
�“All about AI and Python”
PyAI Symposium 2025
Business First: What should the agent actually do?
16
�“All about AI and Python”
PyAI Symposium 2025
Costs Matter: When custom agents are actually cheaper
17
�“All about AI and Python”
PyAI Symposium 2025
Ops view: Agents that don’t die or go rogue
18
�“All about AI and Python”
PyAI Symposium 2025
Recap: LangGraph as a Strategic Bet
19
�“All about AI and Python”
PyAI Symposium 2025
Designing “Hard to Kill” multi-agent with LangGraph
20
�“All about AI and Python”
PyAI Symposium 2025
21
랭그래프 1.0 릴리즈 캡처
�“All about AI and Python”
PyAI Symposium 2025
LangGraph 1.0: Perfect Timing
22
�“All about AI and Python”
PyAI Symposium 2025
LangChain vs LangGraph: Who does What?
Use LangChain to shape the agent, Use LangGraph to keep the agent alive
23
Framework | Details |
LangChain |
|
LangGraph |
|
Sources: https://medium.com/data-science-collective/langchain-vs-langgraph-simple-comparison-9798d8c8a95c
�“All about AI and Python”
PyAI Symposium 2025
LangGraph 1.0: From Toy to Real Runtime
24
�“All about AI and Python”
PyAI Symposium 2025
What changed in 1.0
25
Sources: https://docs.langchain.com/oss/python/langgraph/overview
�“All about AI and Python”
PyAI Symposium 2025
What changed in 1.0 (That we actually care about)
26
�“All about AI and Python”
PyAI Symposium 2025
LangGraph Application Structure
27
📌
Sources: https://docs.langchain.com/oss/python/langgraph/overview
�“All about AI and Python”
PyAI Symposium 2025
28
간지
�“All about AI and Python”
PyAI Symposium 2025
29
Revisited multi-agent system stack
�“All about AI and Python”
PyAI Symposium 2025
① LLMs - multiple sources by design
30
�“All about AI and Python”
PyAI Symposium 2025
The real issue behind multi-model strategy
31
�“All about AI and Python”
PyAI Symposium 2025
Why we didn’t hand-code every provider?
→ Managing all of this per-agent = 💀
→ Swapping models = config change, not code surgery
32
�“All about AI and Python”
PyAI Symposium 2025
In Code: Unifying Models with `BaseChatModel`
33
<1.0 코드 방식
1.0에서의 불러오는 방식 각각 코드로 보여주기
�“All about AI and Python”
PyAI Symposium 2025
Keeping the graph alive with `.with_fallbacks()`
34
Primary: Azure OpenAI
→ on failure
Fallback1: AWS Bedrock Claude
→ on failure
Fallback2: GPT=OSS via vLLM
→ on failure
Final: safe “service unavailable” message
�“All about AI and Python”
PyAI Symposium 2025
Coding the Fallback Chain, Not Try-Except Hell
LangGraph nodes stay simple; the resilience lives in the model layer
35
With_fallbacks 예시 코드
�“All about AI and Python”
PyAI Symposium 2025
② Context - everything around the LLM
36
�“All about AI and Python”
PyAI Symposium 2025
Context Engineering: Feeding LLMs the Right Context
Agents need carefully chosen context to act effectively.
37
Sources: https://blog.langchain.com/context-engineering-for-agents/
�“All about AI and Python”
PyAI Symposium 2025
Context Engineering: Feeding LLMs the Right Context
Context engineering is the art and science of filling an LLM’s limited context window with just the right information at each step.
38
Sources: https://blog.langchain.com/context-engineering-for-agents/
�“All about AI and Python”
PyAI Symposium 2025
Context as the Agent’s shield
39
�“All about AI and Python”
PyAI Symposium 2025
3-Layer Context Middleware (Pre / Exec / Post)
40
Layer | Operation |
Pre-context layer (before LLM) |
|
Execution context layer (during calls) |
|
Post-context layer (after LLM) |
|
�“All about AI and Python”
PyAI Symposium 2025
LangChain’s Agent Loop
Middleware provides to handle pre, exec, post context layers seamlessly
41
Sources: https://docs.langchain.com/oss/python/langchain/middleware/overview#the-agent-loop
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context I: Shrink the input, Save the run
42
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context I: Shrink the input, Save the run
43
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context I: Shrink the input, Save the run
44
Sources: https://community.openai.com/t/this-models-maximum-context-length-is-8193-tokens-does-not-make-sense/288627
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context I: Shrink the input, Save the run
45
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context I: Shrink the input, Save the run
46
예시 코드
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context II: Mask PII at the door, Not after the fact
47
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context II: Mask PII at the door, Not after the fact
48
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context II: Mask PII at the door, Not after the fact
49
위에 대한 예시 코드
�“All about AI and Python”
PyAI Symposium 2025
Pre-Context III: RAG only when needed
50
�“All about AI and Python”
PyAI Symposium 2025
③ Workflow - where LangGraph shines
51
�“All about AI and Python”
PyAI Symposium 2025
How LangGraph keeps agents alive at runtime
52
�“All about AI and Python”
PyAI Symposium 2025
Recursion Limit: Cutting infinite loops with recursion limits
53
�“All about AI and Python”
PyAI Symposium 2025
Recursion Limit: Cutting infinite loops with recursion limits
54
위에 대한 예시 코드
�“All about AI and Python”
PyAI Symposium 2025
Errors as State, Not Exceptions
55
�“All about AI and Python”
PyAI Symposium 2025
Timeouts: Don’t let one slow node freeze the graph
56
�“All about AI and Python”
PyAI Symposium 2025
Stopping both infinite loops and infinite waiting
Defending against two big enemies:
1️⃣ Infinite loops
2️⃣ Infinite waiting
LangGraph survival combo:
recursion_limit → cap steps / loops
timeouts → cap waiting per node / graph
interrupts → inject humans at critical points
errors-as-state → avoid global 500s
Together, these turn LangGraph from:
“a nice way to draw graphs”
into “a runtime that keeps your multi-agent system alive in production”
57
작업 필요;?
�“All about AI and Python”
PyAI Symposium 2025
Wait… We were already using safety features
58
�“All about AI and Python”
PyAI Symposium 2025
④ Ops & Assets - keeping agents alive in prod
59
�“All about AI and Python”
PyAI Symposium 2025
Observability: You can’t fix what you can’t see
60
�“All about AI and Python”
PyAI Symposium 2025
61
�“All about AI and Python”
PyAI Symposium 2025
Limitations of Pandas
62
High memory usage
Performance degradation
Low scalability
Memory mapping issue
Garbage collection
Not thread safe
Introduction
�“All about AI and Python”
PyAI Symposium 2025
High Memory Usage
63
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Degraded Performance
64
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Low Scalability
65
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Other Issues
66
Introduction
�“All about AI and Python”
PyAI Symposium 2025
How to scale & Alternatives to Pandas
67
67
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Pandas Ecosystem
68
Sources: https://se.ewi.tudelft.nl/desosa2019/chapters/pandas/
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Frequently Asked Questions about Pandas (1)
Q: Why does my machine slow down when I try to apply a function across large Pandas DataFrame?
Q: Can pandas handle data streaming for real-time data processing on large datasets?
Q: Why is saving large DataFrame to a CSV file using Pandas so slow?
69
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Frequently Asked Questions about Pandas (2)
Q: I tried to replace all the NaN values in large DataFrame using the fillna() function in Pandas and it crashed. How can handle this?
Q: How can I handle very very large dataset even not being saved on local hard disk with Pandas? (ex. over 10 TeraByte or 1 PetaByte)
70
Introduction
�“All about AI and Python”
PyAI Symposium 2025
Pandas 2.0 Released
71
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2008-2009 Beginning
72
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2012 Growth with Book
73
Sources: www.amazon.com
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2013 Integration with Scientific Ecosystem
74
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2014 Wes Mckinney Disappear
75
Sources: https://github.com/pandas-dev/pandas/graphs/contributors
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2019 PyCon KR 2019: Session speaking
76
76
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2020 Pandas 1.0 Release
77
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
2023 Pandas 2.0 Release
78
Timeline of Pandas
�“All about AI and Python”
PyAI Symposium 2025
What’s New in Pandas 2.0 & Features
79
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
CoW Improvement
80
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Copy-on-Write
81
Process1
Process2
Physical
Memory
Page A
Page B
Page C
Sources: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/9_VirtualMemory.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Copy-on-Write
82
Process1
Process2
Physical
Memory
Page A
Page B
Page C
Copy of Page C
Sources: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/9_VirtualMemory.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
CoW in Pandas 2 & 3
83
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Official Documentation about CoW in Pandas
84
Sources: https://pandas.pydata.org/docs/user_guide/copy_on_write.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Example of CoW in Pandas
85
Sources: https://pandas.pydata.org/docs/user_guide/copy_on_write.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
PyArrow Functionalities in Pandas 2.0
86
Sources: https://pandas.pydata.org/docs/user_guide/pyarrow.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Apache Arrow
Cross-language development framework for in-memory data
87
Sources: https://arrow.apache.org
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Pandas with PyArrow
88
Sources: https://pandas.pydata.org/docs/user_guide/pyarrow.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Working with text data in Pandas 2.0
89
Sources: https://pandas.pydata.org/docs/user_guide/text.html
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Experiment on Pandas 2.0
Experiment by Marc Garcia who is main contributor of Pandas
90
Operation | Time with NumPy | Time with Arrow | Speed up |
read parquet (50Mb) | 141 ms | 87 ms | 1.6x |
mean (int64) | 2.03 ms | 1.11 ms | 1.8x |
Mean (float64) | 3.56 ms | 1.73 ms | 2.1x |
endswith (string) | 471 ms | 14.9 ms | 31.6x |
Sources: https://datapythonista.me/blog/pandas-20-and-the-arrow-revolution-part-i
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Improved on Text, but on Others?
91
Sources: https://medium.com/@santiagobasulto/pandas-2-0-performance-comparison-3f56b4719f58
What’s New in Pandas 2.0
�“All about AI and Python”
PyAI Symposium 2025
Recap of 2019’s Efficient Pandas Strategies [Link]
92
건강검진 데이터
진료내역 데이터
1-2�Convert Dtypes
1-3�Category type
1-4�IO File Format
2-2�Efficient Algorithm
2-1�Vectorization
2-3�Beyond apply()
3-1 Method Chaining
3-2 .inplace parameter
3-3 Deprecations
전략3. Adopting Conventions
전략1. Memory Optimization
전략2. Performance Enhancement
1-1�Coding
Validation of 2019’s Efficient Pandas Strategies
�“All about AI and Python”
PyAI Symposium 2025
Reproduction of 2019 Strategies
93
93
| PyCon KR 2019 | PyCon KR 2023 | |
Health Check Data�건강검진 데이터 | Range | 3y (2015 ~ 2017) | 19y (2002 ~ 2020) |
Rows | 3 M | 19 M | |
Size | 0.3 GB | 1.9 GB | |
Medical History Data�진료내역 데이터 | Range | 3y (2015 ~ 2017) | 19y (2002 ~ 2020) |
Rows | 40 M | 185 M | |
Size | 3.1 GB | 14 GB | |
Data Source1: https://www.data.go.kr/data/15007115/fileData.do
Data Source2: https://www.data.go.kr/data/15007122/fileData.do
Validation of 2019’s Efficient Pandas Strategies
�“All about AI and Python”
PyAI Symposium 2025
Comparison between Pandas Versions
94
Pandas 0.24.2
Pandas 2.0.3
Pandas 2.0.3 [pyarrow]
Validation of 2019’s Efficient Pandas Strategies
�“All about AI and Python”
PyAI Symposium 2025
I. Memory Optimization
: to read and manipulate large dataset efficiently
95
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
[Appendix] How to specify data types
96
Codebook
Dtypes
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
1-1. Time to read a CSV file
Read a csv file on Default setting
97
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
1-2. Memory usage of pd.DataFrame object
98
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
1-3. Results of specifying data types
Pandas 2.0.3 [pyarrow] shows significant improvement on overall settings
99
Setting | Metric | Pandas 0.24.2 | Pandas 2.0.3 | Pandas 2.0.3 [pyarrow] | Speed-up |
Default | time | 33.4 s | 28.2 s | 2.4 s | 13.9x |
increment memory | 8,847 Mb | 8,847 Mb | 6,741 Mb | 1.3x | |
memory usage | 10,443 Mb | 10,443 Mb | 3,393 Mb | 3.1x | |
Codebook | time | 15.4 s | 23.6 s | 12.2 s | 1.2x |
increment memory | 3,668 Mb | 2,796 Mb | 755 Mb | 4.9x | |
memory usage | 10,443 Mb | 8,006 Mb | 2,847 Mb | 3.7x | |
Dtypes | time | 34.7 s | 26 s | 5.5 s | 6.3x |
increment memory | 821 Mb | 2,263 Mb | 4,347 Mb | 0.2x | |
memory usage | 3,393 Mb | 1,063 Mb | 1,092 Mb | 3.1x |
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
[Appendix] New feature: dtype_backend
100
NumPy
PyArrow
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
2-1. Time to write a file
csv <<<< parquet < pickle, feather
101
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
2-2. Disk size of the saved file
pickle < csv << feather << parquet
102
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
2-3. Time to read a file
csv <<<< pickle < feather, parquet
103
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
[Appendix]
104
I. Memory Optimization
�“All about AI and Python”
PyAI Symposium 2025
II. Performance Enhancement
: to enhance performance on manipulating and analyzing data
105
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
[Appendix] Scoring Health Check Data
106
106
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
1-1. Time to score health check
107
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
1-2. Increment Memory while scoring
108
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
1-3. Result of Performance by methods
Vectorization is still much faster than Iteration
109
Methods | Example Code | Time |
Iteration with� pd.DataFrame.iterrows() | scores = [] for _, row in df.iterrows(): scores.append(scoring_health(row)) | 12 min 18 s |
Iteration with� pd.DataFrame.apply() | scores = df.apply(scoring_health, axis=1) | 6 min 38 s |
Vectorization with� pd.Series | scores = scoring_health(df) | 1.54 s |
Vectorization with� np.array | scores = scoring_health_np(df) | 1.50 s |
Vectorization with� pa.array | scores = scoring_health_pa(df) | 1.29 s |
570x Speed up
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
2-1. Time to get same result
sort_values().head() <<< nlargest()
110
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
2-2. Increment Memory while getting result
Pandas 2.0.3 is memory-efficient than the previous one
111
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
[Appendix] Extracting Subset Specific Conditions
112
112
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
3-1. Extracting same subset of Medical History
113
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
3-2. Extracting same subset
114
Methods | Example Code | Pandas�0.24.2 | Pandas�2.0.3 |
List Comprehension | subset = df[[x in PEOPLE for x in df[“IDV_ID”]]] | 30min 1s | 26min 29s |
pd.DataFrame.apply | subset = df[df[“IDV_ID”].apply(lambda x: x in PEOPLE)] | 136min 33s | 26min 27s |
pd.DataFrame.isin | subset = df[df.isin({“IDV_ID”: PEOPLE})] | 49s | 37.9s |
pd.DataFrame.query | subset = df.query(“IDV_ID in @PEOPLE”) | 24.5s | 6.0s |
pd.DataFrame.merge | subset = df.merge(pd.Series(PEOPLE, name=”IDV_ID”), � how=’inner’, on=”IDV_ID”) | 7.86s | 12.9s |
np.isin | subset = df[np.isin(df[“IDV_ID”].values, PEOPLE)] | 21.2s | 1.9s |
pa.compute.is_in | subset = df[pa.compute.is_in(pa.array(df[“IDV_ID”]), � pa.array(PEOPLE)).to_pandas()] | - | 2.9s |
836x Speed up
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
3-3. Extracting same subset
115
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
3-4. Increment Memory while extraction
Pandas’ built-in operations became memory-stable in version 2.0.3
116
II. Performance Enhancement
�“All about AI and Python”
PyAI Symposium 2025
III. Method Chaining
117
117
jack_jill = JackAndJill()
on_hill = went_up(jack_jill, 'hill')
with_water = fetch(on_hill, 'water')
fallen = fell_down(with_water, jack')
broken = broke(fallen, 'jack')
after = tmple_after(broken, 'jill')
일반적인 방법
Method Chaining
jack_jill = JackAndJill()
after = (jack_jill
.went_up("hill")
.fetch("water")
.fell_down("jack")
.broke("crown")
.tumble_after("jill")
)
III. Method Chaining
�“All about AI and Python”
PyAI Symposium 2025
Sample Code to Return Mean Scores by Groups
118
III. Method Chaining
�“All about AI and Python”
PyAI Symposium 2025
Applying Method Chaining
119
III. Method Chaining
�“All about AI and Python”
PyAI Symposium 2025
Chained Assignment is More Faster & Efficient
After applying method chaining,
120
III. Method Chaining
�“All about AI and Python”
PyAI Symposium 2025
Review - Reproduction of 2019 Strategies
121
III. Method Chaining
�“All about AI and Python”
PyAI Symposium 2025
If Data Size Larger than Local Hard Disk?
122
�“All about AI and Python”
PyAI Symposium 2025
Hugging Face Datasets
123
Sources: https://huggingface.co/docs/datasets/index
�“All about AI and Python”
PyAI Symposium 2025
Health Check Data on the Hugging Face Hub
124
�“All about AI and Python”
PyAI Symposium 2025
Stream & Process Partial Data
125
�“All about AI and Python”
PyAI Symposium 2025
Source codes Available at �https://github.com/sackoh/pycon-korea-2023-efficient-pandas2
Testing Dataset Available at�https://huggingface.co/datasets/sackoh/pycon-kr-2023-health-check
126
126
126
PyAI Symposium 2025
All about AI and Python
Next Match Up: Pandas vs. Polars
127
�“All about AI and Python”
PyAI Symposium 2025
Thank you
for your time and consideration
128
128
128
PyAI Symposium 2025
All about AI and Python