生成AI・ChatGPTでPythonプログラミングを動作させてみる
<動作環境>
Python: 3.11.5(3.10.4だとNGだった)
Visual Code Editor (on windows)
Azure OpenAI
<最初動作>
以下エラーとなったため、対応(参考情報:URL)
1. UnicodeDecodeError: 'cp932' codec can't decode byte 0x87 in position 5: illegal multibyte sequence
--> 文字コード対応
2.下記警告は出たが、処理自体は成功。
3.11.5\Lib\site-packages\langchain_init_.py:34: UserWarning: Importing llm_cache from langchain root module is no longer supported. Please use langchain.globals.set_llm_cache() / langchain.globals.get_llm_cache() instead.
<ソース修正内容>
1.Windows環境実行:文字コード対応
2.Azure OpenAI接続対応
3.OS環境変数利用はやめて、コード中に設定直接指定
<実施内容>
事前準備:関連ライブラリインストール
py -m pip install chromadb langchain openai unstructured tiktoken
→ 2024/5/18時点、上記だとエラーになった。以下ライブラリ構成に変更して動作成功。
pip install langchain==0.0.316 chromadb==0.4.15 openai==0.28.1 unstructured tiktoken
Chapter5-2: 大規模モデルを拡張するLangChain
1)長文を与えて質問に答えるプログラム: ソースURL
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# OpenAI
#from langchain.llms import OpenAI
# Azure
from langchain.chat_models import AzureChatOpenAI
from langchain.chains import RetrievalQA
# 直接APIキーを指定する場合、以下↓に指定する
# OpenAI
# os.environ["OPENAI_API_KEY"] = ""
# openai.api_key = ""
# openai.organization = ""
# Azure
#os.environ["OPENAI_API_TYPE"] = "azure"
#os.environ["OPENAI_API_KEY"] = ""
#os.environ["OPENAI_API_BASE"] = ""
#os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
import openai
OPENAI_API_TYPE = "azure"
OPENAI_API_KEY = ""
OPENAI_SERVICE_NAME = ""
OPENAI_MODEL_NAME = "gpt-35-turbo-16k"
OPENAI_MODEL_DEPLOYMENT = ""
OPENAI_API_VERSION = "2023-07-01-preview"
OPENAI_BASE_URL = f"https://{OPENAI_SERVICE_NAME}.openai.azure.com"
OPENAI_EMBEDDING_MODEL_NAME = "text-embedding-ada-002"
OPENAI_EMBEDDING_MODEL_DEPLOYMENT = ""
openai.api_type = OPENAI_API_TYPE
openai.api_key = OPENAI_API_KEY
openai.api_base= OPENAI_BASE_URL
openai.api_version = OPENAI_API_VERSION
# 質問内容を指定する --- (*1)
question1 = '紳士は何人登場しましたか?'
question2 = '紳士が連れていた犬について教えてください。'
# テキストを読み込む --- (*2)
# loader = TextLoader('./chumonno_oi_ryoriten_utf8.txt')
# Windows環境だとデフォルトCP932で読み込まれるようなので、明示的にutf-8(BOM無し)指定
loader = TextLoader('./chumonno_oi_ryoriten_utf8.txt',encoding="utf-8")
# テキストを分割 --- (*3)
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=250, # 文字数
chunk_overlap=0) # オーバーラップする文字数
docs = text_splitter.split_documents(documents)
# 分割したテキストをベクターストアに保存 --- (*4)
# OpenAI
#embeddings = OpenAIEmbeddings()
# Azure
embeddings = OpenAIEmbeddings(
openai_api_base= OPENAI_BASE_URL,
openai_api_type=OPENAI_API_TYPE,
deployment=,
openai_api_key=OPENAI_API_KEY,
chunk_size=1
)
#embeddings =OpenAIEmbeddings( model="text-embedding-ada-002", deployment="OPENAI_EMBEDDING_MODEL_DEPLOYMENT")
db = Chroma.from_documents(docs, embeddings)
retriever = db.as_retriever()
# ChatGPTに質問する準備 --- (*5)
# OpenAI
#llm = OpenAI(model_name="text-davinci-003", temperature=0, max_tokens=500)
# Azure
llm=AzureChatOpenAI(
temperature=0,
model_name=OPENAI_MODEL_NAME,
max_tokens=500,
deployment_name=OPENAI_MODEL_DEPLOYMENT,
model_kwargs={"api_type": OPENAI_API_TYPE, "api_version": OPENAI_API_VERSION},
openai_api_key=OPENAI_API_KEY,
openai_api_base=OPENAI_BASE_URL,
openai_api_version=OPENAI_API_VERSION
)
qa = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff",
retriever=retriever)
# 実際に質問する --- (*6)
print(question1)
print('答え:', qa.run(question1))
print('-------------')
print(question2)
print('答え:', qa.run(question2))
2)長文要約を行うプログラム: ソースURL
ChatGPTフリー版で実行、最初パフォーマンス関連警告メッセージがでるが成功した模様。初めエラーで実行できていないと思ったが。。
from langchain.docstore.document import Document
#from langchain import PromptTemplate
from langchain.prompts import PromptTemplate
# OpenAI
#from langchain.llms import OpenAI
# Azure
from langchain.chat_models import AzureChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.prompts import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
# 直接APIキーを指定する場合、以下↓に指定する
# OpenAI
# os.environ["OPENAI_API_KEY"] = ""
# openai.api_key = ""
# openai.organization = ""
# Azure
#os.environ["OPENAI_API_TYPE"] = "azure"
#os.environ["OPENAI_API_KEY"] = ""
#os.environ["OPENAI_API_BASE"] = ""
#os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
import openai
OPENAI_API_TYPE = "azure"
OPENAI_API_KEY = ""
OPENAI_SERVICE_NAME = ""
OPENAI_MODEL_NAME = "gpt-35-turbo-16k"
OPENAI_MODEL_DEPLOYMENT = ""
OPENAI_API_VERSION = "2023-07-01-preview"
OPENAI_BASE_URL = f"https://{OPENAI_SERVICE_NAME}.openai.azure.com"
OPENAI_EMBEDDING_MODEL_NAME = "text-embedding-ada-002"
OPENAI_EMBEDDING_MODEL_DEPLOYMENT = ""
openai.api_type = OPENAI_API_TYPE
openai.api_key = OPENAI_API_KEY
openai.api_base= OPENAI_BASE_URL
openai.api_version = OPENAI_API_VERSION
# 要約したいテキストファイル --- (*1)
target_text_file = './wikipedia_ai.txt'
# テキストファイルを読む --- (*2)
with open(target_text_file, 'rt', encoding='UTF-8') as f:
long_text = f.read()
# 大規模言語モデルを用意する --- (*3)
# OpenAI
#llm = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0)
# Azure
#llm=AzureChatOpenAI(
# temperature=0,
# model_name="gpt-35-turbo-16k",
# max_tokens=500,
# deployment_name="",
# model_kwargs={"api_type": "azure", "api_version": "2023-07-01-preview"},
#)
llm=AzureChatOpenAI(
temperature=0,
model_name=OPENAI_MODEL_NAME,
max_tokens=500,
deployment_name=OPENAI_MODEL_DEPLOYMENT,
model_kwargs={"api_type": OPENAI_API_TYPE, "api_version": OPENAI_API_VERSION},
openai_api_key=OPENAI_API_KEY,
openai_api_base=OPENAI_BASE_URL,
openai_api_version=OPENAI_API_VERSION
)
# 長文テキストを意味のあるまとまりで分割する --- (*4)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=600, # 分割サイズ
chunk_overlap=0) # オーバーラップする文字数
texts = text_splitter.split_text(long_text)
# ドキュメントに変換する --- (*5)
docs = [Document(page_content=t) for t in texts]
# 要約のためのプロンプトを用意(日本語で要約するように指示) --- (*6)
template = '''Write a concise summary of the following:
```
{text}
```
CONCISE SUMMARY IN JAPANESE:'''
prompt = PromptTemplate(template=template, input_variables=['text'])
# 要約を実行 --- (*7)
chain = load_summarize_chain(llm,
chain_type='map_reduce', # どのように要約を行うか
map_prompt=prompt, # テンプレートを適用
combine_prompt=prompt, verbose=False)
short_text_obj = chain(
{'input_documents': docs},
return_only_outputs=True)
# 結果を表示
print('[要約]', short_text_obj)
この記事が気に入ったらサポートをしてみませんか?