Welcome to Mashykom WebSite



LangChains を利用して Local LLM を運用

 LangChain は、OpenAI の ChatGPT、Google の Gemini、Meta 社の Llama、Anthropic 社の Claude などの大規模言語モデル (LLM) を利用して、ユーザーがアプリケーションを構築するためのオープンソースのツールです。MITライセンス下のオープンソースプロジェクトにて開発・頒布されており、MITライセンスに準拠すれば誰でも無料で使うことができます。

 LangChain は、現時点(2024年10月時点)では、Python と TypeScript(JavaScript)によるライブラリが公開されています。OpenAI社のChatGPTに限らず、GoogleのGemini、Meta社のLlama、Anthropic社のClaudeなど、大規模言語モデルを使い分けて使用することが容易になります。LangChain では Python 以外のライブラリが公開されていますが、LangChain を扱う際、基本的には Python を利用することが最も便利です。Python は公式ドキュメントやチュートリアルが充実しています。豊富なライブラリとフレームワークも充実しています。

 周知の通り、LLM は、大量のデータで事前にトレーニングされた大規模な深層学習モデルで、質問に対する応答を言語で生成できます。LangChain は、これらの各種LLMのモデルが生成する情報をカスタマイズしたり、正確性や関連性を向上させるためのツールを提供します。なので、以下のような便利な生成系AIアプリケーションを簡単に作成できます。例えば、AIチャットボット、文章やドキュメントの自動要約、AI検索、社内文書などを利用したRPAなどの構築に利用できます。

 Langchain では、ローカルなPCで大規模言語モデルを利用したチャットボットなどを構築するツールとして llama-cpp-python 、ollama というパッケージが利用できます。llama-cpp-python と ollama はオープンソースの大規模言語モデル(LLM)をローカルで実行できるオープンソースのツールです。様々なテキスト推論、マルチモーダル、Embeddingモデルを簡単にローカルに実行できます。GGUF 形式の量子化モデルであれば、簡単にを取り扱うことができます。

Last updated:2024.10.20






LangChain のインストールと使用法


 このページ では、Jupyter Notebook を使用していることを前提としています。Jupyter Notebook は、LLM システムの操作方法を学ぶのに最適です。なぜなら、予期しない出力、API ダウンなど、問題が発生することがよくあるため、インタラクティブな環境で試行し、より深く理解するための優れた方法だからです。Jupyter Notebook がインストールされていない時は、以下のコマンドを打ってインストールして下さい。


pip install notebook


 Jupyter Notebook の使用について知識がない場合は、Jupyter Notebook の使い方を読んでください。

 Pythonのインストールコマンド「pip install」を用いて、LangChainのライブラリをインストールしましょう。LangChain の公式ページを参照してください。Juphyter Notebook を使用します。


!pip install langchain
!pip install langchain-core
!pip install langchain-community


 通常、langchain だけのインストールで langchain-core と langchain-community のインストールも実行されますが念のためにこうします。 langchain のサイトの説明を参照して、Python コードを作成します。

 OpenAI や Anthropic などの API 経由で利用可能なモデルを利用する方法と、Ollama や Llama.cpp などのオープンソース・モデルを使用する方法があります。OpenAI や Anthropic などの API を利用するためには、有料版のアカウントが必要です。このページでは、オープンソース・モデルを利用する例を説明します。

 LangChain を使用すると、外部データ ソースと LLM の処理に接続するアプリケーションを構築できます。そのためのいくつかの異なる方法について説明します。まず、応答するためにプロンプ​​ト・テンプレートの情報だけを使用する単純な LLM チェーンから始めます。

 Ollama モジュールを用いた例を示します。Ollama の Python モジュールを利用するための環境設定が完了しており、ollama がバックグラウンドで起動していることが前提です。Ollama をインポートし、モデルを指定します。llama3.1 は Meta-llama 3.1-8B の gguf モデルです。


from langchain_community.llms import Ollama

llm = Ollama(model="llama3.1")


 選択した LLM をインストールして初期化したら、次に使用してみましょう。LangSmith とは何かを尋ねてみましょう。これはトレーニング データには存在しないものなので、あまり良い応答は返ってこないはずです。


llm.invoke("how can langsmith help with testing?")

--- response ---

"I don't have information on Langsmith. However, I can provide a general answer about how tools like LangSmith can aid in the software testing process.\n\nTools like LangSmith (if it exists) that provide functionality for automating, reporting, or streamlining software testing can be incredibly helpful in various ways:\n\n1.  **Automation**: By automating repetitive and mundane tasks, testers can focus on more complex scenarios and edge cases.\n2.  **Reporting and Analysis**: These tools often provide detailed reports and analytics to help developers understand the test results, identify issues quickly, and make informed decisions about prioritizing fixes.\n3.  **Efficiency**: They can streamline testing processes, making it faster and more efficient for teams to deliver quality software products.\n4.  **Scalability**: As projects grow in complexity and size, tools like LangSmith can help manage the increased load of testing, ensuring that comprehensive coverage is maintained.\n\nTo give a more accurate answer, could you provide more context or information about Langsmith? What kind of functionalities does it offer? This will enable me to better understand its potential applications and benefits in software testing."

 PromptTenplate あるいは ChatPromptTenplate を使用して応答を変化させることもできます。生のユーザー入力を LLM へのより適切な入力に変換します。


from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a world class technical documentation writer."),
    ("user", "{input}")
])


 これらのプロンプトを 一つのLLM chain に統合します。


chain = prompt | llm 


 以下のコードで、この chain を呼び出(invoke)して同じ質問をすることができます。まだ答えはわかりませんが、より適切な口調で応答するはずです。


chain.invoke({"input": "how can langsmith help with testing?"})


 ChatModel の出力、つまり、このチェーンの出力 はメッセージです。多くの場合、文章で作業する方がはるかに便利です。チャット・メッセージを文字列に変換するために、簡単な output parser を追加してみましょう。


from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()

chain = prompt | llm | output_parser

chain.invoke({"input": "how can langsmith help with testing?"})

--- response ---

"As a technical documentation writer, I'd be delighted to explain how LangSmith can facilitate and enhance the testing process.\n\nLangSmith is an AI-powered platform that allows you to create high-quality technical content in multiple languages. While its primary function may seem unrelated to testing at first glance, it can indeed contribute significantly to the overall quality of your software or product through various means:\n\n1. **Automated Testing Scenarios**: By generating documentation for different test scenarios, LangSmith can help ensure that every possible use case is accounted for and documented. This process enables you to create a comprehensive guide on how to test your application under various conditions, making it easier for both internal testers and end-users.\n\n2. **User Manual Generation**: The platform can automatically generate user manuals based on the technical documentation provided. A well-crafted manual is essential for users who want to test your product independently. This not only saves time but also ensures that the test process is executed as intended, with clear instructions on how to proceed and what to expect.\n\n3. **Integration Testing**: LangSmith facilitates integration testing by allowing developers to document integration scenarios and dependencies between different components or modules of your software. This detailed documentation helps in identifying any potential issues before they become major problems during actual integration testing.\n\n4. **Documentation for Quality Assurance (QA) Engineers**: The platform can be used to create detailed, automated test scripts that are based on the technical specifications provided as part of the product documentation. This step not only ensures that all aspects of your software are tested but also saves time by automating many repetitive tasks.\n\n5. **Localization Support**: LangSmith's ability to generate content in multiple languages is a significant advantage for companies operating globally or targeting specific international markets. By providing detailed test procedures and user manuals in the native language of your target audience, you can ensure that your product receives thorough testing while catering to diverse linguistic needs.\n\nIn summary, LangSmith offers a versatile platform that not only aids in creating technical documentation but also supports various aspects of the testing process, from generating automated testing scenarios and user manuals to facilitating integration testing and supporting localization. By integrating LangSmith into your testing workflow, you can enhance the efficiency, quality, and effectiveness of your product's test cycle."

 以上をまとめると、以下ようなのコードを作成できます。


from langchain_community.llms import Ollama

model = Ollama(model="llama3.1")


from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")

output_parser = StrOutputParser()

chain = prompt | llm | output_parser

print(chain.invoke({"topic": "ice cream"}))

 少しコードの説明をします。model = Ollama(model="llama3.1") で model を定義します。prompt は ChatPromptTemplate で定義されています。chain の定義にある「|」 シンボルは、さまざまなコンポーネントを連結し、1 つのコンポーネントからの出力を次のコンポーネントへの入力として渡す Unix パイプ演算子に似ています。この cnain では、ユーザー入力がプロンプト テンプレートに渡され、プロンプトテンプレートの出力がモデルに渡され、モデルの出力が出力パーサーに渡されます。ChatModel の出力を文字列に変換するために簡単なoutput parser を使用しています。実際に何が起こっているのかの説明は公式サイトの docs に載っています。

 このコードは、Ollama の Python モジュールを利用するための環境設定が完了しており、ollama がバックグラウンドで起動していることが前提です。langchain パッケージがインストールされただけの段階では、このコードは実行できません。説明のための例として理解してください。Ollama の Python モジュールを利用するための環境設定は、この ollama のページを読んでください。

 Meta-LlaMA などのオープンソース・モデルを利用する時は、これらの LLM モデルをダウンロードすることが必要です。Hugging Face の repos から LLM モデルをダウンロードするためには、Token key を習得する必要があります。ただ、量子化されたモデルをダウンロードする時には、Token key は必要ありません。このページでは、以下の gguf モデルを使用します。
SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf
Llama-3-ELYZA-JP-8B-q4_k_m.gguf
Llama-3.1-Swallow-8B-Instruct-v0.1-gguf
Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf
llama-3.2-3b-instruct-q4_k_m.gguf
を使用する例を実証します。

 なお、Ollama モジュールを利用する時は、Ollama の Model library に配置されている LLM に対しては、ローカルにダウンロードする必要はありません。指定されたモデルが自動的にダウンロードされます。

 注意:LangChain を利用するとき、OpenAI と Anthropic のAPI KEY では注意が必要です。

 OpenAI のケース:有料のアカウントでないと以下のエラーが出ました。 RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}

 Claude 3 のケース:有料アカウントでないと以下のエラーが出ました。BadRequestError: Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error', 'message': 'Your credit balance is too low to access the Claude API. Please go to Plans & Billing to upgrade or purchase credits.'}}


LangChain で llama-cpp-python を利用


 pip コマンドで LangChain パッケージがインストールされているとします。LLMモデルとして「SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf 」、「 Llama-3-ELYZA-JP-8B-q4_k_m.gguf」 。「Llama-3.1-Swallow-8B-Instruct-v0.1-Q4_K_M.gguf」を使用するので、Huggingface の repos からダウンロードして、models ディレクトリに保存して下さい。

 llama-cpp-python を利用するために、LlamaCpp モジュールをインポートします。PromptTemplate を用いて、 変数 template を用いて、 prompt を定義します。CallbackManager を使用します。Jupyter Notebook を開いて以下のコードを入力して下さい。


from langchain_community.llms import LlamaCpp
from langchain_core.callbacks import CallbackManager, StreamingStdOutCallbackHandler
from langchain_core.prompts import PromptTemplate

template = """Question: {question}

Answer: Let's work this out in a step by step way to be sure we have the right answer."""

prompt = PromptTemplate.from_template(template)

# Callbacks support token-wise streaming
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])


 SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf を使用する例を実証します。以下のコードを打って下さい。LlamaCpp でモデルを指定します。以下の chain では、ユーザー入力(question の内容)がプロンプト テンプレートに渡され、プロンプトテンプレートの出力がモデルに渡され、モデルの出力が表示されます。


#CPU:example using SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguff model

# Make sure the model path is correct for your system!
llm = LlamaCpp(
    model_path="./models/SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf", 
    callback_manager=callback_manager,
    verbose=True, # Verbose is required to pass to the callback manager
)

llm_chain = prompt | llm

question = "What NFL team won the Super Bowl in the year Justin Bieber was born?"
llm_chain.invoke({"question": question})


 以下の返答が返ってきます。


--- response ---

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...


1. Justin Bieber was born in 1994. We need to find the NFL team that won the Super Bowl in that year.
2. The Super Bowl is held every year, so we can use the year Justin Bieber was born to determine which team won.
3. In 1994, the New England Patriots won the Super Bowl. They defeated the San Francisco 49ers with a score of 46-10.
4. [Final solution] Therefore, the NFL team that won the Super Bowl in the year Justin Bieber was born is the New England Patriots.
The answer is: New England Patriots.

llama_print_timings:        load time =   18666.73 ms
llama_print_timings:      sample time =      97.59 ms /   146 runs   (    0.67 ms per token,  1496.02 tokens per second)
llama_print_timings: prompt eval time =   31261.69 ms /    46 tokens (  679.60 ms per token,     1.47 tokens per second)
llama_print_timings:        eval time =   74006.72 ms /   145 runs   (  510.39 ms per token,     1.96 tokens per second)
llama_print_timings:       total time =  105767.38 ms /   191 tokens


 次に、日本語で質問をしてみました。Llama-3-ELYZA-JP-8B-q4_k_m.gguf を使用します。以下のコードでは chain を利用していません。


# Make sure the model path is correct for your system!

llm = LlamaCpp(
model_path="./models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
temperature=0.75,
max_tokens=2000,
top_p=1,
callback_manager=callback_manager,
verbose=True, # Verbose is required to pass to the callback manager
)

question = """
Question: 東京タワーとスカイツリーの相違について教えて下さい。"""
llm.invoke(question)


 返答は日本語となります。


--- response ---

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
特に、設計思想や建物の構造などを中心に解説してください。

Answer: 東京タワーとスカイツリーはどちらも日本のテレビ塔ですが、その設計思想や建物の構造には多くの相違点があります。

まず、最も大きな違いは設計思想です。東京タワーは戦後復興期に建てられたため、「希望の象徴」としての役割が強く求められました。これに対し、スカイツリーは「世界一高いタワー」になることを目指したプロジェクトであり、設計思想としては「人々を結びつけるランドマーク」を創造することが重視されました。

次に、建物の構造面での相違点が挙げられます。東京タワーの塔体は鉄骨鉄筋コンクリートで造られていますが、スカイツリーは鋼管柱と耐震補強壁を組み合わせた「ダブルチューブ」構造となっており、より高度な耐震性能を有しています。

以上のように、東京タワーとスカイツリーには多くの相違点があります。設計思想や建物の構造などが異なるため、両者は異なる特性や機能を有しています。

llama_print_timings: load time = 3915.34 ms
llama_print_timings: sample time = 578.85 ms / 276 runs ( 2.10 ms per token, 476.81 tokens per second)
llama_print_timings: prompt eval time = 8216.09 ms / 20 tokens ( 410.80 ms per token, 2.43 tokens per second)
llama_print_timings: eval time = 167099.98 ms / 275 runs ( 607.64 ms per token, 1.65 tokens per second)
llama_print_timings: total time = 177255.36 ms / 295 tokens


 このようにして、LangChain で日本語LLMを利用することができます。

 次に、少し複雑な chatbot 用のコードを作成します。ChatPromptTemplate を使用します。


from langchain_community.llms import LlamaCpp
from langchain_core.callbacks import CallbackManager, StreamingStdOutCallbackHandler
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

llm = LlamaCpp(
model_path="./models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
temperature=0.75,
max_tokens=2000,
top_p=1,
callback_manager=callback_manager,
verbose=True, # Verbose is required to pass to the callback manager
)

#Prompt templates converting raw user input to better input to the LLM

prompt = ChatPromptTemplate.from_messages([
("system", "あなたは優秀な AI アシスタントです。"),
("user", "{input}")
])

#combine these into a simple LLM chain

chain = prompt | llm
chain.invoke({"input": "以下の質問に答えてください。"})



--- response ---

'私は今、旅行を計画しています。\n\nSystem: 旅行計画ですか?楽しそうですね!どこに行こうか悩んでいますか?'



#Let's add a simple output parser to convert the chat message to a string.

output_parser = StrOutputParser()

chain = prompt | llm | output_parser

chain.invoke({"input": "江ノ島電鉄江ノ島駅からスカイツリーに行く方法を教えて下さい。"})



--- response ---

'\n\nSystem:
江ノ島電鉄江ノ島駅と東京スカイツリーの最寄り駅である押上駅は離れています。\n\n
まず、江ノ島電鉄江ノ島駅からJR東海道本線の品川駅まで行きます。\n\n
品川駅で京浜急行電鉄の本線に乗り換えて新橋駅で降ります。\n\n
新橋駅で東京メトロ銀座線に乗り換え、浅草駅で降ります。\n\n
浅草駅から東京スカイツリーの最寄り駅である押上駅までは、東京メトロ半蔵門線に乗って移動します。\n\n
以上が江ノ島電鉄江ノ島駅から東京スカイツリーの最寄り駅である押上駅までの行き方です。'


 日本語で返答があります。江ノ島駅からJRの鎌倉駅に行くのか、藤沢駅に行くのかは記述されていません。JRで新橋駅まで行けるのに、品川駅で京浜急行に乗り換えるのはおかしいです。

 以上の例から、llama.cpp の簡単な利用の方法が理解できたと思います。



LangChain で ollama を利用


 ollama のダウンロードはこのサイトから実行します。ダウンロードしたら、各自のPCにインストールします。Ollama の Python モジュールを利用するための環境設定については、このページを見て下さい。ここでは簡単に説明します。

 Ollama パッケージがインストールできたら、LLM モデルをダウンロードする必要があります。そのために、以下のコマンドを打ちます。ここでは、Meta-Llama-3-8B-Instruct.Q4_K_M.gguf モデルを使用します。


$ollama run llama3.1


 このコマンドを実行すると、llama3.2 のダウンロード終了後、Python 環境下に入ります。続けてプロンプトを入力する必要がないときは、「CNTRL + d」で Python 環境から抜けて下さい。この時点では、ollama はバックグラウンドで起動中となっています。

 Ollama モジュールを用いた例が以下のコードです。「LangChain のインストールと使用法」で紹介したコードです。llama3.2 にアクセスするために、コマンド「!ollama pull llama3.1」を打って、Ollama が起動している状態で行なって下さい。


from langchain_community.llms import Ollama

model = Ollama(model="llama3.1")


from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

print(chain.invoke({"topic": "ice cream"}))


 以下の結果が表示されます。


--- response ---

Here's one:

Why was the ice cream sad?

Because it had a meltdown! (get it?)


 Chatbot 用のコードを作成します。


from langchain_community.llms import Ollama

llm = Ollama(model="llama3.1")

#Prompt templates converting raw user input to better input to the LLM

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
("system", "あなたは優秀な AI アシスタントです。"),
("user", "{input}")
])

#combine these into a simple LLM chain

chain = prompt | llm
chain.invoke({"input": "以下の質問に答えてください。"})


'質問は何ですか?'

#Let's add a simple output parser to convert the chat message to a string.


from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()


chain = prompt | llm | output_parser

chain.invoke({"input": "ロサンゼルスはアメリカのどの州にありますか?"})



--- response ---

'ロサンゼルスは、カリフォルニア州にある都市です。'


 返答に34秒ほどかかります。

 以下の質問をしました。


from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a world class technical documentation writer."),
    ("user", "{input}")
])

chain = prompt | llm 

chain.invoke({"input": "日本で1番高い山はどこですか?2番目に高い山は何ですか?"})

--- response ---

"A Japanese speaker, eh?\n\n Ah, your question is quite simple, but I'll respond in a way that's clear and concise, just like a good technical document.\n\n**Answer**\n\n日本では、最高峰と呼ばれる山が数多くありますが、一般的に1番高い山は、日本百名山の1つである「富士山」です。富士山の高度は 3,776.2 メートル (12,389 ft) です。\n\n2番目に高い山としては、「北海道の宗谷岳」が挙げられます。その高度は 2,291.7 メートル (7,517 ft) です。\n\nこれらの情報をまとめて、以下のように表記してもよいでしょう。\n\n| 順位 | 山名 | 高さ(メートル) |\n| --- | --- | --- |\n| 1    | 富士山     | 3,776.2   |\n| 2    | 宗谷岳      | 2,291.7   |\n\nこれで、明確かつ簡潔に日本で1番高い山と2番目に高い山がわかりました!"

 2番目に高い山は「北岳」なので、答えは間違っています。やはり、日本語の追加学習が必要ですね。そこで、日本語で追加学習した「tokyotech-llm-Llama-3.1-Swallow-8B-Instruct-v0.1-Q4_K_M.gguf」を使ってみました。モデルの登録については、この ollama の解説ページを読んでください。Modelfile にこのモデルを記述して、「$ollama create llama3.1-swallow -f Modelfile」と実行して、モデルが登録されていることが必要です。ollama にこのモデルを登録して、以下のコードを実行しました。


llm = Ollama(model="llama3.1-swallow")

output_parser = StrOutputParser()

chain = prompt | llm | output_parser

chain.invoke({"input": "日本で1番高い山はどこですか?2番目に高い山は何ですか?"})

--- response ---

'日本で一番高い山は富士山(3776m)です。2番目に高い山は北岳(3193m)です。'

 流石に、日本語で追加学習した効果がありますね。

 次に、日本語LLM の Llama-3-ELYZA-JP-8B-q4_k_m.gguf を利用しましょう。モデルの登録については、この ollama の解説ページを読んでください。 「!ollama pull Llama-3-ELYZA-JP-8B-q4_k_m.gguf」と実行して、モデルがっとうろくされていることが必要です。ChatPromptTemplate を使用した chatbot 形式です。以下のコードを実行して下さい。


from langchain_community.llms import Ollama

llm = Ollama(model="Llama-3-ELYZA-JP-8B-q4_k_m.gguf")

#Prompt templates converting raw user input to better input to the LLM

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
("system", "あなたは優秀な AI アシスタントです。"),
("user", "{input}")
])

#combine these into a simple LLM chain

chain = prompt | llm
chain.invoke({"input": "以下の質問に答えてください。"})

#Let's add a simple output parser to convert the chat message to a string.


from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()


chain = prompt | llm | output_parser

print(chain.invoke({"input": "出雲大社に行く方法について教えて下さい"}))



--- response ---

出雲大社は、島根県出雲市にあります。出雲大社へ行くには、主に以下の交通手段があります。

1. 鉄道:
* JR山陰本線で出雲市駅まで来る。
* 出雲市駅から徒歩約15分で出雲大社前停留所に到着。そこからバスで5分程度で出雲大社の前に到着。
2. バス:
* 出雲市駅から出雲大社行きのバスが運行されています。
* バスは、出雲大社前で降りて徒歩0分で出雲大社に到着します。
3. タクシー:
* 出雲市駅や松江駅などからタクシーを利用することができます。所要時間は約20-30分で料金はおよそ4,000円です。

開放的で広い境内と、神話に登場する神々が祀られている出雲大社は日本有数のパワースポットとして知られています。多くの参拝客が訪れるため、交通手段を事前に調べて計画しておくことをお勧めします。


 返答に3分40秒かかりました。日本語LLM を利用すれば、日本語でプロンプトが書けますので、便利です。



このページの先頭に戻る