GPT-4の使用方法
この備忘録では、GPT-4の使用方法について簡単に説明します。GPT-4はOpenAIによって開発された大規模な言語モデルで、自然言語処理タスクにおいて高い性能を発揮します。ここでは、GPT-4の基本的な使い方と応用例を紹介します。
目次
- GPT-4の概要
- GPT-4を利用するための事前準備
- GPT-4の基本的な使用方法
- GPT-4の応用例
1. GPT-4の概要
GPT-4 (Generative Pre-trained Transformer 4)は、OpenAIが開発した大規模な言語モデルです。GPT-4は、多様なデータソースから学習し、自然言語処理タスクにおいて高い性能を発揮します。GPT-4は機械翻訳、質問応答、文章生成、要約、テキスト分類など、多くの応用が可能です。
2. GPT-4を利用するための事前準備
GPT-4を使用するには、以下の手順を踏みます。
- OpenAIのアカウントを作成する
- APIキーを取得する
- 必要なライブラリやツールをインストールする
詳細な手順や認証情報の取得方法は、OpenAIの公式ドキュメントを参照してください。
3. GPT-4の基本的な使用方法
GPT-4の使用方法は、PythonプログラムでAPIを利用することが一般的です。以下は、GPT-4 APIを利用して文章生成を行う簡単なコード例です。
import openai # APIキーを設定します openai.api_key = "your_api_key_here" # メッセージをリスト形式で入力します messages = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Who won the world series in 2020?"}, ] # APIリクエストを作成します response = openai.ChatCompletion.create( model="gpt-3.5-turbo", # GPT-3.5モデルを指定します messages=messages, max_tokens=50, # 応答の最大トークン数を指定します n=1, # 応答数を指定します stop=None, # 応答が終了するトークンを指定します(任意) temperature=0.5, # サンプリング温度を指定します(任意) ) # 応答を表示します print(response.choices[0].message["content"])
この例では、modelパラメータに"gpt-3.5-turbo"を指定してGPT-3.5モデルを使用しています。入力メッセージをリスト形式で渡し、APIリクエストを作成して応答を取得しています。
4. GPT-4の応用例
GPT-4は様々な応用が可能です
・質問応答システム
GPT-4は、ユーザーからの質問に対して適切な回答を生成することができます。質問応答システムの構築には、以下のようなプロンプトを使用します。
makefile
Q: パリの首都はどこですか? A: パリはフランスの首都です。 Q: <質問> A:
このプロンプトに続けて質問を記述することで、GPT-4は回答を生成します。
・機械翻訳
GPT-4は、ある言語から別の言語への翻訳タスクにも使用できます。以下のようなプロンプトを使用して、翻訳を行うことができます。
vbnet
Translate the following English text to Japanese: "<English text>"
・テキスト要約
GPT-4は、長いテキストを短く要約することができます。以下のようなプロンプトを使用して、要約を行うことができます。
scss
Summarize the following text in one sentence: "<Long text>"
・文章生成
GPT-4は、指定されたテーマやキーワードに基づいて文章を生成することができます。以下のようなプロンプトを使用して、記事や物語の生成を行うことができます。
css
Write a short story about a boy who discovers a magical world: "<Starting text>"
・テキスト分類
GPT-4は、テキストをカテゴリに分類するタスクにも利用できます。以下のようなプロンプトを使用して、分類を行うことができます。
sql
Classify the following text into one of the categories: Sports, Politics, Entertainment, or Science: "<Text to classify>"
Realm導入手順
端末単位作業
・CocoaPodsインストール
以下コードをターミナルで入力する
sudo gem install cocoapods
Macログイン時のパスワードを入力して実行
・CocoaPodsセットアップ
インストールが終了したら以下のコードを入力
pod setup
「Setup completed」と表示されれば成功
プロジェクト単位作業
・Podfile作成
プロジェクトファイルからターミナルを起動し以下コードを入力
pod init
・Podfile内容変更
作成されたPodfileを開く
・iosバージョンを最新の変更して先頭の「#」を削除する
・Realmのバージョンも確認(詳細は検索)
・インストール
プロジェクトファイルからターミナルを起動し以下コードを入力
pod install
「Pod installation complete!」と表示されれば成功
・Git準備
touch .gitignore
⌘(command) + ⇧(shift) + .(ドット記号)で隠しファイルを表示し.gitignoreファイルを開く 以下コードを入力
Pods/* taskapp.xcworkspace
.gitignoreファイルに書いた条件のファイルはGitの対象から排除される
Xcodeを再起動して完了
Xcode
設計
・懸念点
・初回起動時のログイン作業を避ける ・外観の整合性をとる ・操作の一環性 ・直接操作させる ・操作のフィードバック ・メタファを使用(UIを現実世界のものに例える) ・ユーザの望ましくない操作を回避
・AppleのiPhoneアプリ方針
・控えめであること ・明瞭であること ・奥行きを与えること
・MVCパターン
データ(Model)
なし ↓↑instance
処理(Controller)
IBOutlet↓↑IBAction
表示(View)
・アプリのライフサイクル
読み込み前 > loadView
読み込み後 > viewDidLoad ... 最初に一度だけ行いたい処理
(別画面から遷移)
表示前 > viewWillAppear
レイアウト前 > viewWillLayoutSubviews
レイアウト後 > viewDidLayoutSubviews
(画面表示開始)
表示後 > viewDidAppear
・・・
消える前 > viewWillDisappear
(画面表示終了)
消えた後 > viewDidDisappear
(別画面へ遷移)
Swift
segue
・戻ってきた時
@IBAction func ファンクション名(_ segue: UIStoryboardSegue) {
// 処理
}
・別クラスをインスタンス化
let 変数 = segue.destination as! 別クラス名
タイマー
・宣言
// タイマー var timer: Timer! // 時間 var timer_sec: Float = 0
・始動
インターバル秒毎にselecterで指定した以下の関数を実行する
self.timer = Timer.scheduledTimer(timeInterval: インターバル秒, target: self, selector: #selector(関数名(_:)), userInfo: nil, repeats: true)
@objc func updateTimer(_ timer: Timer) {
// ラベルに(インターバル秒毎に)経過時間を表示する
self.timer_sec += インターバル秒
self.ラベル名.text = String(format: "%.1f", self.timer_sec)
}
・タイマー停止
self.timer.invalidate()
日時フォーマット
// 取得 let formatter = DateFormatter() // 指定 formatter.dateFormat = "yyyy-MM-dd HH:mm" // 変換 let 変数:String = formatter.string(from: 変換するデータ)
通知
・AppDelegateに記述
import UserNotifications
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ユーザに通知の許可を求める
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
// Enable or disable features based on authorization
}
center.delegate = self // フォアグラウンド時に通知を受け取る場合は記述
return true
}
フォアグラウンド時に通知を受け取る場合は デリゲート「UNUserNotificationCenterDelegate」を追加して以下を記述
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.banner, .list, .sound])
}
.badge ... アプリアイコンに通知件数表示 .alert ... 通知バナー表示 .sound ... 通知音
・登録
以下はローカル通知を登録する処理
// 通知のインスタンス
let content = UNMutableNotificationContent()
content.title = task.title //タイトル
content.body = task.contents //詳細
content.sound = UNNotificationSound.default //通知
// ローカル通知が発動するtrigger(日付マッチ)を作成
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: task.date)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
// identifier, content, triggerからローカル通知を作成(identifierが同じだとローカル通知を上書き保存)
let request = UNNotificationRequest(identifier: String(task.id), content: content, trigger: trigger)
// ローカル通知を登録
let center = UNUserNotificationCenter.current()
center.add(request) { (error) in
print(error ?? "ローカル通知登録成功)
}
// 未通知のローカル通知一覧をログ出力
center.getPendingNotificationRequests { (requests: [UNNotificationRequest]) in
print("未通知のローカル通知一覧")
for request in requests {
print("/---------------")
print(request)
print("---------------/")
}
}
・削除
Realm
・宣言
クラス外
import RealmSwift
クラス内
let realm = try! Realm() var realmSample = try! Realm().objects(Sample.self).sorted(byKeyPath: "date", ascending: true)
・segue で画面遷移時
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
let inputViewController:InputViewController = segue.destination as! InputViewController
if segue.identifier == "cellSegue" {
let indexPath = self.tableView.indexPathForSelectedRow
inputViewController.task = taskArray[indexPath!.row]
} else {
let task = Task()
let allTasks = realm.objects(Task.self)
if allTasks.count != 0 {
task.id = allTasks.max(ofProperty: "id")! + 1
}
inputViewController.task = task
}
}
UITableVeiwデリゲート
// データの数(=セルの数)を返すメソッド
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return taskArray.count // ←修正する
}
// 各セルの内容を返すメソッド
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 再利用可能な cell を得る
let cell = tbl_sample.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
// Realmから情報を取得
let task:Task = realmSample[indexPath.row]
// Cellに値を設定
cell.textLabel?.text = task.title
cell.detailTextLabel?.text = task.date
return cell
}
// 各セルを選択した時に実行されるメソッド
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "cellSegue",sender: nil)
}
// セルが削除が可能なことを伝えるメソッド
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath)-> UITableViewCell.EditingStyle {
return .delete
}
// Delete ボタンが押された時に呼ばれるメソッド
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// データベースから削除
try! realm.write {
self.realm.delete(self.taskArray[indexPath.row])
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
}
Swift基礎
Swiftサンプルコード
基礎
### 宣言
let NUM = 1.08 //定数(let)
var num = 0 //変数(var)
### 型(Swiftの変数はnil(空や無)の値を代入できない)
var sapmle_1: Any = ["文字列", 1] //すべての型に対応可能
var Sample_2: String = "文字列" //文字「String」
var sample_3: Int = 1 //整数「Int」
var sample_4: Double = 1.1 //少数「Double」
var sample_5: Bool = true //論理「Bool」
### 配列
var sample_6: [Any] = ["りんご", "ばなな"] //配列 [型名]
sample_6.append("後ろに追加")
sample_6.insert("指定追加", at: 1)
sample_6.remove(at: 1) //指定削除
sample_6.removeFirst() //前を削除
sample_6.removeLast() //後ろを削除
sample_6.removeAll() //全て削除
### 辞書操作
var sample_7 = ["apple":"りんご", "banana":"ばなな"]
sample_7.removeValue(forKey: "apple")
### タプル
var sample_8:(String, Int) = ("drink", 200) //タプル
let (type, price) = sample_8
//print(name)
//print(price)
条件分岐
### if文
if NUM == 1.08 {
//処理
}
### 三項演算子
print((0 == 1) ? "正しい" : "間違い")
### switch文
switch NUM {
case 1.08:
print("")
case 1.10:
print("")
default:
print("")
}
### for文
for _ in 0...2 {
//処理
}
### while文
while num < 10 {
num += 1
}
汎用
関数
関数名(外部引数: 0) //呼び出し
func 関数名(外部引数 内部引数:Any) -> String {
//外部引数を「_(アンダーバー)」にすることで呼び出し時の引数名宣言省略可能
return "戻り値"
}
クラス
class Car {
var name: String
// イニシャ(エ)ライザ
init(name: String) {
//他のクラスからインスタンス化される時に呼ばれる処理
self.name = name
}
}
class MiniCar: Car {
//オーバーライド
override init(name: String) {
super.init(name: name + "(小型)")
}
}
var instance_1 = Car(name: "ブリウス")
print(instance_1.name)
var instance_2 = MiniCar(name: "ワゴンB")
print(instance_2.name)
JavaAPI
JavaのAPIは機能ごとにパッケージが定義されている。 今回は多用されるメソッドについて書き方と使い方をまとめた。
クラス一覧
String StringBuilder ArrayList HashSet HashMap Date FileReader FileWriter
java.langパッケージ
文字列を可変するStringBuilderクラス 数値を扱うIntegerクラス
String
以下のメソッドは取得した文字列を別の変数に入れる
大文字に変換
引数→なし 戻り値→大文字の文字列
String s = sample.toUpperCase();
小文字に変換
引数→なし 戻り値→小文字の文字列
String s = sample.toLowerCase();
1文字を取得
引数→数値 戻り値→文字列の引数番目の文字
Charcter c = sample.charAt(5);
指定個所を取得
引数→数値1、数値2 戻り値→文字列の引数1から引数2までの文字列
String s = sample.substring(3, 8);
文字の長さを取得
引数→なし 戻り値→文字列の長さ
Integer i = sample.length();
配列に分解
引数→"区切る文字" 戻り値→引数の文字で分解した配列
sample.split(" ");
StringBuilder
以下のメソッドはオブジェクトを変更する
ストレージの軽減
ストレージの軽減を試みる
sample.trimToSize();
文字列の追加
引数の文字列をリストに追加する
sample.append("text");
文字列の消去
引数の数値1から数値2までの文字列を消去する
sample.split(3, 8);
文字列の反転
既存の文字列を反転させる
sample.reverse(); # java.utilパッケージ ## ArrayList List<String> sample = new ArrayList<String>();
追加
リストに引数の内容を追加
sample.add("text");
削除
リストにある引数の内容を消去
sample.remove("text");
取得
引数→数値 戻り値→リストの数値番目の内容
String s = sample.get(2);
要素数の取得
リストの要素数を取得
sample.size();
HashSet
removeメソッド・・・削除 sizeメソッド・・・Setに含まれる要素の数を取得する containsメソッド・・・Setの中に含まれているかを確認する
追加
リストに引数の内容を追加(内容が重複した場合追加を無視)
sample.add(72);
削除
リストにある引数の内容を消去
scoreSet.remove(58);
存在確認
引数の内容がリストにあるか確認する scoreSet.contains(34);
要素数の取得
リストの要素数を取得
sample.size();
HashMap
「キー」一覧
sample.keySet();
「値」⼀覧
sample.values();
Date
時間を取り出す
インスタンス生成
Date date = new Date();
フォーマット指定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
取得
String strOut = sdf.format(date);
java.ioパッケージ
FileReader
try.catchする必要がある
pathの指定
String path = "C:\\study\\sample.txt";
インスタンス生成
FileReader fr = new FileReader(path);
一文字ずつ内容取得
int ch = fr.read();
while(ch != -1) {
System.out.print((char)ch);
ch = fr.read();
}
クローズ
fr.close();
FileWriter
pathの指定
String path = "C:\\folder\\file.txt";
インスタンス生成
FileWriter fw = new FileWriter(path);
pathの後に「, true」を書くことで追記方式にできる
ファイルに⽂字を書き込む
for (String 文字 : 書き込むリスト) {
fw.write(text + \n);
}
クローズ
fw.close();
JavaJSP
この記事ではServletの中で頻繁に使用されるクラスとメソッドについて自分が見やすいようにまとめた。
JSP
ファイルを挿入
<%@ include file="footer.jsp"%>
スコープ一覧
(HttpServletRequest)リクエスト ... request.setAttribute("key", sample);
(HttpSession)セッション ... session.setAttribute("key", sample);
(ServletContext)アプリケーション ... context.setAttribute("key", sample);
EL式
取得(脆弱性あり)
${key.id}
スコープ指定の取得
${requestScope.key}
${sessionScope.key}
${contextScope.key}
JSTL
タグリブ起動
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
出力
<c:out value="${name}"/>
if文
<c:if test="${条件}">
//TODO
</c:if>
foreach構文
<c:forEach var="sample" items="${samples}">
//TODO
</c:forEach>
choose構文
<c:choose>
<c:when key="${条件}">
//TODO
</c:when>
<c:when key="${条件}">
//TODO
</c:when>
<c:otherwise>
//TODO
</c:otherwise>
</c:choose>
JavaServlet
この記事ではServletの中で頻繁に使用されるクラスとメソッドについて自分が見やすいようにまとめた。
おまじない
servletおまじない
- クラスメソッドの上にコンテキストルート以下のリンクを設定する
- HttpServletを継承する
- dogetメソッドをオーバーライドする
@WebServlet("/url_sample")
public class sample extends HttpServlet {
@Override
protected void doGet(HttpServletRequest requset, HttpServletResponse response)
throws ServletException, IOException {
//TODO
}
}
htmlおまじない
aタグ
<a href="/servlet_sample/annotation?id=25">リンク</a>
クラス、メソッド
出力
PrintWriter out = resp.getWriter();
out.println("helloworld");
リスト
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
乱数
1から10までのランダムな数値を返す
Random random = new Random(); int sample = random.nextInt(10);
リクエスト(req)
パラメータの取得(req)
req.getParameter("key");
セッション(req)
宣言
HttpSession session = req.getSession();
get
Integer count = (Integer) session.getAttribute("count");
set
session.setAttribute("count", count);
フォワード(req)
RequestDispatcher rd = req.getRequestDispatcher("/hello");
rd.forward(request, response);
または
req.getRequestDispatcher("/hello").forward(request, response);
レスポンス(resp)
コンテントタイプの指定(resp)
resp.setContentType("text/plain; charset=UTF-8");
- text/plain
- text/html
- text/javascript
- image/jpeg
- image/png
- application/pdf
現在日時の取得(resp)
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String now = now.format(formatter);
ページのリロード(resp)
resp.setIntHeader("Refresh", 5);
リダイレクト(resp)
resp.sendRedirect("/servlet_sample/hello");