GraphRAGをお試しさわり

先日、Microsoftの研究チームが発表したGitHub - microsoft/graphrag: A modular graph-based Retrieval-Augmented Generation (RAG) system、通称GraphRAGを触ってみる。ChatGPTをはじめとしたLLM(大規模言語モデル、large janguage model)の検索性能と回答生成を高めるおおまか2つの手法、ファインチューニングとRAG(検索拡張生成、retrieval argumeted genreration)のうち、後者をさらに拡張する手法とのことだ。

 

大規模言語モデルを用いた回答は、大量に記憶処理したテキストデータをもとに生成されるため、一般的な定説的な回答になりやすい。プロンプトエンジニアリングを駆使してより質の高い回答を生み出すことはできるものの、回答の前に参照するデータを迂回して回答を精製するRAGの方が容易で質の安定がすでにわかっている。(参照: [2312.05934] Fine-Tuning or Retrieval? Comparing Knowledge Injection in LLMs

 

 

https://ja.m.wikipedia.org/wiki/%25E3%2582%25B0%25E3%2583%25A9%25E3%2583%2595_(%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E6%25A7%258B%25E9%2580%25A0)

Wikipediaにあるようにグラフ構造とは、ノードとエッジ、すなわちデータ間の関係性に着目した情報の集合体だ。LLMでは推計的に関係性の近い情報をもとに回答を生成するため、生のデータを事前知識として渡すよりも関係性の塊を渡す方が処理によい影響があるのだろう。よって、GraphRAGは大まかに説明すると、事前に迂回するデータを構造化し、その関係性のデータベースを参照しながら回答を生成する。

 

 

f:id:pnch:20240806231240p:image

上記リンクで表されるような図は、テキストマイニングした際のワードクラウド形態素分析したグラフのように見えるだろうが、ノードの関係が記述されているのが特徴的だ。記録したデータ間をつなぐように検索するリレーショナルデータベースとは異なり、両者のつながり(向きや属性もあわせて)を参照するため高速で柔軟性が高いようだ。ここらへんは専門外過ぎて資料をみながら5%もわかっていればいい方だ…。

 

Neo4j - Wikipedia

GraphRAGでは、事前に与えた知識情報(テキストファイルやPDFなど)をChatGPTなどのLLMで解析してグラフ構造化し、それをNeo4jを代表とするグラフデータベースに格納し、それを迂回して参照し、再びLLMでユーザーへの回答を生成する段取りらしい。

 

 

Enhancing RAG-based application accuracy by constructing and leveraging knowledge graphs

詳細は上記リンクを参考にするなどして、Google Colab上で実行できるプログラムを実行した。

 

今回は、有松の町並みガイドラインをもとに、回答するbotをつくってみた。事前にPDFで作成されている町並みガイドラインをマークダウン形式で記述し直している。

 

名古屋市:有松伝統的建造物群保存地区及び有松町並み保存地区(暮らしの情報)

 

Open AIにはすでに課金しており、Neo4jのフリーアカウントを作成したら割とすぐに実行できる。M1チップながらもメモリも非力なので汎用性の高いGoogle Colabでプログラムを作成した。ガイドラインのグラフ構造化には、ChatGPT 3.5Turboと4o miniでそれぞれ試してみたが、ファイル1つ程度ではほとんど大差のない結果だった。

 

f:id:pnch:20240806232938j:image

3.5 Turboでのグラフ

 

f:id:pnch:20240806233002j:image

4o miniでのグラフ

 

 

結論から言うと、4oにファイルを渡して参照しながら回答した通常のRAGでの結果とほとんど大差はなかったけれど、低コストかつ回答スピードのはやい3.5Turboや4o miniでも同質の結果だったのはちょっとした驚きだった。

 

f:id:pnch:20240806233356j:image

有松は重要伝統建造物群保存地区であるため、町並み保全の規制がかかっているため個別性が高い回答が求められる

 

f:id:pnch:20240807094233j:image

Difyで実装したRAG bot

 

f:id:pnch:20240807000827j:image

4oもがんばってる

 

 

正直、この程度の試験ではすぐに実践に投じられるようなことはないだろうが、これを使っていくつかのアイデアは考えられそうだ。町並規制を遵守することや、規制をかいくぐりながら創造的なアウトプットとすることもだし、さらに定性・定量的な都市データを入れることができれば地域振興のアイデアや遊休資産を活用するビジネスアイデアの壁打ちもできるかもしれない。

 

一方で、今の使い方では「ひらめき」や「人間のエゴ」は後退し、部分的には精細でも最大公約数的なものが生まれる可能性が高い。やはり確率的な推計をもとに生成するプログラムの限界をそこに見てしまう。ここらへんは壁打ちとして割り切って使用したり、「思索的な思考アプローチをとって」のように注文の仕方である程度は改善するのかも知れないがもともと得意な領域とは言いきれない。

 

それにしても、ChatGPTの出現以降、Pythonなどのようなプログラムを触ることのハードルが一気に下がっていくのを感じる。大学院時代にRやMeCabにすら距離をとるきらいがあったが、一気に近づいてきたみたいだ。すでにインタビューの文字起こしをAIとともに行っていたり、構造化を支援してもらうような使い方をしているが、GraphRAGはインサイトの抽出にも部分的に使用できるだろう。定性定量調査の複合化 MMR(混合研究手法、mixed methods research)はますます進みそうだ。

Googleフォームに申込数を表示し、一定数以上の申し込みはキャンセル待ちとして表示する

コロナ以後、オンラインイベントが増え、さまざまなプラットフォームを利用したお申込み、またはイベント参加者の管理方法を試された方も多いのではないでしょうか。

支払いなどのシステムを利用しない単純な申込みであれば、Googleフォームを利用が簡単です。シンプルさゆえ、微妙なところに手が届かないこともあり、以前紹介した「上限に達したらフォームを締め切る」ようなものはプログラムを書いて対応する必要があります。

今回は「現在時点での申込数の表示」と「締め切り後はキャンセル待ちのウェイティングリスト」化するようなGoogleAppScript(GAS)を紹介します。

1. フォームを作成する

Googleドライブから「フォームを作成する」を選び、必要な項目を用意しましょう。
イベント申込みフォームなので、「お名前」「ご所属」「イベントを知ったきっかけ」などとしてみましょう。
右上の設定から「メールアドレスを収集する」も選んでおくと良いでしょう。
f:id:pnch:20211218124421j:plain

2. スクリプトを作成する

2-1. スクリプトを作成する

右上の「…(3点リーダー)」をクリックして、「スクリプトの作成」を開きましょう。
f:id:pnch:20211218124429j:plain

画面にある「Function …」をすべて消去し、以下のスクリプトをコピペします。

function endFormCheck() {
var LIMIT_COUNT = 5; //イベントの参加定員数
 
var form = FormApp.getActiveForm();
 
//フォームの回答行が参加定員数以上だったら、回答受付をキャンセル待ちとする
if (form.getResponses().length >= LIMIT_COUNT) {
//キャンセル待ち数は現在の回答数-参加定員数
var WaitingSeat = form.getResponses().length - LIMIT_COUNT;//フォームの説明文に【キャンセル待ちは〇席です】と表示する
var description = 'イベントの定員数上限に達しました。現在のキャンセル待ち数は'+ WaitingSeat + '席です。\n';
form.setDescription(description); 
}
//参加定員数未満だったら、フォームの説明文に残席数を表示する
else{
//残席数は最大収容人数-現在の回答数
var application = LIMIT_COUNT -form.getResponses().length;//フォームの説明文に【残り〇席です】と表示する
var description = 'イベントの申込受付は残り'+ application + '席です。\n';
form.setDescription(description); 
}
}

左上にあるスクリプトの名称を「formandwating」など適当につけて保存しておきます。

2-2. スクリプトの発動条件を指定する

左のメニューバーより「時計のアイコン」をクリックして、画面右下「トリガーの追加」をクリックし、イベントの種類を選択から「フォームの送信時」としましょう。
f:id:pnch:20211218124635j:plain

Googleドライブへのアクセス許可が求められるので、「許可」をクリックしましょう。

これでフォームの申し込みが発生するたびに、申し込み数が上限に達していないか確認し、その差を残席またはキャンセル待ち数として表示することができます。

ちょっとした配慮ですが申込者の安心につながるかもしれませんね。


なお、サンプルを試した後に残席数の表示の数を直したい時は、フォームのデータを消去し、説明欄のテキストを上限数になるよう、手動で戻しましょう。

参考

Googleフォームの申込数が指定した数以上になった場合に自動で申し込みを停止する方法(GAS)

イベントなどの予約管理をしている時に使いやすいGoogleフォーム。申し込み時に通知が来るようにしていても、いつ上限に達するかヒヤヒヤしてしまうことはないですか?残念ながら現状のGoogleフォームには自動でフォーム受付を締め切る機能はついていません。そこで、Googleが提供するGoogle Apps Script(GAS)を使って、自動でフォームを停止するようにしたいと思います。

こんな時に使いたい

例えば、「最大30個のお弁当の予約販売をしたい」などという事があったとします。予約の数量を打ち込む欄があり、「お弁当28個の予約時点で、1名から3個追加予約がある場合は対応してあげよう」という柔軟な対応をとってもいいかなと思った時に使えるものです。
当然ですが、Googleアカウントを作成している前提です。アカウント作成していない人はすぐにつくってください。

GASをつかう前に

①まずは受付するためのフォームとを作成しましょう。

f:id:pnch:20201101174125p:plain
Googleドライブよりフォームを作成


②フォームに入力欄を追加する

f:id:pnch:20201101174710p:plain
入力項目はなんでもいいです


③回答用のフォームを作成する

f:id:pnch:20201101174931p:plain
「回答」から「回答をスプレッドシートに表示をクリック」する
f:id:pnch:20201101175011p:plain
「作成」をクリック


④作成した回答が記入されるスプレッドシートを開く

ここまで準備することができたら、ようやくスクリプトを記入していきます。

GASをつくる

今回おこないたいのは、申込数が上限に達した時にフォームの受付を締め切ることです。つまり、今回は最後の申し込みで、申し込み数の合計が30個以上となった場合に受付を締め切ろうと思います。さっそく、開いているスプレッドシートを見ていきましょう。

⑤予約数を管理するセルを用意しよう

f:id:pnch:20201101180230p:plain
合計がわかるように今回はEの3を合計が入力されるように関数を入力しました

今回は申込数の合計を計算してもらうように、SUM関数をE2セルに入れています。画像はすでに数字が入っているように、SUM関数はお弁当の予約数が増えると勝手に計算して、数字を更新してくれます。


スクリプトエディタを開く
 >

f:id:pnch:20201101175434p:plain
ツールより「スクリプトエディタ」をひらく 

f:id:pnch:20201101175606p:plain
新しいタブで画像のようなページが開きます

僕のようにプログラミングとは縁のない生活をしてる人にとっては恐怖を感じる人もいるかも知れませんが、今回はまったく難しくないので安心して下さい。

スクリプトを貼り付ける
スクリプトエディタに下記の内容をコピペして下さい。//以下のコメントにありますが、先程スプレッドシートに用意した合計の数字が記入される欄が30を超えたら、フォームを停止にするということがわずか数行で記述されています。すごいね!

function autocloseform() {
    var ss = SpreadsheetApp.getActiveSheet(); //今開いているスプレッドシートをssという名前にします
    var myForm = FormApp.openByUrl("https://docs.google.com/forms/~~~~/edit");  //フォームのURLをコピペ
    var amount = ss.getRange(2, 5).getValue();  //amountという単語にssのE2(行, 列)の値を取得します
    var hantei = ss.getRange(2, 6);  //hanteiという単語をssのF2(行, 列)のセルとします
  
  if(amount>30){  //もしもamountが30より大きければ
   hantei.setValue("完売");  //hanteiに「完売」と入力します
   myForm.setAcceptingResponses(false);  //フォームの受付を締め切ります
  }else{  //もしもamountが30より小さければ
    hantei.setValue("在庫あり");  //hanteiに「在庫あり」と入力します
  }
}

//以下のコメントに書いているとおり、フォームの編集URLを貼り付けて下さい。

f:id:pnch:20201101181506p:plain
コピーするURLはここ
f:id:pnch:20201101181719p:plain
スクリプトを保存


⑧トリガー(スクリプトを実施するタイミング)を作成する
フォームに予約申し込みがあった時にこのスクリプトを動かし、合計の数字が30を超えたら止めてもらう必要があります。そのために、スクリプトを動かすタイミング(トリガー)を設定します。

f:id:pnch:20201101182004p:plain
スクリプトエディタの編集より「現在のプロジェクトのトリガー」をクリックする
f:id:pnch:20201101182231p:plain
新しく表示されたページより「新しいトリガーの作成」をクリックする
f:id:pnch:20201101182528p:plain
「イベントの種類」からフォームの「変更時」にトリガーを指定する

これでスプレッドシートに記入があり、「変更」された瞬間をトリガーにスクリプトが発生するように指定できました。保存をクリックするとGoogleのアカウントと紐付けて大丈夫?的な表示がされるので、「許可する」をクリックしてあげて下さい。

GASが動くか確認しよう

これでフォームの入力があれば、スプレッドシートに「在庫あるよ」と表示されたり、「完売なので受付締めました」と自動でなるようになりました。フォームの入力画面から、予約が繰り返しおこなわれ、30個以上の予約数となったらこんな画面が表示されているはずです。

f:id:pnch:20201101184208p:plain
完売の表記あり
f:id:pnch:20201101184235p:plain
受付停止の画面が自動表示

───

これで上限以上で申し込まれた方にお断りの連絡をしなくて済みますね。スクリプトについてもっと知りたいという方は、ぜひGoogle Apps Scriptのページをご覧ください。

workspace.google.co.jp

ランニング・サンダルことワラーチのデジファブプロジェクトを立ち上げてみた。

Huarache Running Sandals

Huaraches are an open type of outdoor footwear, consisting of a sole held to the wearer's foot by straps passing over the instep and around the ankle. The common understanding is that a these sandals were a variant of traditional Mexican huaraches, the difference being in design and construction.(引用:Huarache (running shoe) - Wikipedia, the free encyclopedia
ワラーチとは、靴底と足首、足の甲を固定する紐によって構成される開放型のアウトドアシューズである。これはメキシコで見られる同名の伝統的革サンダルとはデザインも素材も異なる。(※拙訳)

 ハンドメイドシューズを製作している方とのやりとりの中で、足型のスキャンは必ずしも制作に役立つわけではないけれど実際の計測データと最終成果物の誤差を記録していきそれを利用することで、より良いものをつくる制作プロセスを改善できないかという話をFacebook上で行っていた。職人は経験からこの誤差を割り出し、実際にモノを作っている。こうした誤差を身体化していくことで製作スピードや精度を上げていくことは、デジタルでもアナログでも共通している。fablabではそうした技術者をファブマスター、ファブマイスターと呼んおり、fablab japan代表の田中浩也さんは、かつてMITで受けたHow to Make Anythingの講義を経てファブマスターとは、

「(ほぼ)あらゆるひと」にものづくりのアドバイスを送ることができるようになる。ファブラボを本当に切り盛りするには、実質的に、この水準のスキルが必要とされるのだ。僕のイメージでは、これは「大工の棟梁」に近い。HowToMakeAlmostAnything2010

としている。つまり、職人の経験知を形式知として出力し、それをさらに共有することがデジタルファブリケーションを通したモノづくりに求められている。こうした「あそび」「まなび」「しごと」を緩やかに繋いで混ぜあわせる創造的なメディア(『fabLife』,田中浩也, P.157)としてのデジタルファブリケーションを援用することで、制作者の活動を活発にするだけでなくエンドユーザーとデザイナー(もしくは、職人)との距離を縮めることが可能になる。買手と売手という関係性を超えたファンコミュニティや生活スタイルの獲得につながるのではないかと期待している。

 前置きが長くなってしまったが、Facebook上のやりとりで私はその時に、スキャンした足型画像を二値化したらアウトラインのベクターデータを取得しやすいのではないかという技術的な提案をしていた。その頃はフィンランドでのプロジェクト発表日に近かったので、自分でそれを製作することはできなかったのだが、一段落ついたので実際にProcessing上でプロトタイピングをし、誰でも利用出来るようにしてみようと公開に至った。

 公開にはGitHubを使い、ライセンスはCC-BYとしたので誰でもダウンロード、プロジェクトへの参加を可能としている。是非一緒に参加してもらえたら嬉しい。まだタスク整理が追いついていないのでそれは追って調整していくつもりだ。残念ながらプログラミングのリハビリも兼ねて製作していたので進行が遅い…。(フィンランドへ来てから初めてまともにProcessingを触っているのでほぼ10ヶ月ぶりのことだ。)

f:id:pnch:20130527054155p:plain
ynbr/huarache_fab · GitHub
https://github.com/ynbr/huarache_fab

 プロジェクトの目的は、技術や制作プロセスの確立、誤差データベースの作成、ワラーチの普及といったところだ。文化的側面として、飛脚とわらじの関係を振り返ってみるのも面白い。ワラーチランナーで数十キロを走る人もいるらしい。経営工学の観点から、日本におけるものづくりとファンコミュニティ・マネジメントを見ていくのも面白いかもしれない。とか夢が膨らむけれど、実際に出来ているのは以下の動画にあるようにまだわずかなことだ。じっくりと取り組みながらプロジェクトのレベルを上げていきたい。

Progress Haruche Fab Project 01 / ワラーチプロジェクト from PNCH on Vimeo.

Progress Haruche Fab Project 02 / ワラーチプロジェクト from PNCH on Vimeo.

関連記事

Maker Conference Tokyo 2012 #MCT2012 でオープンソースとマネタイズについて考えてみた。 - ケンチククラブ
http://pnch.hatenablog.com/entry/20120605/1338855196

Google Docsのフォームをカスタムして地図を入れたり動画を埋め込むことができた。

4月ですね。年度が変わると気持ちが引き締まる思いがしていましたが、国外にいるとそんな雰囲気は全くありません。学期末テストの準備やサマーインターンの申し込み、プロジェクトの締め切り間近でどたばたしています。今春は桜を見れなかったのが残念ですが、花粉の影響がなかったのでプラマイ0です。

 先週は北極圏まであとわずかのフィンランド北部、ロヴァニエミへオーロラを見てきました。今年は10年程度に一度のオーロラ活発期とあって、3泊中に2夜オーロラを見ることができました。この時期は気温も-8度くらいとまだ活動しやすく、泊まったホテルの屋上で快適に見ることができました。

f:id:pnch:20130328210243j:plain
[ホテル屋上から見えるオーロラ Photo by Kentaro Mabe]

 しかし、問題だったのは日中です。たまたまイースター休日と旅行日程がかぶってしまい、外出をしても公共機関は閉まってるし、商業施設は早く閉まる。また、予てから見たかったアルヴァ・アアルト設計のロヴァニエミ図書館は閉館してる上に工事中で写真にもおさめられない。日中はホテルで読書したり、インターネッツしたり、コーディングしたりというような生活です。残念ながら近くの商業施設まで片道30分ほどあるので、そうめったに外出はしませんでした。一緒に行った友達はサンタ村に興味があったようですが、僕はそんなになかったので保留です。その中、一番時間をかけていたのがWEBデザインのお手伝いでした。

 結婚お披露目会の案内をWEBで行うということで、僕は最初は助言程度だったのですが最終的にはゼロからコーディングすることになりました。その主な原因がフォームに埋め込みできない画像、動画、地図です。Google Docsのフォームはアンケートなどでとても有効なのですが、型式指定がきつくカスタムがデフォルトではできません。そこで、そのフォームを利用しつつカスタムしてみることにしました。今回は、フォームの作成、新しいhtmlページの作成を行います。

 Google Docsの解体と再構築をしていたのでメモがわりに記録しておきます。(もしかしたらこういうのはGoogle Docs規約違反なのかもしれないけど…。)色々と探してもなかったので、きっと本職の人にとったらどうでもいい情報なのかもしれないですが、僕のような初心者には大きな情報だったので。きっと誰かが今後アンケートなりで利用してくれると思います。

製作環境:Macbook Pro
OSX ver:10.7.5
ソフトウェア: CotEditor、Dropbox
使用言語:html

まずはフォームを作成

 ここは説明しませんが、Google Docsのフォームを作成してください。この時に地図や動画を埋め込みたいところがあれば適当にテキスト打ち込んで分かりやすくするのも手ですが、後にhtmlでいじるのでいらないでしょう。

f:id:pnch:20130402203046p:plain
[こんな感じのフォームを作成]

フォームのソースを表示

 先程の画像上部にもある「ライブフォームを表示」をクリックすると入力フォームが出てきます。(Chromeの場合)サイトを右クリックし、ソースを表示させてください。僕は英語になっていますが、日本語でも同じような感じで出てると思います。

f:id:pnch:20130402203630p:plain
[View Page Sourceをクリック]

上手にコピペ、文字コード と form action と inputが重要

 続いて、CotEditorで適当なwebpageのコードを書きましょう(下記参照)。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset="utf-8">
<title>フォームのカスタム</title>
</head>
<body>
これは本文です。
</body>
</html>

 ここに先ほど非表示したGoogle Docsのソースを一部コピペします。重要なのは<form action〜>と<input〜>で挟まれた部分です。divのclassやidはスタイルシート用の記述なので削ってしまっても構いません。今回はCSSは使いません。

f:id:pnch:20130402210118p:plain

必要な箇所を抜き取り、先程のコードに足します。今回は以下のようにします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">

<title>フォームのカスタム</title>
</head>
<body>
これは本文です。<form action="https://docs.google.com/forms/d/ここにフォームのリンクを/formResponse" method="POST" id="ss-form" target="_self" onsubmit="">
<br>
名前:
<input type="text" name="entry.719400388" value="" class="ss-q-short" id="entry_719400388" dir="auto">
<br><br>
性別:<input type="radio" name="entry.2110305272" value="&#30007;&#24615;" id="group_2110305272_1" class="ss-q-radio" aria-label="&#30007;&#24615;"> 男性 <input type="radio" name="entry.2110305272" value="&#22899;&#24615;" id="group_2110305272_2" class="ss-q-radio" aria-label="&#22899;&#24615;"> 女性 <input type="radio" name="entry.2110305272" value="&#12381;&#12398;&#20182;" id="group_2110305272_3" class="ss-q-radio" aria-label="&#12381;&#12398;&#20182;"> その他 
<br>
<input type="hidden" name="draftResponse" value="[]">
<input type="hidden" name="pageHistory" value="0">

<input type="submit" name="submit" value="&#36865;&#20449;" id="ss-submit">
<div class="ss-secondary-text">Google フォームでパスワードを送信しないでください。<br>Powered by
<a class="ss-logo-link" href="http://docs.google.com"><img class="ss-logo" src="https://ssl.gstatic.com/docs/forms/drive_logo_small.png" alt="Google ドライブ"></a>
<br>
<a href="https://docs.google.com/forms/d/ここにフォームのリンクを/reportabuse?source=https://docs.google.com/forms/d/ここにフォームのリンクを/viewform">不正行為の報告</a>
-
<a href="http://www.google.com/accounts/TOS">利用規約</a>
-
<a href="http://www.google.com/google-d-s/terms.html">追加規約</a>

<script type='text/javascript' src='/static/forms/client/js/2803853122-formviewer_prd.js'></script>
<script type="text/javascript">_initFormViewer();</script>
</body>
</html>

 このファイルをhtml形式で、DropboxのPublicフォルダに保存してください。できたファイルが公開されたら右クリックからパブリックリンクのコピーを選択肢、ブラウザで開いてみましょう。

フォームのカスタムこれは本文です。
名前:

性別: 男性  女性  その他 
Google フォームでパスワードを送信しないでください。
Powered by
不正行為の報告-利用規約-追加規約

 すると上記のようなフォームが出来上がっているとお思います。ここで絶対にいじっていけないのは、文字コードutf-8』、<form action〜>タグ、です。文字コードを変更してしまうと日本語で入力したフォームを送信したときに文字化けが発生し、読むことができなくなります。<form action>タグは入力したフォームを送信する部分なので削ってしまうと入力はできても送信できません。あとはみなさんでいじりながらやっていきましょう。この時点でもうフォームに入力し、送信までが出来上がっています。当然結果を見ることもできるので一度試してみたほうがいいでしょう。それでは続いて、地図と動画をhtmlに埋め込みましょう。

コピペとサイズ

 もうここまで来れば終わったも同然です。僕は会場までの地図(ルート)とそのルート紹介ビデオを入れたかったので<iframe>タグでさきのhtmlコードにコピペし、表示しています。Google MapとYoutubeの埋め込みコードは街灯サイトにて即発行できます。

f:id:pnch:20130402212731p:plainf:id:pnch:20130402212735p:plain

 表示したいところへコピペし、成形すると以下のように表示できます。ここで発行したものはそれぞれwidth="〜"とheight="〜"で表示サイズを変更できるので、自分のサイトに合わせて変えましょう。

f:id:pnch:20130402214037p:plain

最終的なコードはこんな感じです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">

<title>フォームのカスタム</title>
</head>
<body>
<br>これは本文です。<br>
地図<br>会場までのルート<br><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.co.jp/maps?f=d&amp;source=s_d&amp;saddr=%E4%BA%AC%E9%83%BD%E9%A7%85&amp;daddr=%E4%BA%AC%E9%83%BD%E5%BA%9C%E4%BA%AC%E9%83%BD%E5%B8%82%E5%BD%B9%E6%89%80%E5%89%8D%E9%A7%85&amp;hl=ja&amp;geocode=FfLVFQIdu38XCCm_sTfBrggBYDGlPjJIoWh0Mw%3BFbs5FgId_aoXCCk1Z6uHkggBYDEVqijqSuJmAw&amp;aq=0&amp;oq=%E4%BA%AC%E9%83%BD%E5%B8%82%E5%BD%B9%E6%89%80&amp;sll=35.011053,135.769644&amp;sspn=0.020352,0.038624&amp;brcurrent=3,0x6001061f709ae1b3:0x24b6e0f6cc19d7d,0&amp;ttype=now&amp;noexp=0&amp;noal=0&amp;sort=def&amp;mra=ls&amp;ie=UTF8&amp;t=m&amp;start=0&amp;ll=34.998225,135.763962&amp;spn=0.025373,0.008701&amp;output=embed"></iframe><br /><small><a href="https://maps.google.co.jp/maps?f=d&amp;source=embed&amp;saddr=%E4%BA%AC%E9%83%BD%E9%A7%85&amp;daddr=%E4%BA%AC%E9%83%BD%E5%BA%9C%E4%BA%AC%E9%83%BD%E5%B8%82%E5%BD%B9%E6%89%80%E5%89%8D%E9%A7%85&amp;hl=ja&amp;geocode=FfLVFQIdu38XCCm_sTfBrggBYDGlPjJIoWh0Mw%3BFbs5FgId_aoXCCk1Z6uHkggBYDEVqijqSuJmAw&amp;aq=0&amp;oq=%E4%BA%AC%E9%83%BD%E5%B8%82%E5%BD%B9%E6%89%80&amp;sll=35.011053,135.769644&amp;sspn=0.020352,0.038624&amp;brcurrent=3,0x6001061f709ae1b3:0x24b6e0f6cc19d7d,0&amp;ttype=now&amp;noexp=0&amp;noal=0&amp;sort=def&amp;mra=ls&amp;ie=UTF8&amp;t=m&amp;start=0&amp;ll=34.998225,135.763962&amp;spn=0.025373,0.008701" style="color:#0000FF;text-align:left">大きな地図で見る</a></small>
<br>京都の動画<br><iframe width="420" height="315" src="http://www.youtube.com/embed/PjCHwurBi5o" frameborder="0" allowfullscreen></iframe><form action="https://docs.google.com/forms/d/ここにフォームのリンクを/formResponse" method="POST" id="ss-form" target="_self" onsubmit="">
<br><br>
名前:
<input type="text" name="entry.719400388" value="" class="ss-q-short" id="entry_719400388" dir="auto">
<br><br>
性別:<input type="radio" name="entry.2110305272" value="&#30007;&#24615;" id="group_2110305272_1" class="ss-q-radio" aria-label="&#30007;&#24615;"> 男性 <input type="radio" name="entry.2110305272" value="&#22899;&#24615;" id="group_2110305272_2" class="ss-q-radio" aria-label="&#22899;&#24615;"> 女性 <input type="radio" name="entry.2110305272" value="&#12381;&#12398;&#20182;" id="group_2110305272_3" class="ss-q-radio" aria-label="&#12381;&#12398;&#20182;"> その他 
<br>
<input type="hidden" name="draftResponse" value="[]">
<input type="hidden" name="pageHistory" value="0">

<input type="submit" name="submit" value="&#36865;&#20449;" id="ss-submit">
<div class="ss-secondary-text">Google フォームでパスワードを送信しないでください。<br>Powered by
<a class="ss-logo-link" href="http://docs.google.com"><img class="ss-logo" src="https://ssl.gstatic.com/docs/forms/drive_logo_small.png" alt="Google ドライブ"></a>
<br>
<a href="https://docs.google.com/forms/d/ここにフォームのリンクを/reportabuse?source=https://docs.google.com/forms/d/ここにフォームのリンクを/viewform">不正行為の報告</a>
-
<a href="http://www.google.com/accounts/TOS">利用規約</a>
-
<a href="http://www.google.com/google-d-s/terms.html">追加規約</a>

<script type='text/javascript' src='/static/forms/client/js/2803853122-formviewer_prd.js'></script>
<script type="text/javascript">_initFormViewer();</script>
</body>
</html>

終わりに

 というわけで、Google Docsのフォームをカスタマイズして新しいhtmlの作成を行いました。自分のサーバーに入れてアンケートを作成するもよし、このままDropboxで公開するもよしでしょう。(公に公開しないような、頻繁に開かれるようなサイトを作らない場合は。)もし検索ボットに引っかからないようにするならそのためのタグを打ち込んでもいいかもしれません。

 これを応用するとフォーム自身ではできなかったテキストボックス、ラジオボタンを横並びに配置することもできますし、BGMを入れたりすることも当然可能です。アンケート用紙特有のつまらなさを排除することができ、参加率が上がるかもしれません。以上、メモでした。