生成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)



この記事が気に入ったらサポートをしてみませんか?