LangChain を始める

ラングチェーンとは

LangChain は、開発者が言語モデルを使用してエンドツーエンドのアプリケーションを構築できるように設計された強力なフレームワークです。これは、大規模言語モデル (LLM) とチャット モデルを活用したアプリケーションの作成プロセスを簡素化する一連のツール、コンポーネント、インターフェイスを提供します。LangChain は、言語モデルとの対話を簡単に管理し、複数のコンポーネントをリンクし、API やデータベースなどの追加リソースを統合できます。
公式ドキュメント: https://python.langchain.com/en/latest/
中国語ドキュメント: https://www.langchain.com.cn/

ラングチェーンの使い方は?

LangChain を使用するには、開発者はまず、LLM、チャット モデル、エージェント、チェーン、メモリ関数などの必要なコンポーネントとツールをインポートする必要があります。これらのコンポーネントを組み合わせて、ユーザー入力を理解、処理、応答するアプリケーションを作成します。

LangChain は、パーソナル アシスタント、ドキュメント Q&A、チャットボット、フォーム データのクエリ、API との対話、抽出、評価、要約など、特定のユースケース向けのさまざまなコンポーネントを提供します。

ラングチェーンのモデル

LangChain モデルは、フレームワークで使用されるさまざまなタイプのモデルを表す抽象化です。LangChain のモデルは主に 3 つのカテゴリに分類されます。
1. LLM (大規模言語モデル): これらのモデルはテキスト文字列を入力として受け取り、テキスト文字列を出力として返します。これらは、多くの言語モデル アプリケーションのバックボーンです。
2. チャット モデル: チャット モデルは言語モデルによってサポートされていますが、より構造化された API が使用されます。チャット メッセージのリストを入力として受け取り、チャット メッセージを返します。これにより、会話履歴の管理とコンテキストの維持が容易になります。
3. テキスト埋め込みモデル: これらのモデルはテキストを入力として受け取り、テキスト埋め込みを表す浮動小数点数のリストを返します。これらの埋め込みは、ドキュメントの検索、クラスタリング、類似性の比較などのタスクに使用できます。

LangChainの主な特徴

LangChain は、次の 6 つの主要領域で開発者をサポートすることを目的としています。
1. LLM とプロンプト: LangChain を使用すると、プロンプトの管理、最適化、およびすべての LLM に共通のインターフェイスの作成が容易になります。さらに、LLM を操作するための便利なユーティリティがいくつか含まれています。
2. チェーン: LLM またはその他のユーティリティへの一連の呼び出しです。LangChain はチェーンの標準インターフェイスを提供し、さまざまなツールと統合し、一般的なアプリケーションにエンドツーエンドのチェーンを提供します。データ拡張生成:
3.LangChain を使用すると、チェーンが外部データ ソースと対話して生成ステップのデータを収集できるようになります。たとえば、特定のデータ ソースを使用して長いテキストを要約したり、質問に答えたりするのに役立ちます。
4. エージェント: エージェントは、LLM にアクションに関する決定を下させ、それらのアクションを実行し、結果を確認し、ジョブが完了するまで続行します。LangChain は、プロキシ用の標準インターフェイス、選択できるさまざまなプロキシ、およびエンドツーエンドのプロキシの例を提供します。
5. メモリ: LangChain には、チェーン呼び出しまたはプロキシ呼び出し間の状態の維持に役立つ標準メモリ インターフェイスがあります。また、さまざまなメモリ実装と、メモリを使用するチェーンまたはエージェントの例も提供します。
6. 評価: 従来の指標を使用して生成モデルを評価することは困難です。そのため、LangChain は、開発者が LLM を使用してモデルを評価するのに役立つヒントとチェーンを提供します。

使用例

LangChain は、次のような多数のユースケースをサポートしています。

针对特定文档的问答:根据给定的文档回答问题,使用这些文档中的信息来创建答案。聊天机器人:构建可以利用 LLM 的功能生成文本的聊天机器人。Agents:开发可以决定行动、采取这些行动、观察结果并继续执行直到完成的代理。

クイック スタート ガイド: LangChain を使用してエンドツーエンドの言語モデル アプリケーションを構築する
[OPENAI_API_KEY は公式 Web サイトで生成できます (インターフェイスの呼び出しにはお金がかかり、安価です)]
インストール
まず、LangChain をインストールします。次のコマンドを実行するだけです。

pip install langchain

环境设置
现在,由于 LangChain 经常需要与模型提供者、数据存储、API 等集成,我们将设置我们的环境。在这个例子中,我们将使用 OpenAI 的 API,因此我们需要安装他们的 SDK:

pip install openai

接下来,让我们在终端中设置环境变量:

export OPENAI_API_KEY = "..."

或者,如果您更喜欢在 Jupyter notebook 或 Python 脚本中工作,您可以像这样设置环境变量:

import os 
os .environ[ "OPENAI_API_KEY" ] = "..."

言語モデル アプリケーションの構築: LLM

    # 导入LLM包装器。
    from langchain.llms import OpenAI
    # 初始化包装器,temperature越高结果越随机
    llm = OpenAI(temperature=0.9)
    # 进行调用
    text = "What would be a good company name for a company that makes colorful socks?"
    print(llm(text))
    #生成结果,结果是随机的 例如: Glee Socks. Rainbow Cozy SocksKaleidoscope Socks.

プロンプト テンプレート: LLM を管理するためのプロンプト

一般に、入力をモデルに直接入力するのではなく、入力を他の文と接続してプロンプトを形成し、それをモデルに与えます。
たとえば、製品名に基づいた前述のユースケースでは、実際のサービスに「靴下」のみを入力したい場合、「製造する会社に適した社名は何でしょう」がテンプレートになります。

    from langchain.prompts import PromptTemplate
    prompt = PromptTemplate(
        input_variables=["product"],
        template="What is a good name for a company that makes {product}?",
    )
    print(prompt.format(product="colorful socks"))
    # 输出结果 What is a good name for a company that makes colorful socks?

言語モデル アプリケーションの構築: チャット モデル

チャットモデルもご利用いただけます。これらは、内部で言語モデルを使用する言語モデルのバリアントですが、インターフェイスが異なります。チャット モデルは、「テキスト イン、テキスト アウト」API の代わりにチャット メッセージを入出力として使用します。チャット モデル API の使用は比較的新しいため、誰もが使用する最適な抽象化をまだ考え出しています。

チャットを完了するには、1 つ以上のメッセージをチャット モデルに渡す必要があります。LangChain は現在、AIMessage、HumanMessage、SystemMessage、ChatMessage タイプをサポートしています。主に HumanMessage、AIMessage、SystemMessage を操作します。

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

chat = ChatOpenAI(temperature=0)
chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
#输出结果 AIMessage(content="J'aime programmer.", additional_kwargs={})

メッセージのグループの補完を生成するには、generate を使用します。これにより、追加のメッセージ パラメーターを含む LLMResult が返されます。

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
batch_messages = [
    [
        SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
        HumanMessage(content="Translate this sentence from English to Chinese. I love programming.")
    ],
    [
        SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
        HumanMessage(content="Translate this sentence from English to Chinese. I love artificial intelligence.")
    ],
]
result = chat.generate(batch_messages)
print(result)

![ここに画像の説明を挿入](https://img-blog.csdnimg.cn/e26b838174094ed192111ecd4a360416.png)

result.llm_output['token_usage']

ここに画像の説明を挿入
チャット モデルの場合は、MessagePromptTemplate を使用してテンプレートを使用することもできます。1 つ以上の MessagePromptTemplate から ChatPromptTemplate を作成できます。ChatPromptTemplate の format_prompt メソッドは、書式設定された値を LLM またはチャット モデルへの入力として使用するかどうかに応じて、文字列または Message オブジェクトに変換できる PromptValue を返します。

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# get a chat completion from the formatted messages
chat(chat_prompt.format_prompt(input_language="English", output_language="Chinese", text="I love programming.").to_messages())
# -> AIMessage(content="我喜欢编程。(Wǒ xǐhuān biānchéng.)", additional_kwargs={})

チャット モデルで初期化されたチェーンとエージェントでメモリを使用する方法を調べます。Memory for LLM との主な違いは、以前のメッセージを文字列に圧縮するのではなく、独自の一意のメモリ オブジェクトとして保持できることです。

from langchain.prompts import (
    ChatPromptTemplate, 
    MessagesPlaceholder, 
    SystemMessagePromptTemplate, 
    HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])
llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
conversation.predict(input="Hi there!")
# -> 'Hello! How can I assist you today?'
conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
# -> "That sounds like fun! I'm happy to chat with you. Is there anything specific you'd like to talk about?"
conversation.predict(input="Tell me about yourself.")

ここに画像の説明を挿入

完全なコード

import os
os .environ[ "OPENAI_API_KEY" ] = ""
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
chat = ChatOpenAI(temperature=0)
batch_messages = [
    [
        SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
        HumanMessage(content="Translate this sentence from English to Chinese. I love programming.")
    ],
    [
        SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
        HumanMessage(content="Translate this sentence from English to Chinese. I love artificial intelligence.")
    ],
]
result = chat.generate(batch_messages)
print(result)
print(result.llm_output['token_usage'])
print("********************************************************************")
from langchain.chat_models import ChatOpenAI
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)
print(chain.run(input_language="English", output_language="Chinese", text="I love programming."))
print("********************************************************************")
from langchain.prompts import (
    ChatPromptTemplate, 
    MessagesPlaceholder, 
    SystemMessagePromptTemplate, 
    HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])
llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
conversation.predict(input="Hi there!")
# -> 'Hello! How can I assist you today?'
conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
# -> "That sounds like fun! I'm happy to chat with you. Is there anything specific you'd like to talk about?"
print(conversation.predict(input="Tell me about yourself."))

ここに画像の説明を挿入

print("aaaaaaaa")
print(sum(range(0,101)))
# # 导入LLM包装器。
from langchain.llms import OpenAI
# 初始化包装器,temperature越高结果越随机
import os
from langchain.prompts import PromptTemplate
import openai
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
#你申请的openai的api key
os .environ[ "OPENAI_API_KEY" ] = ""
llm = OpenAI(temperature=0.9)
# 进行调用
text = "What would be a good company name for a company that makes colorful socks?"
print(llm(text))

prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
print(prompt.format(product="colorful socks"))

llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
chain.run("colorful socks")
def completion(prompt):
    completions = openai.Completion.create(
    engine="text-davinci-003",
    prompt=prompt,
    max_tokens=1024,
    n=1,
    stop=None,
    temperature=0.8,
    )

    message = completions.choices[0].text
    return message

print(completion("中关村科金是一家怎样的公司?"))

ここに画像の説明を挿入
ここに画像の説明を挿入

情報抽出

入力内容に基づいて重要な情報を抽出

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAIChat
from langchain.chains import LLMChain
import os
import openai
# #你申请的openai的api key
os.environ['OPENAI_API_KEY'] = ''
text="北京市(Beijing),简称“京”,古称燕京、北平,是中华人民共和国首都、直辖市、国家中心城市、超大城市,国务院批复确定的中国政治中心、文化中心、国际交往中心、科技创新中心, \
    中国历史文化名城和古都之一。 截至2020年,北京市下辖16个区,总面积16410.54平方千米。  2022年末,北京市常住人口2184.3万人。 \
北京市地处中国北部、华北平原北部,东与天津市毗连,其余均与河北省相邻,中心位于东经116°20′、北纬39°56′,是世界著名古都和现代化国际城市, \
    也是中国共产党中央委员会、中华人民共和国中央人民政府和中华人民共和国全国人民代表大会常务委员会所在地。\
北京市地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运河、拒马河等,\
北京市的气候为暖温带半湿润半干旱季风气候,夏季高温多雨,冬季寒冷干燥,春、秋短促。北京被世界城市研究机构GaWC评为世界一线城市,  \
联合国报告指出北京市人类发展指数居中国城市第二位。 [4] 北京市成功举办夏奥会与冬奥会,成为全世界第一个“双奥之城”。 \
2022年,北京市实现地区生产总值41610.9亿元,按不变价格计算,比上年增长0.7%。其中,第一产业增加值111.5亿元,下降1.6%;第二产业增加值6605.1亿元,下降11.4%;第三产业增加值34894.3亿元,增长3.4%。"

 
#加载openai的llm
llm = OpenAIChat(model_name="gpt-3.5-turbo")
 
#创建模板
fact_extraction_prompt = PromptTemplate(
    input_variables=["text_input"],
    template="从下面的本文中提取关键事实。尽量使用文本中的统计数据来说明事实:\n\n {text_input}"
)
 
#定义chain
fact_extraction_chain = LLMChain(llm=llm, prompt=fact_extraction_prompt)
facts = fact_extraction_chain.run(text)
print(facts)

出力結果:
ここに画像の説明を挿入

文書Q&A



import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import TokenTextSplitter
from langchain.llms import OpenAI
from langchain.chains import ChatVectorDBChain
from langchain.document_loaders import DirectoryLoader
import jieba as jb
import openai
files=['xxx.txt','xxx.txt']
import time
start_time = time.time()  
for file in files:
    #读取data文件夹中的中文文档
    my_file=f"./data/{
      
      file}"
    with open(my_file,"r",encoding='utf-8') as f:  
        data = f.read()
    
    #对中文文档进行分词处理
    cut_data = " ".join([w for w in list(jb.cut(data))])
    #分词处理后的文档保存到data文件夹中的cut子文件夹中
    cut_file=f"./data/cut/cut_{
      
      file}"
    with open(cut_file, 'w') as f:   
        f.write(cut_data)
        f.close()
        

#加载文档
loader = DirectoryLoader('./data/cut',glob='**/*.txt')
docs = loader.load()
#文档切块
text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=0)
doc_texts = text_splitter.split_documents(docs)
#调用openai Embeddings
a=os.environ["OPENAI_API_KEY"] = ""
embeddings = OpenAIEmbeddings(openai_api_key=a)
#向量化
vectordb = Chroma.from_documents(doc_texts, embeddings, persist_directory="./data/cut")
vectordb.persist()
#创建聊天机器人对象chain
chain = ChatVectorDBChain.from_llm(OpenAI(temperature=0, model_name="gpt-3.5-turbo"), vectordb, return_source_documents=True)

def get_answer(question):
  chat_history = []
  result = chain({
    
    "question": question, "chat_history": chat_history})
  return result["answer"]
question = "xxxxxxxxxxx"
print(get_answer(question))
end_time = time.time()    # 程序结束时间
run_time = end_time - start_time    # 程序的运行时间,单位为秒
print(run_time)

質問と回答が文書内にある場合は正しい結果が返されますが、テキスト内にない場合はエラー メッセージが返されます
考えられる問題

UnicodeEncodeError: 'gbk' codec can't encode character '\u0643' in position 58: illegal multibyte sequence

vscode エディターの場合は、コンピューターの設定に問題がある可能性があります。解決策は、win+i > 時刻と言語 > 時刻と日付領域の形式設定 > その他の時刻と日付領域の形式設定 > 地域変更の日付、時刻、または番号です。形式 > 管理 > システム ロケールの変更
ここに画像の説明を挿入
ここに画像の説明を挿入
ベータ版のチェックを入れると、この問題を解決できます。これは txt テキスト用です (他の文書では試していません)。この問題は必ずしもコードの問題ではありません。このチェックを入れると、文字化けのある他のコンピュータ アプリケーションに影響を与える可能性があります。 (ほとんどのアプリケーションはそうではありません)

Q&Aを検索(更新予定)

発生する可能性のある問題:

ImportError: cannot import name 'load_tools' from 'langchain.agents'
我用的是python3.7,然后将python版本升级到了3.9就解决了。

おすすめ

転載: blog.csdn.net/lht0909/article/details/130412875