先週末、カリフォルニア大学バークレー校にて、ご招待をいただいて発表をしてきました。
AIと仏教研究の未来、というテーマのイベントで、世界中から関連研究者が招待されて発表をしていました。要するに、世界のデジタル仏教研究者が集まって発表をする、という会で、年に数回、こういうことが世界の各地で行われているのですが、私はもうなかでも古株というか古参というか、20年近くこの界隈にコミットしてきております。最近はAIの進展でこの世界も新しい展開を見せつつあり、また新しい人が参入してきています。
イベント自体は、生成AIを作っている話とか使ってみた話とか、そこからAIのあり方や利用方法などについて色々な議論が行われていて、とても面白いものでした。私はと言えば、今回はトリをつとめることになったので、面白いネタを、と思いまして、一つはこれまであちこちで話をしてきた(そしてこのブログでもご紹介している)AI-OCRとIIIFを使った木版仏典画像の超効率的なcollationという話だったのですが、もう一つ、RAG (Retrieval-Augmented Generation) を使った生成AI学術研究支援ボットのようなものを作って紹介してみたところ、これもなかなか好評でした。今回の記事は、ここで作ってみた経験を通じて、このRAGというものが、これまでは結構使いにくかったものから急に極めて使いやすくなったという、一大転換点が生じているように思いましたので、これをぜひみなさまにお知らせしなければと思って書いているものです。
この件については、学会発表のようなことをするよりも、まずは自分のやり方を公表してしまって皆で色々試してみることができた方が面白いと思いましたので、とりあえずやり方をお知らせして、少しでも試行する人を増やそうと思って、ブログに書いてしまうことにしました。
RAG、つまり、Retrieval-Augmented Generationは、簡単に言えば、生成AIにあらかじめ専門知識を与えることで良い回答を出させようとするものです。つまり、専門知識の情報を含むプロンプトを作って問い合せるものです。ということはつまり、プロンプトに渡すための「関連する専門知識のデータ」を作らねばならないことになります。これは、生成AIの仕組みを活かすなら、質問文を受け取った時に「関連する専門知識のデータ」を生成して、それをさらに生成AIに渡す、という流れになります。関連する専門知識のデータは、なんらかのデータベースやナリッジベースのようなものから取り出すことになりますが、生成AIが受け取れる分量(トークン数)まで絞り込まねばなりません。そして、生成AIがハルシネーションを起こさずに適切な回答を出力できるようにするためには、おそらくは、文脈を保ちつつ適切な専門用語が含まれている「関連する専門知識のデータ」を生成する必要があるでしょう。これを実現するには、テーマによっては結構な長さの「関連する専門知識のデータ」を生成せざるを得ない場合もあるでしょう。
一方で、少し前までは、一度に読み込めるトークン数は、ChatGPTで8kや32k、という感じでかなり短いものでした。これは、読み込んだそばから時間のかかる計算処理を行わねばならないため、短くても仕方がないと考えられてきたところで、それをなんとかするための技術開発も様々に行われてきました。
しかし、ここにきて、一度に使えるトークン数が急に増えました。Gemini1.5で、100万トークンまでいけるとのことです。トークン数、と、いきなり言われてもなんだかよくわからないかもしれませんが(私も明確にはわからなかったのですが)、一応、それを数えてくれるツールがあるようです。
これによれば、以下のように、英語だと大体1単語1トークンという感じなのですが、
日本語では単語区切りをできているわけではないようで、1300字に対して900トークン、といった案配です。
2割くらい引いた数と考えるとして、1トークン1文字と考えても、100万文字一度に扱えることになりそうです。なお、ここでのトークン制限は、生成AIのAPIに渡すものだけでなく、戻されるトークンなども含まれるので、100万トークンをそのまま送信できるわけではないようです。とはいえ、戻ってくる回答のトークン数などは、100万トークンという数の前ではあまり気にするようなものではなさそうです。
100万字を一気に生成AIに送り込めるとなると、新書なら10冊分くらいになりますね。ただ、今回は新書はターゲットではないので、学術論文で考えてみましょう。そうすると、1つあたり2万字くらいだとしたら、50本の論文が読み込めることになります…というのは料金(従量制の場合)も大変になりますし、ちょっとやりすぎかもしれませんが、20本くらいはまあ楽勝と考えていいでしょうか。そうすると、20本の論文を生成AIに渡して、そこから質問文に対する回答をまとめてもらう、ということになります…としたら、結構いい感じになるのではないでしょうか。
こうなる前には、Claude 3が20万トークンのコンテキストウィンドウを提供し始めた(3/4)という話があり、その後のさらなる発展を予感させたところですが、そこに至る前は8000トークンとか32000トークンに落とし込んでから生成AIに送り込むという話だったため、これはなかなか大変なものがありました。32000トークンだと論文1本か2本でせいぜいなので、そうすると、論理的整合性のある文章を読み込ませようとすると、結局、一つか二つの論文を探してきて渡すことになってしまい、その立場を代弁する(というかその要約になってしまう)か、それに加えて謎の知識が謎に追加されるというやや困った事態になることもありました。あるいは、もっと細かく文章を分割して適合する箇所(章や段落など)のみを様々なソースから抜き出してまとめて生成AIに送るという方法もありましたが、それも断片的な情報に基づいて生成AIが判断をするということになってしまって、向き不向きをかなり選ぶ感じになっていました。 他にもいくつかの方法がありましたが、いずれにしても、生成AIに渡すために短めのテキストを適切に作成するというのが一つの重要な技術開発になっていました。
このような状況で、論文20本読み込んでも問題ない、というようなものが登場したのです。これは、少なくとも学術情報に適切に回答できる生成AIを期待する側としては考えられないくらいありがたいことだ、と思ってしまって、とりあえず実際に作ってみることにしました。
これまでのところ、RAGは、上記のようなトークン数制限(事実上の文字数制限)という事情や、質問文(自然文)から回答を生成しようとするために、生成AIに送るための「関連する専門知識のデータ」も質問文から作成しようとする、といった事情から、ベクターストアというタイプの(単語検索をするのではなく)文書類似度に基づく文書検索ソフトを使うことが多かったようです。いくつかのソフトがフリーで使えるようになっていますが、特に Chroma DBというのがPythonのモジュールで簡単に使えるようになっているため、とりあえずこれを試してみることにするか…と思ったのですが、まず、その前に、「論文20本を読み込ませたら実際にどうなるのか」ということを試してから前に進みたいところです。
ですので、やや迂遠ですが、まずは任意の論文20本を簡単に取り出せる状況を作ってみることにしました。
任意の論文20本を取り出せるようにするためには、論文の全文テキストのようなものが必要になります。そこで、とりあえずJ-STAGEですね。気になる雑誌(ここでは『印度学仏教学研究』という雑誌の約14000本の論文を試してみています。)のPDFファイルを少しインターバルを置きながらダウンロードして、ついでに、論文DOI/URLを含むメタデータも全部タブ区切りでまとめてPDFのファイル名と紐付けられるようにしておきます。(J-STAGEのAPIで取得できる値にはPDFのファイル名が入っていないのでここは(なぜか)手動対応が必要になります)。このあたりは目新しいことではないですし生成AIが作ってくれるプログラムでもいけると思いますので省略します。(リクエストがあれば別途記事を書くかもしれません)
さて、PDFがそろったところでOCRです。ここでのOCRには、もしGPU付きのPCを持っているなら国立国会図書館のOCRソフトがおすすめです。精度が非常に高いのがまず良い点ですが、それ以外に、スクリプトによるバッチ処理ができるので確実にはやくできるという点もなかなかです。でも、GPU付きのPCがなかったり、上記のソフトの使い方がよくわからない…というような場合には、たとえばABBYのFinereaderでも「指定したフォルダ内のPDFファイルを全部OCR」という処理はできるようです。ただ、PDFが異様に重くなったりするのと、一度にたくさんのファイルを予約しておくと固まって動かなくなったりするので(体験談)、小分けにするなどといった工夫が必要かもしれません。
OCRが全部できたら、メタデータのリスト(これはタブ区切りテキストやCSVなどになっていると使いやすいでしょうか)に、この全文テキストをくっつけます。一行一論文(本文入り)のタブ区切りテキストファイル、で、論文本文を1カラムに押し込み、これを1チャンクとします。
さて、ここまでくれば、まあおおむね準備はできたと言えるでしょうか。とりあえずはgrepなどで適当に20本取り出すことにするという前提で次(生成AIのAPIに送り込む)に行きましょう。
生成AIのAPIに送り込むにあたり、今回は100万トークンまでいけるGemini 1.5 proで試してみます。(Flushの方が安いからそっちを使えば、というアドバイスをUCバークレーの会合でグーグルの人にいただきましたが、proの方が精度は高いらしく、とりあえず精度が高い方で試したいのでここではproでいきます)。APIに送り込むためには、まず契約が必要です。契約の仕方はGeminiが教えてくれるのでそちらに聞いてください。「Gemini 1.5 proにAPIでデータを送り込みたいので契約手続きの仕方を教えてください」と問い合せれば喜んで(?)教えてくれます。私の場合は(多分みなさんもそうなるのではないかと思いますが)、Vertex AIというサービスに申し込んで、そこからGemini 1.5 proのAPIを使う形になっています。使用開始までに色々クリックしなければならないので、変だなと思ったらその都度Geminiに詳しく状況と疑問を伝えれば色々教えてくれます。
APIの認証に関してなのですが、Gemini 1.5 proのAPIを実際に使うには、認証キーファイルのようなものを取得しておくのが楽です。「サービスアカウントキーファイル」のような名前のjsonファイルを、Vertex AIのサービスの設定(?)画面でダウンロードできるようになっていますので、ダウンロードして適切なフォルダに入れて、ファイル名を控えておいてください。
ということで、まあ大体準備は終了のはずです。次に、APIに論文データを送り込むためのスクリプトです。
ここで、RAG用のフレームワークとして名高いLangchainを使うのが一般的のようなのですが、今回は、なるべくプリミティブに、処理を一つずつ追いかけていきたいので、ごく単純な「データをAPI送り込んで戻ってきたテキストを見る」というだけのものを作ってみます。
今回は、「送り込むための論文データ」は別ファイルとした上で、そのファイル名をコマンドラインで指定すると読み込めるようにします。つまり、
$ python rag_content.py 論文データファイル名(20本/20行くらいのTSVファイル)
ということになります。 それで、 rag_content.pyの中身ですが、これはGeminiに頼んでもなぜかうまく書いてくれなかったので、別のところで情報を得てなんとかしました。それが以下のものです。 (「サービスアカウントキーファイルのパス」のところには、自分がダウンロードしたファイルのパスを入れておいてください。)
import os
import sys
from google.oauth2 import service_account
from vertexai import init
#from vertexai.preview.language_models import TextGenerationModel
from vertexai.generative_models import GenerativeModel, Part, SafetySetting
# サービスアカウントキーファイルのパス
SERVICE_ACCOUNT_KEY_FILE = 'gen-lang-client-07hogehoge-hogehoge.json'
# サービスアカウントキーを読み込む
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_KEY_FILE)
# プロジェクトIDとリージョンを初期化
init(
project="gen-lang-client-hogehoge", # プロジェクトIDを指定
location="us-central1", # リージョンを指定
credentials=credentials
)
with open(sys.argv[1]) as f:
search_results = f.read()
generation_config = {
"max_output_tokens": 8192,
"temperature": 1,
"top_p": 0.95,
}
# モデルの初期化
model = GenerativeModel(
"gemini-1.5-pro-002",
)
safety_settings = [
SafetySetting(
category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold=SafetySetting.HarmBlockThreshold.OFF
),
SafetySetting(
category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold=SafetySetting.HarmBlockThreshold.OFF
),
SafetySetting(
category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
threshold=SafetySetting.HarmBlockThreshold.OFF
),
SafetySetting(
category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold=SafetySetting.HarmBlockThreshold.OFF
),
]
search_results = '以下の質問を、「内容」の内容を踏まえて回答してください。回答のフォーマットはHTMLとしてください。それから、引用したチャンクにおけるURLは必ず明示
し、クリックすると新しいウインドウで開くようにしてください。\n質問:ナーガールジュナの中論における中心的課題について教えてください。\n内容:'+search_results
responses = model.generate_content(
[search_results],
generation_config=generation_config,
safety_settings=safety_settings,
stream=True,
)
for response in responses:
print(response.text, end="")
これに読み込ませるための20本の論文を、とりあえずは対象となる論文全文テキストのタブ区切りファイルがありますのでgrepなどで適当に集めて「送り込むための論文データ」を作り、上記のようにpythonで動かしてみると、まあ大体以下のような回答を得られます。
ナーガールジュナの中論における中心的課題
ナーガールジュナ(龍樹, Nāgārjuna, Nagarjuna)の『中論』(根本中頌, Madhyamakaśāstra, Madhyamakasastra, Madhyamaka-śāstra, Madhyamaka-sastra, Mūlamadhyamakakārikā, Mulamadhyamakakarika, Mūlamadhyamaka-kārikā, Mulamadhyamaka-karika)における中心的課題は、あらゆる存在は実体を持たない「空」であることを論証し、縁起の真義を明らかにすることです。実体(自性, svabhāva)とは、それ自身で存在し、他のものに依存せずに成立する性質を指します。ナーガールジュナは、あらゆる現象は相互依存的に生起する縁起によって成立するため、独立した実体を持つことはないと主張します。
空の論証
ナーガールジュナは、帰謬法を用いて空を論証します。帰謬法とは、ある命題の否定を仮定し、そこから矛盾を導き出すことで、元の命題が真であることを証明する方法です。彼は、あらゆる存在が実体を持つと仮定すると、そこから「生」「滅」「一」「異」「来」「去」といった概念に関して矛盾が生じることを示します。例えば、もし実体があれば、それは不変であるはずなので、生じることも滅することもありません。しかし、現実にはあらゆるものは生滅変化を繰り返します。このように、実体の存在を仮定すると矛盾が生じるため、あらゆる存在は空であると結論づけます。
木村秀雄氏(文學的立場より見たるナーガールジュニコンダの彫刻美術, 1961)は、ナーガールジュニコンダの彫刻美術に見られる様々な主題と、当時の文学作品との関連を論じています。中でも「火中捨身布施の兎」の彫刻は、ジャータカ物語における菩薩の転生である兎が、自らの身を燃やして布施を行う場面を描写しています。この物語は、利他の実践を象徴するものであり、大乗仏教の精神に通じるものと言えるでしょう。一方で、木村氏は、ミトゥナ彫刻に見られる官能表現が、カーマスートラのような世俗文学と関連付けられる一方で、仏教徒の自制も表現していると指摘しています。これは、ナーガールジュナが『中論』で説く空の思想が、世俗的な価値観を否定するものではなく、むしろそれを包含するものであることを示唆していると言えるかもしれません。
縁起の真義
ナーガールジュナは、空の論証を通じて、縁起の真義を明らかにしようとします。縁起とは、あらゆる現象は互いに依存し合って生起することを意味します。彼は、実体があると仮定すると、縁起が成立しないことを示します。なぜなら、もし実体があれば、それは他のものに依存せずに存在するはずだからです。しかし、現実にはあらゆるものは他のものに依存して存在します。例えば、種子は土や水、日光などに依存して芽を出します。このように、実体の存在を否定することで、縁起の真義が明らかになると彼は考えます。
金子宗元氏(中観派二諦説の思想的展開, 1999)は、ナーガールジュナの二諦説が、後世の唯識思想や如来蔵思想の影響を受けて変容していったことを指摘しています。特にチャンドラキールティは、弥勒系論書の影響を受け、「実義」とそれを覆い隠すものとの二項対立で理論を構築しました。この「実義」とは、ナーガールジュナが『中論』で説く「空」に近い概念と言えるでしょう。チャンドラキールティは、この「実義」を覆い隠すものとして、世俗的な認識を挙げ、それを乗り越えることで「実義」に到達できると主張します。これは、ナーガールジュナが縁起の真義を明らかにすることで、迷いを超えた悟りの境地に至ることができるとする主張と通じるものと言えるでしょう。
中論の中心的課題の意義
ナーガールジュナが『中論』で示した空と縁起の思想は、後世の大乗仏教に大きな影響を与えました。彼の思想は、あらゆる存在に固執する心を離れ、執着から生じる苦しみから解放されるための指針となります。また、空を理解することで、あらゆる存在は相互依存的に存在していることを認識し、他者への慈悲心を育むことができます。この慈悲心は、大乗仏教の根幹をなす菩薩行の実践へとつながります。
岸根敏幸氏(ナーガールジュナとチャンドラキールティ, 2000)は、ナーガールジュナの空の思想と、大乗仏教の利他行との関連性について論じています。ナーガールジュナ自身は、空の思想と大乗仏教との関係を明確にはしていませんでしたが、後世のチャンドラキールティは、空の思想を菩薩行の実践と結びつけることで、大乗仏教の理論的基盤を確立しようとしました。これは、ナーガールジュナが『中論』で示した空の思想が、単なる理論にとどまらず、実践的な意味を持つものであることを示唆していると言えるでしょう。
このように、ナーガールジュナの中論における中心的課題は、単なる形而上学的な議論にとどまらず、人間の苦しみを根本から解決するための実践的な道を開くものでした。彼の思想は、現代社会においてもなお、重要な示唆を与え続けていると言えるでしょう。
このように、「送り込むための論文データ」の内容に回答が大きく左右されますので、あとは、「どうやって質問文にフィットする論文を選び出すか」ということになります。ここで、とりあえずchroma DBを使ってみたのですが、専門的な論文から探そうという場合、chroma DBだとうまく専門用語にたどりつかず、かえって関係の薄い論文を取り出してしまうことが散見されました。
そこで、Apache Solrでもキーワード検索に持ち込めば文書類似度検索もできる、という風に前向きに考えて、
- 質問文をSpacyでトークナイズして名詞と固有名詞だけをとりだし、
- 固有名詞は専門用語シソーラスで展開して OR検索できるようにして
- 「(同義語1 OR 同義語2 OR 一つ目の名詞 ) AND 二つ目の名詞 AND 三つ目の名詞」というような感じでApache Solrで検索して20本の論文を取り出してみる…
ということをしてみたところ、意外とよい感じになりました。たとえば以下のような感じです。なかなか良い感じであるような気がします。
質問:
日本の寺社における聖教資料の保存の状況について教えてください。
回答:
日本の寺社における聖教資料の保存の状況
日本の寺社における聖教資料の保存状況は、複雑な歴史的経緯を反映し、一様ではありません。廃仏毀釈の影響や、その後の復興運動、さらには各宗派、寺院の個別事情が絡み合い、多様な状況を生み出しています。
廃仏毀釈の影響
明治維新期の廃仏毀釈は、仏教寺院、仏像、そして聖教資料に甚大な被害をもたらしました。松井孝純「法華宗が種子島に於て被つた廃仏毀釈と復興」(1976、URL)によれば、種子島では薩摩藩の政策に基づき、寺領没収、寺宝・什器の破壊、僧侶の強制還俗が行われました。この壊滅的な状況は、種子島における法華宗寺院の過去帳や石塔群の残存状況からも伺い知ることができます。仏教関連資料の焼却や破壊は各地で起こっており、聖教資料の散逸、喪失という結果をもたらしました。
聖教資料の隠匿と保護
廃仏毀釈の嵐の中で、全ての聖教資料が失われたわけではありません。僧侶や信徒の中には、危険を冒してまで貴重な資料を隠匿し、保護しようとした人々がいました。松井孝純(前掲論文)は、種子島において釈迦・多宝・日蓮・鬼子母神像などの仏像や、日蓮、日隆の真筆マンダラなどが掘り出され、現在も大切に保管されていることを報告しています。このように、散逸を免れた聖教資料は、その後の仏教復興に大きな役割を果たしました。
復興運動と聖教資料
廃仏毀釈後、信教の自由が認められると、各地で仏教復興運動が起こりました。松井孝純(前掲論文)は、種子島において法華宗寺院の復興が、両本山からの巡教や信徒の活動によって進められたことを示しています。この復興運動の中で、隠匿されていた聖教資料は再び日の目を見ることとなり、信仰の拠り所として、また宗門再建の指針として重要な役割を果たしました。大本山では、教団の再興を願う強い思いが記録されています。
寺院における聖教資料の保存と管理
寺院は、古来より聖教資料の保存と管理を担ってきました。下田正弘「大乗仏教起源論再考」(2013、URL)は、律蔵の記述に基づき、経典の書写、保存、管理は在家信者も重要な役割を担っていたことを指摘しています。また、蓑輪顕量「東大寺所蔵の法会に関する写本 -経釈と論義から-」(2004、URL)は、東大寺図書館に、法会に関する写本資料、論義や唱導に関する資料が豊富に所蔵されていることを紹介し、これらが当時の仏教教学の実態を知る上で貴重な資料となっていることを示しています。これらの資料は、寺院における聖教資料の継承と研究の営みを物語るものです。宮地廓慧「『歎異抄』の「大切の証文」について」(1970、URL)では、『歎異抄』の「大切の証文」に関する議論を紹介していますが、これも聖教資料の解釈と伝承をめぐる重要な問題提起です。椎名宏雄「『万善同帰集』の文献史的考察」(2007、URL)は、『万善同帰集』の刊行と流通の歴史を明らかにし、各時代の版の違いや、版本に記された情報が、当時の社会状況や仏教界の動向を知る上で貴重な資料となることを示しています。古賀克彦「河内国壺井通法寺に就いて」(2006、URL)は、通法寺という特定の寺院の歴史と変遷を通して、聖教資料の伝来と散逸、そしてその保存に関わる問題を浮き彫りにしています。
聖教資料研究の意義
聖教資料は、過去の仏教思想、教学、信仰を知る上で不可欠の資料です。椎名宏雄「『禅門拈頌集』の資料価値」(2002、URL)は、『禅門拈頌集』に収録された公案や著語が、当時の禅宗における思想動向を知る上で貴重な資料となることを指摘しています。山崎龍明「柘植信秀の真宗論」(2003、URL)は、柘植信秀という近代真宗僧侶の思想を通して、近代仏教が社会問題とどのように関わってきたかを考察しています。菊池武「近世における俳諧師と遊行家-特に北陸地方での安楽坊春波法師の活動について-」(1974、URL)は、俳諧師と遊行家の活動を通して、仏教文化が民衆の生活に浸透していく過程を明らかにしています。笠松直「ミャンマー所伝南方仏教古写本調査報告」(2014、URL)は、ミャンマーの寺院に所蔵される南方仏教の写本調査を通して、聖教資料の保存と研究の国際的な連携の重要性を示しています。奈良弘元「空也伝にみられる慈善事業」(1987、URL)は、空也の伝記から、古代における仏教と社会事業との関わりを考察しています。朴鎔辰「元代『科註妙法蓮華経』の刊行と流通」(2016、URL)は、『科註妙法蓮華経』の刊行と流通の歴史を通して、東アジアにおける仏教文化の交流と伝播を明らかにしています。都河陽介「長沼賢海写『華厳経論』断簡について」(2021, URL)は、『華厳経論』の断簡を通して、経典の伝来と受容の歴史を考察しています。秋津秀彰「初期曹洞宗教団における『正法眼蔵』の伝来について」(2022、URL)は、『正法眼蔵』の伝来と受容の歴史を通して、初期曹洞宗の教団形成を考察しています。Shobha Rani Dash「文化史の観点から見るコロフォン研究の重要性――オディシャー州の宗教系貝葉写本を事例として――」(2019、URL)は、インドの貝葉写本のコロフォン(奥書)に着目し、そこに記された情報が、写本の歴史や文化的な背景を知る上で重要であることを示しています。田戸大智「身延文庫蔵「大乗義章抄」所引の文献・逸文について」(2019、URL)は、「大乗義章抄」に引用された文献や逸文を分析することで、院政期の学問研究の状況を明らかにしています。金子寛哉「日本における群疑論の引用 (二)」(1982、URL)は、『群疑論』の引用状況を分析することで、浄土教思想の受容と伝播の過程を明らかにしています。早島鏡正「自然・風土的基盤と原始佛教思想」(1960、URL)は、原始仏教思想とインドの自然・風土との関係を考察しています。高橋秀榮「鎌倉時代の仏名会」(2004、URL)は、鎌倉時代の仏名会という仏教行事を通して、当時の信仰や社会状況を考察しています。宇治谷祐顕「南海の仏教遺跡ボロブドール」(1978、URL)は、ボロブドール遺跡の調査を通して、仏教美術や建築様式、そしてその背後にある思想を考察しています。これらの研究は、聖教資料が単なる過去の遺物ではなく、現代社会を理解するための重要な手がかりとなることを示しています。
あとは、これをさっくり簡単にWebから使えるようにすれば、まあ大体OKですね。なお、Apache Solrの使い方については、このブログの過去記事にさんざん書いてありますが、リクエストが多ければこの記事の続編ということで改めて少し書くかもしれません。