266 Views
January 27, 26
スライド概要
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
不滅のあなたに~ Markdown for Gen AIs Yugo Miki 2026-01-28
Disclaimer • This presentation reflects the views of the authors/speakers and does not necessarily represent GSK’s views or policies. • All information provided in this presentation is provided for information purposes only. 2
Introduction – Gen AI 1 Gen AI in our daily work • ChatGPT、Copilot、Claudeなどの生成AIが業務の中で使われるようになってきた - 会議の議事録 スライドショーや論文などの作成 文書の要約 • ハルシネーションがあるとはいえ、解析業務にも使用して効率化できないかと検討が 始まっている - プログラム作成 仕様作成 QCやReview • 「考える」必要のある作業についてもAIにとりあえず任せる状況が増えている 26 J anuary 2026 3
Introduction – Gen AI 2 Gen AI depends on … • しかしながら、、、 - 思った通りの回答が返ってこない 回答の品質が毎回バラつく 同じ質問でも人によって結果が違う Note: 問題は「AIの性能」でないことが多い • 生成AIの性質 - 「空気を読む」のが得意ではない 曖昧さ・省略・文脈依存に弱い 入力されたテキストの構造に強く依存する • つまり、AIにとって重要なのは「文章のうまさ」ではなく「構造」ということになる 26 J anuary 2026 4
Markdownとは? • 軽量マークアップ言語とも呼ばれ、HTML よりも簡単な記法で構造化文書を作成するこ • • • • • とができます。 通常は HTML に変換して表示しますが、変換前でもそれなりに簡易構造化文書として読 めるのが特徴です。 2004年にジョン・グルーバーによって開発されました。 マークアップ(Markup)を簡略化(Down)したという意味を込めて Markdown と名づけられ ました。 GitHub や Qiita など多くのツールやサービスで利用されています。 多くの AI のプロンプトでも Markdown が採用されています。 Note: Machine ReadableかつHuman Readable とほほのMarkdown入門 - とほほのWWW入門 5
Markdown Basics
Markdown Basics 1 Markdown in editor Rendering # Markdown syntax guide ## Headers # This is a Heading h1 ## This is a Heading h2 ###### This is a Heading h6 Markdown Live Preview 26 J anuary 2026 7
Markdown Basics 2 ## Emphasis *This text will be italic* _This will also be italic_ **This text will be bold** __This will also be bold__ _You **can** combine them_ Markdown Live Preview 26 J anuary 2026 8
Markdown Basics 3 ## Lists ### Unordered * Item 1 * Item 2 * Item 2a * Item 2b * Item 3a * Item 3b ### Ordered 1. Item 1 2. Item 2 3. Item 3 1. Item 3a 2. Item 3b Markdown Live Preview 26 J anuary 2026 9
Markdown Basics 4
## Images

## Links
You may be using [Markdown Live
Preview](https://markdownlivepreview.com/).
## Blockquotes
> Markdown is a lightweight markup language with plain-textformatting syntax, created in 2004 by John Gruber with Aaron
Swartz.
>
>> Markdown is often used to format readme files, for writing
messages in online discussion forums, and to create rich text using
a plain text editor.
Markdown Live Preview
26 J anuary 2026
10
Markdown Basics 5 ## Tables | Left columns | Right columns | | ------------- |:-------------:| | left foo | right foo | | left bar | right bar | | left baz | right baz | ## Blocks of code ``` let message = 'Hello world'; alert(message); ``` Markdown Live Preview 26 J anuary 2026 11
Markdown Basics 6 ## Inline code This web site is using `markedjs/marked`. Markdown Live Preview 26 J anuary 2026 12
TFL Generation Basics Think Prompt Engineering
Structure of R Code Which parts should be generated? Target! R Code - Header - Library - Read Data - Analysis - Output Data - Output RTF/PDF • Header : we use template… Gen AI not needed… • Library, Analysis, Output Data : Good Scope of Gen AI • Output RTF/PDF : Possible, but it looks easier to use standards in intranet. 26 J anuary 2026 14
Complexity in TFL creating process Source Data Input parameters for Gen AI : Data Spec - Data spec - Analysis Spec - Mock shell programs Mock shells SAP Analysis Spec TFLs 26 J anuary 2026 15
Prompt suggested by Gen AI Gemini Pro 2.5の回答 プロンプト作成のポイント 背景・目的を明確にする 例:「group ごとの平均値を計算し、barplot で可視化してください」など。 出力イメージやファイル形式、制約条件などを明記する 例:「CSV 形式のテーブルを読み込み、データの要約統計量を計算してプロットし たい」など、何を達成したいかを具体的に伝える。 入力データの形式と例を記述する 例:「出力は png 形式のグラフファイルにしてください」や「missing 値があっても エラーにならないようにしてください」など。 必要なライブラリや環境のヒント 表形式のデータの場合、必要に応じて「シェル(列名のみが記載された表)」や「例 となるサンプルデータの一部」を示す。 例: 例:「dplyr, ggplot2 を用いて処理してください」など、使用するパッケージ名を書 く。 Copy to Clipboard | id | value | group | |----|-------|-------| | 1 | 10 |A | | 2 | 15 |B | | 3 | 20 |A | のような形式で、どんなカラムが存在し、どのような種類のデータが入るのかを示 す。 具体的な処理内容やアルゴリズムを指定する 26 J anuary 2026 16
Challenge to CDISC Pilot study
CDISC Pilot study • CDISC導入期に公開された試験でSDTM, ADaMなどのデータが公開されている • Markdownを使ったPromptのベンチマークとして作成してみる • 帳票は以下のGitHubから取得する - CDISC_pilot_replication/README.md at master · atorus-research/CDISC_pilot_replication • 作業手順 - {pharmaverseadam}に含まれているデータを使用→Dummyも可 Promptを手動で作成し、生成AIでcodeを生成 CodeをR Studioで実行し、結果を確認する 作成されたコードの修正依頼はしない 26 J anuary 2026 18
Test 1 :: Table 14-1.01
Test 1 :: Prompt - 1 # 依頼:Rによるデータ集計プログラムの作成 提供する「出力定義テーブル」に基づき、入力データを集計して指定の形式でデータフレームを出力するRコードを作成してくだ さい。 ## 1. 入力データの概要 - データ名:adsl.xpt - 形式:SAS xport - 主要な列名:[例:date, category, price, quantity] 指定なし。 そもそも作るの が手間すぎる ## 2. 出力項目の定義(Markdownテーブル) 以下の項目を持つデータフレームを出力してください。 | | Placebo | Xanomeline Low Dose | Xanomeline High Dose |Total| | :--- | :--- | :--- | :--- | :--- | |Intent-To-Treat (ITT) |xx (xxx%) |xx (xxx%) |xx (xxx%) |Safety |xx (xxx%) |xx (xxx%) |xx (xxx%) |xx (xxx%)| |Efficacy |xx (xxx%) |xx (xxx%) |xx (xxx%) |xx (xxx%)| |Complete Week 24 |xx (xxx%) |xx (xxx%) |xx (xxx%) |Complete Study |xx (xxx%) |xx (xxx%) |xx (xxx%) |xx (xxx%)| |xx (xxx%)| |xx (xxx%)|
Test 1 :: Prompt - 2 ## 3. 各項目の詳細ロジック(補足) - Placebo, Xanomeline Low Dose,…:TRT01P (Grouping variable) -Intent-To-Treat (ITT): SAFFL=”Y” -Safety:SAFFL=”Y” -Efficacy: SAFFL=”Y” -Complete Week 24: EOSSTT=”COMPLETED” -Complete Study:EOSSTT=”COMPLETED” ## 4. プログラムへの要望 - 使用パッケージ: tidyverse (dplyr) / base R -percentの計算はcards::round5を使う - 出力形式:最終的に `final` という名前のデータフレームに格納する - 処理の構成: 1. サンプルデータの作成(または読み込み) 2. パイプ演算子を用いた集計処理 3. 結果の表示(head関数など) 四捨五入は cards::round5が安定
Test 1 :: Result - 1 実行結果 なんと数字が全然違う。 テストデータを使って絶対動くprogramを作ってくれていた!
Test 1 :: Result - 2 実行結果 • {Pharmaverseadam}からADSL取得するコードを追加。ITT,EFF, 24w COMPはないので暫定でSAFFLで 集計したが動くプログラムが生成されている。(なお、三木がXenomelineと誤記したため、初回は動 かなかったという・・・これだから人間は!!) • パーセントがしっかり小数第一位まで出力されている。今風だ・・・。
Test 2 :: Table 14-2.01 頻度集計と要約統計量の複合テーブル よく見たら群間差のP値を出力している(あまり今風ではない)
Test 2 :: Prompt 工夫したのは以下の点。 要約統計量か頻度集計なのかを変数とともに指定。 - Placebo, Xanomeline Low Dose,…,Total:TRT01P (Grouping variable) -P-Value: placebo, Xanomeline Low Dose, Zanomeline High Doseの群間差をp値で出力する。 -Age (y): AGE, summarize; AGEGR1, Frequency count -Sex: SEX、Frequency count - Race (Origin): RACE, Frequency count - MMSE: MMSE, summarize - Duration of disease: DISDUR, summarize, DISDRGR1, Freq count - Years of education: EDUDUR, summarize - Baseline weight(kg): WTBL, summarize - Baseline height(cm): HTBL, summarize - Baseline BMI: BMIBL, summarize, BMIBLGR1, Frequency count
Test 2 :: Result なんか微妙な出力になっている。 P値を算出する頻度及び要約統計量の項目において不要な行が発生している。 functionの設計ミスが発生している。←三木が適当すぎる指定をしたから?
Test 2 :: Prompt updates そうは言っても ・レイアウト自体は完全に作ってくれる。 ・空行の指定はなかった。(しかし、本当に比較する必要があるか?いや、不要。) ・P値は以下のように算出されていた。(恐ろしや・・・) もし、promptに追記すると・・・? -P-Value: placebo, Xanomeline Low Dose, Zanomeline High Doseの群間差をp値で出力する。 数値変数については一元配置分散分析、文字変数についてはカイ二乗検定で算出してください。
Test 2 :: Result 2 かなりきれいになった。とはいえnが出力されていない・・・・
Test 3 :: Table 14-5.01 有害事象のテーブル 件数は今風じゃないから作成しないでおこうかな
Test 3 :: Prompt
Test 3 :: Result “SOC1: “だと!?多分Promptが微妙。 Test dataはmeddraの構造は無視している状態。 しかし、集計programとしては使えるコードが作成されている。
Test 3 :: Prompt updates 以下のpromptを追加してみる -ANY EVENTS: 有害事象が発生した症例数の行を追加してください。 -SOCn: AEBODSYS, SOCnのところは実際のAEBODSYSの値を使用してく ださい。 -PTn: AEDECOD, PTnのところは実際のAEDECODの値を使用してくださ い。 -出力する順番: Total列でSOCの症例数が多い順、そのSOC下でPTの症例数 が多い順としてください。
Test 3 :: Result 2
Summary
Summary • 適切なpromptを与えると一般的な帳票について、それなりの再現性をもってプロ グラムコードを作成することが可能といえる • 一方でこのプロンプトを作成すること自体に大きな工数がかかるため、現段階で はそこまで効率的とは言えない 35
Next STEP • 再度、promptの構成を眺めてみる 1. 入力データの概要:現状無くてもよい? 2. 出力項目のテーブル:作るのが大変!Mockがこういう形式ではないのだけれ ど・・・、などの意見もありそう。 →こういう形式のデータなら見たことあるな!QCのときのあのデータ・・・。 →QCデータからpromptを作成するのはどうか? 3. 各項目の詳細ロジック:ここは少なくともデータに理解のある人のチェックが必要 か。もしくはQC的な意図を持たせるか・・・。 36
to be continued… Love your neighbor as yourself - Matthew