🐧 要するにどういう話か
LLMは便利ではあるが、やってもらいたいことをちゃんとやってもらうためには、指示(プロンプト)に色々と工夫が必要だよ、という話である。ただ、最近のモデルはそこまで気を使う必要はなかったりするが、基本を知っておくことは今でも有効である(たまにハマるし)。
1. はじめに
この文書は、Prompt Engineering Guide などを参考にして作成した。プロンプトの確認にはQwen 3.6 35B A3Bを使用した。
プロンプトエンジニアリングとは何か
プロンプトエンジニアリングとは、AIモデル(特に大規模言語モデル:LLM)が望ましい回答を生成するようにプロンプトを設計・最適化する技術である。プロンプトを慎重に作成することで、コンテキスト、指示、例をモデルに提供し、モデルが意図を理解して有意義な方法で応答できるようにする。
これはAIにロードマップを提供し、あなたが念頭に置いている特定の出力にAIを導くためのものと考えてよい。明確な指示と適切なコンテキストがあれば、モデルはより正確で関連性の高い出力を生成できる。
プロンプトエンジニアリングの重要性
大規模言語モデルの台頭により、人間とコンピュータの交流に画期的な可能性がもたらされた。ただし、このような強力なAIモデルの可能性を最大限に引き出すには、プロンプトエンジニアリングという重要なスキルが必要になる。
効果的なプロンプトエンジニアリングには、以下のようなメリットがある。
- モデルパフォーマンスの向上:明確な指示とコンテキストにより、より正確で関連性の高い出力が得られる
- バイアスと有害な回答の低減:入力を慎重に制御し、AIの焦点を絞ることで、バイアスを軽減できる
- 制御と予測可能性の向上:AIの動作に影響を与え、意図した結果に沿った一貫性のある回答を得られる
- ユーザーエクスペリエンスの強化:明確で簡潔なプロンプトにより、AIモデルと効果的にやり取りできる
2. LLMの基礎知識
LLMとは
大規模言語モデル(Large Language Model:LLM)は、大量のテキストデータで学習したAIモデルであり、自然言語の理解と生成を得意とする。GPT、Claude、Geminiなどのモデルが知られている。
LLMは以下の特徴を持つ。
- 大規模なデータセットで学習しており、広範な知識を持つ
- 指示に従うようにチューニングされており、自然な言語で応答する
- 文脈に応じた応答を生成できる(文脈学習能力)
- 特定のタスクに特化していなくても、プロンプトによって多様なタスクを実行できる
プロンプトと出力の関係
プロンプトとは、特定の回答を引き出すためにモデルに与える入力のことである。簡単な質問やキーワードから、複雑な手順、コードスニペット(コードの断片)、さらにはクリエイティブな文章のサンプルまで、さまざまな形式を取る。
プロンプトの効果は、AIの出力の品質と関連性に直接影響する。明確で具体的なプロンプトは、より正確で関連性の高い出力を生む。一方、曖昧なプロンプトは、一般化した出力や、意図しない結果をもたらす可能性がある。
注意すること(幻覚、限界)
LLMには以下のような限界があるため、注意が必要である。
- 幻覚(ハルシネーション):事実と異なる情報を生成することがある。データが不十分な場合に推測して回答する傾向がある
- 静的な知識:学習データに含まれない最新の情報には対応できない
- 文脈の限界:非常に長いコンテキストを扱う場合、重要な情報が抜け落ちる可能性がある
- 正確性の限界:複雑な推論が必要なタスクでは、単一のプロンプトでは不十分なことがある
これらの限界に対処するためには、プロンプトエンジニアリングの手法を活用する必要がある。
3. プロンプトの要素
プロンプトは、以下の要素で構成される。
命令(Instruction)
モデルに実行してほしい具体的なタスクや指示。例えば「分類する」「要約する」「翻訳する」など。
コンテキスト(Context)
モデルがタスクを正しく理解するために必要な外部情報や追加の文脈。例や背景情報などが含まれる。
処理したい対象のデータや質問。モデルが応答すべき対象となる。
出力指示(Output Indicator)
出力のタイプやフォーマットを示す指示。例えば「感情:」のように、出力の形式を示すプレースホルダーが含まれる。
プロンプトの例
以下は、テキスト分類タスクを行う基本的なプロンプトの例である。
Classify the text into neutral, negative or positive.
Text: I think the vacation is okay.
Sentiment:
日本語訳
テキストを中性、否定的、または肯定的に分類してください。
テキスト:休暇は特に問題ないと思います。
感情:
※ちなみに、「I think the vacation is okay.」を「休暇は悪くないと思います。」と訳したら、Qwenに「肯定的」と判断されたので、上のようにした。“okay”は良くも悪くもない意味らしい。
このプロンプトでは、命令は「テキストを中性、否定的、または肯定的に分類する」、入力データは「I think the vacation is okay.」、出力指示は「Sentiment:」に相当する。
4. 基本プロンプティング手法
Zero-shotプロンプティング
Zero-shotプロンプティングとは、プロンプトに例や実演を含まずに、モデルに直接タスクを指示する方法である。
現代のLLMは指示の微調整や大規模な学習により、Zero-shotで多くのタスクを実行できる。
例:テキスト分類
Classify the text into neutral, negative or positive.
Text: I think the food was okay.
Sentiment:
日本語訳
テキストを中性、否定的、または肯定的に分類してください。
テキスト:休暇は特に問題ないと思います。
感情:
このプロンプトには例が含まれていないが、モデルは「sentiment(感情)」という概念を理解しており、中性と回答する。
Zero-shotで期待通りに動作しない場合は、Few-shotプロンプティングを検討する。
Few-shotプロンプティング
Few-shotプロンプティングでは、実際のプロンプトの前に、目的の入力と出力のペアの例を1つ以上提供する。これにより、モデルがタスクをより深く理解し、より正確な回答を生成できるようになる。
例:新しい単語の使い方の例示
A "whatpu" is a small, furry animal native to Tanzania. An example of a sentence that uses the word whatpu is:
We were traveling in Africa and we saw these very cute whatpus.
To do a "farduddle" means to jump up and down really fast. An example of a sentence that uses the word farduddle is:
日本語訳
「whatpu」とはタンザニア原産の小さな毛皮の動物です。whatpuという単語を使った文の例は以下の通りです:
アフリカを旅行している際、非常にかわいいwhatpuを見かけました。
「farduddle」とは非常に速く跳ね回ることを意味します。farduddleという単語を使った文の例は以下の通りです:
モデルは提供された例からパターンを学習し、適切な文を生成する。
Few-shotプロンプティングの効果的な利用には、以下のポイントがある。
- ラベル空間と入力テキストの分布が重要である
- フォーマットもパフォーマンスに重要な役割を果たす
- 無作為なラベルでも、ラベルなしよりも優れている
- ラベルの分布を真の分布から選択することも有用である
ただし、Few-shotプロンプティングには限界もある。複雑な推論タスクでは、例だけでは不十分なことがある。そのような場合は、Chain-of-Thoughtプロンプティングを検討する。
Chain-of-Thoughtプロンプティング
Chain-of-Thought(CoT)プロンプティングは、複雑な推論能力を可能にする中間推論ステップを提供する手法である。
基本的なCoT
基本的なCoTでは、例に推論ステップを含める。
例:奇数の合計
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
日本語訳
このグループの奇数の合計は偶数になりますか:4, 8, 9, 15, 12, 2, 1。
A:奇数をすべて足すと(9, 15, 1)25になります。答えはFalseです。
このグループの奇数の合計は偶数になりますか:17, 10, 19, 4, 8, 12, 24。
A:奇数をすべて足すと(17, 19)36になります。答えはTrueです。
このグループの奇数の合計は偶数になりますか:15, 32, 5, 13, 82, 7, 1。
A:
推論ステップを含めることで、モデルはより正確な回答を生成できる。
Zero-shot CoT
Zero-shot CoTでは、プロンプトに「Let’s think step by step.(ステップバイステップで考えよう)」という特別なフレーズを追加するだけでよい。
例:Zero-shot CoT
I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with?
Let's think step by step.
日本語訳
市場に行って10個のりんごを買いました。2個を隣人に渡し、2個を修理人に渡しました。その後、さらに5個買って1個食べました。りんごは何個残っていますか?
ステップバイステップで考えましょう。
この手法は、例が十分にない場合に特に有用である。
Qwenによる回答例:
ステップバイステップで計算してみましょう。
最初に買いました:10個
→ 残りは 10個
隣人に2個渡しました:
→ 10 - 2 = 8個
修理人に2個渡しました:
→ 8 - 2 = 6個
さらに5個買いました:
→ 6 + 5 = 11個
1個食べました:
→ 11 - 1 = 10個
答え:りんごは 10個 残っています。
なお、最近の高度なモデルはReasoning(推論)機能(Thinkingともいう)があるので、明示的なCoT指示が不要。実際、Qwenに上の質問だけを投げるとちゃんと答える。
りんごは10個残っています。
計算過程:
最初に10個購入 → 10個
2個渡す → 8個
さらに2個渡す → 6個
5個追加購入 → 11個
1個食べる → 10個
裏でこんなことを「考えて」いる。
Here's a thinking process:
1. Analyze User Input:
- Initial purchase: 10 apples
- Gave 2 to a neighbor
- Gave 2 to a repair person
- Bought 5 more apples
- Ate 1 apple
- Question: How many apples are left?
2. Track the Apple Count Step-by-Step:
- Start: 10
- After giving 2 to neighbor: 10 - 2 = 8
- After giving 2 to repair person: 8 - 2 = 6
- After buying 5 more: 6 + 5 = 11
- After eating 1: 11 - 1 = 10
- Final count: 10
3. Check for Traps/Wordplay:
- The phrasing is straightforward. No obvious tricks.
- "隣人" (neighbor) and "修理人" (repair person) are just recipients.
- Numbers: 10 - 2 - 2 + 5 - 1 = 10.
- All operations are clear.
4. Formulate Response:
- State the calculation clearly.
- Give the final answer: 10個.
- Keep it concise as per the question.
プロンプトチェーンニング(Prompt Chaining)
プロンプトチェーンニング(Prompt Chaining)とは、複雑なタスクをより小さなサブタスクに分割し、各サブタスクを順番に処理する手法である。
各プロンプトは1つのステージを処理し、その出力が次の指示にフィードされる。このアプローチは、レイテンシと引き換えに、より高い精度を実現する。
例:文書の質問応答
- 最初のプロンプト:文書から質問に関連する引用を抽出する
- 2番目のプロンプト:抽出した引用と元の文書に基づいて回答を生成する
プロンプトチェーンニングは、以下の場合に特に有用である。
- 複雑なリクエストをステップに分解する必要がある場合
- 反復的な改善が必要な場合
- 多段階の分析を行っている場合
- 中間検証が価値をもたらす場合
- 単一のプロンプトが一貫した結果を生まない場合
トレードオフとして、チェーンニングはレイテンシを増加させる(複数のAPI呼び出しが必要)が、複雑なタスクの精度と信頼性を大幅に改善できる。
5. プロンプト設計のテクニック
明確で具体的であること
現代のAIモデルは、明確で具体的な指示に非常に良く応答する。あなたが何を望んでいるかをモデルが推測できると想定するのではなく、直接明示すること。
例:分析ダッシュボードの作成
曖昧なプロンプト:「Create an analytics dashboard」(分析ダッシュボードを作成してください)
具体的なプロンプト:「Create an analytics dashboard. Include as many relevant features and interactions as possible. Go beyond the basics to create a fully-featured implementation.」)(分析ダッシュボードを作成してください。関連する機能とインタラクションをできるだけ多く含めてください。基本的な機能を超えて、完全な機能を実装してください。)
具体的な指示のポイント。
- 直接動詞で始める(英語の場合):「Write」「Analyze」「Generate」「Create」
- 前文を省略し、リクエストに直接入る
- 出力に含めるものを明示する
- 品質と深度の期待値を具体的に指定する
コンテキストと動機を提供する
何が重要なのか、なぜそれが重要なのかを説明することで、AIモデルが目標をよりよく理解し、よりターゲットを絞った応答を提供できるようになる。
例:フォーマットの好み
効果的でない例:「NEVER use bullet points」(箇条書きを絶対に使わないでください)
効果的な例:「I prefer responses in natural paragraph form rather than bullet points because I find flowing prose easier to read and more conversational. Bullet points feel too formal and list-like for my casual learning style.」(箇条書きよりも自然な段落形式の応答を好みます。流れるような文章の方が読みやすく、会話的で好きです。箇条書きは私のカジュアルな学習スタイルには厳しすぎてリストのように感じられます。)
コンテキストを提供すべき場面。
- 出力の目的や対象者を説明する場合
- 特定の制約が存在する理由を明確にする場合
- 出力がどのように使用されるかを記述する場合
- 解決しようとしている問題を記述する場合
例を活用する
例は常に必要というわけではないが、概念を説明したり特定のフォーマットを示したりする場合に特に効果的である。例を示すことで、説明だけでは表現しにくい微妙な要件を明確にできる。
例:記事の要約
Here's an example of the summary style I want:
Article: [link to article about AI regulation]
Summary: EU passes comprehensive AI Act targeting high-risk systems. Key provisions include transparency requirements and human oversight mandates. Takes effect 2026.
Now summarize this article in the same style: [link to your new article]
日本語訳
以下は私が求める要約スタイルの例です。
記事:[AI規制に関する記事へのリンク]
要約:EUはハイリスクシステムを対象とした包括的なAI法を可決した。主な規定には透明性要件と人間の監視義務が含まれる。2026年に発効。
同じスタイルで次の記事を要約してください:[新しい記事へのリンク]
例を使用すべき場面。
- 望むフォーマットが説明するより示すのが簡単である場合
- 特定のトーンやスタイルが必要な場合
- タスクが微妙なパターンや慣習を含む場合
- 単純な指示が一貫した結果を生まない場合
1つの例から始める(One-shot)。出力が必要と一致しない場合のみ、さらに例を追加する(Few-shot)。
不確実性を表現する許可を与える
AIに推測させるのではなく、不確実性を表現するための明示的な許可を与える。これにより、幻覚が減少し、信頼性が増す。
例:「Analyze this financial data and identify trends. If the data is insufficient to draw conclusions, say so rather than speculating.」(この財務データを分析して傾向を特定してください。結論を導くのにデータが不十分な場合は、推測するのではなく、そう伝えてください。)
この単純な追加により、モデルが制限を認識できるようにし、応答をより信頼できるものにする。
出力フォーマットを制御する
現代のAIモデルでは、応答のフォーマットを制御するためのいくつかの効果的な方法がある。
1. やるべきことを指示する(やらないことではなく)
「Do not use markdown in your response」(回答でMarkdownを使用しないでください)の代わりに、「Your response should be composed of smoothly flowing prose paragraphs」(回答は滑らかに流れのある段落で構成される必要があります。)と指示する。
※「この指示でほんとにMarkdown化を抑制できるの?」とQwenに聞いたら「無理だろう」と言われた。ここでの要点は、指示は基本的に肯定文で書けということ。下の3も参照。
2. プロンプトのスタイルを望む出力に合わせる
プロンプトで使用されるフォーマットスタイルは、AIの応答スタイルに影響を与える可能性がある。最小限のMarkdownを望む場合は、プロンプト内のMarkdownを減らす。
3. フォーマットの好みを明示する
詳細なフォーマット制御には、以下のように指示する。
When writing reports or analyses, write in clear, flowing prose using complete paragraphs. Use standard paragraph breaks for organization. Reserve markdown primarily for inline code, code blocks, and simple headings.
DO NOT use ordered lists or unordered lists unless you're presenting truly discrete items where a list format is the best option, or the user explicitly requests a list.
Instead of listing items with bullets, incorporate them naturally into sentences. Your goal is readable, flowing text that guides the reader naturally through ideas.
日本語訳
レポートや分析を作成する際は、完全な段落を使用して明確で流れるような文章で書いてください。整理のために標準的な段落区切りを使用してください。マークダウンはインラインコード、コードブロック、簡単な見出しに主に使用してください。
リスト形式が最も適切である明確に個別の項目を示す場合、またはユーザーが明示的にリストを要求した場合を除き、番号付きリストや箇条書きリストを使用しないでください。
箇条書きで項目を列挙するのではなく、自然に文に組み込んでください。目標は、読者を自然にアイデアへと導く読みやすい文章を書くことです。
事前入力(Prefill)
事前入力(Prefill)とは、AIの応答を事前に開始することで、フォーマット、トーン、または構造を制御する手法である。
事前入力を使用すべき場面
- JSON、XML、または他の構造化フォーマットを出力する必要がある場合
- 会話の前文を省略し、コンテンツに直接入りたい場合
- 特定の声やキャラクターを維持する必要がある場合
- AIの応答の開始を制御したい場合
例:JSON出力の強制
Extract key financial metrics from this quarterly report and present them in JSON format.
I need this data for automated processing, so it's critical that your response contains ONLY valid JSON with no preamble or explanation.
Use this structure:
{
"revenue": "value with units",
"profit_margin": "percentage",
"growth_rate": "percentage"
}
If any metric is not clearly stated in the report, use null rather than guessing.
Begin your response with an opening brace: {
日本語訳
この四半期レポートから主要な財務指標を抽出し、JSON形式で出力してください。
このデータを自動処理に使用する必要があるため、応答には前文や説明なしの有効なJSONのみを含めることが重要です。
以下の構造を使用してください:
{
"revenue": "value with units",
"profit_margin": "percentage",
"growth_rate": "percentage"
}
レポートに明確に記載されていない指標がある場合は、推測するのではなくnullを使用してください。
応答を中括弧で始めてください:{
6. 高度なプロンプトエンジニアリング
ReActプロンプティング
ReActプロンプティングは、LLMに推論トレースとタスク固有のアクションを交互に生成させるフレームワークである。
推論トレースを生成することで、モデルは行動計画を誘導・追跡・更新し、例外を処理できる。アクションステップにより、ナレッジベースや環境などの外部ソースとインタラクトして追加の情報を取得できる。
ReActの基本的な構造
- Thought:推論ステップ
- Action:実行するアクション
- Observation:環境からの応答
例:
Question: What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into?
Thought 1: I need to search Colorado orogeny, find the area that the eastern sector extends into, then find the elevation range.
Action 1: Search[Colorado orogeny]
Observation 1: The Colorado orogeny was an episode of mountain building in Colorado and surrounding areas.
Thought 2: It does not mention the eastern sector. So I need to look up eastern sector.
Action 2: Lookup[eastern sector]
Observation 2: The eastern sector extends into the High Plains and is called the Central Plains orogeny.
Thought 3: The eastern sector of Colorado orogeny extends into the High Plains. So I need to search High Plains and find its elevation range.
Action 3: Search[High Plains]
Observation 3: High Plains refers to one of two distinct land regions.
Thought 4: I need to instead search High Plains (United States).
Action 4: Search[High Plains (United States)]
Observation 4: The High Plains are a subregion of the Great Plains. From east to west, the High Plains rise in elevation from around 1,800 to 7,000 ft.
Thought 5: High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer is 1,800 to 7,000 ft.
Action 5: Finish[1,800 to 7,000 ft]
日本語訳
質問:コロラド造山帯の東部セクターが拡張する領域の標高範囲は何ですか?
思考1:コロラド造山帯を検索し、東部セクターが拡張する領域を見つけ、その後標高範囲を特定する必要がある。
アクション1:検索[コロラド造山帯]
観察1:コロラド造山帯はコロラドおよび周辺地域での山岳形成の段階でした。
思考2:東部セクターについて言及されていない。東部セクターを調べる必要がある。
アクション2:参照[東部セクター]
観察2:東部セクターはハイプレーンに拡張し、中央平原造山帯と呼ばれている。
思考3:コロラド造山帯の東部セクターはハイプレーンに拡張している。ハイプレーンを検索し、その標高範囲を特定する必要がある。
アクション3:検索[ハイプレーン]
観察3:ハイプレーンは2つの異なる陸域のうちの1つを指す
思考4:代わりにハイプレーン(アメリカ合衆国)を検索する必要がある。
アクション4:検索[ハイプレーン(アメリカ合衆国)]
観察4:ハイプレーンはグレートプレーンの一部地域である。東から西へ、標高は約1,800から7,000フィート上昇する。
思考5:ハイプレーンの標高は約1,800から7,000フィート上昇するので、答えは1,800から7,000フィート。
アクション5:完了[1,800から7,000フィート]
ReActは、内部知識と推論中に取得された外部情報の両方を使用できるため、複雑なタスクに有効である。
プロンプトの最適化
自己一貫性(Self-Consistency)
自己一貫性とは、Chain-of-Thoughtプロンプティングで使われている貪欲な推論(その場で最も確からしい選択だけを追い続ける推論)を置き換える手法である。複数の多様な推論パスをサンプリングし、最も一貫した回答を選択することで、演算や常識推論のタスクにおけるCoTプロンプティングのパフォーマンスを向上させる。
基本的な考え方
- 複数の推論パスを生成する
- それらの回答から多数派の回答を選択する
- 一貫性のある回答を最終回答とする
要するに、同じプロンプトで何度もやってみて、最も多い回答を正とする。
自己一貫性は、複雑な推論タスクにおいて、単一のCoT応答よりも信頼性の高い結果をもたらす。
反復と実験
プロンプトエンジニアリングは反復的なプロセスである。以下の戦略を活用する。
- 異なる言い回しやキーワードを試す
- 詳細さと具体性の度合いを調整する
- 異なるプロンプトの長さをテストする
- 各追加が実際に結果を改善するかテストする
プロンプトの最適化には、実験と反復が不可欠である。
RAG(検索拡張生成)
RAG(Retrieval Augmented Generation)は、情報検索コンポーネントとテキスト生成モデルを組み合わせる手法である。
LLMの自前の知識は静的であるため、複雑で知識集約的なタスクでは、外部の知識源にアクセスするシステムを構築することが有用である。RAGは以下の特徴を持つ。
- 入力に対して関連する文書を検索する
- 検索された文書をコンテキストとして元のプロンプトに追加する
- テキスト生成モデルに入力し、最終出力を生成する
RAGのメリット
- 事実の一貫性が向上する
- 生成された応答の信頼性が向上する
- 「幻覚」の問題を軽減できる
- 再学習なしで内部知識を変更できる
- 時間とともに進化できる事実に対応できる
RAGは、最新の情報を必要とするタスクや、専門的なナレッジベースに基づく応答が必要な場合に有効である。
7. トラブルシューティング
一般的な問題と解決策
プロンプトが予期せぬ結果を生む場合、以下の問題を解決する。
- 問題:応答が一般的すぎる → 解決策:具体性を追加し、例を追加するか、包括的な出力を明示的に要求する
- 問題:応答が主題から外れている → 解決策:実際の目標をより明示的にする。なぜ尋ねているのかについてコンテキストを提供する
- 問題:応答のフォーマットが一貫していない → 解決策:例(Few-shot)を追加するか、事前入力を使用して応答の開始を制御する
- 問題:タスクが複雑すぎて、結果が信頼できない → 解決策:複数のプロンプトに分割する。各プロンプトは1つのことを適切に行う
- 問題:AIが不要な前文を含む → 解決策:事前入力を使用するか、「前文を省略し、回答に直接入る」と明示的に要求する
- 問題:AIが情報を捏造する → 解決策:不確実な場合に「わからない」と言う許可を明示的に与える
- 問題:AIが変更を提案するが、実装を望んでいた → 解決策:アクションを明示的にする。「変更を提案してください」ではなく「この関数を変更してください」と指示する
避けるべきミス
以下の一般的な落とし穴を避けることで、時間を節約し、プロンプトを改善できる。
- 過剰なエンジニアリング:長く複雑なプロンプトが常に良いわけではない
- 基本を無視する:高度なテクニックは、コアプロンプトが不明確または曖昧な場合は役立たない
- AIが心を読めると仮定する:何を望んでいるかを具体的にすること。曖昧さを残すと、AIが誤解する余地を与える
- すべてのテクニックを同時に使用しない:特定の課題に対処するテクニックを選択する
- 反復を忘れない:最初のプロンプトが完璧に機能することはめったにない。テストし、改善する
- 古びたテクニックに依存しない:XMLタグや過度なロールプロンプティングは、現代のモデルでは不要である
📚 参考文献
|