Автор: Кевин
Картинка стоит тысячи слов,LangChain
стал актуальным LLM Эта статья является фактическим стандартом для платформ приложений. LangChain Подведем итог основным понятиям и конкретным сценариям их использования.
LangChain
даодинна основебольшой язык Модельизразработка приложенийрамка,В основном оно регулируется двумя способами.и Упрощенное использованиеLLM
из Способ:
LLM
середина;LLM
посредством принятия решений и конкретныхизвзаимодействие с окружающей средой,И поLLM
Помогите определиться с дальнейшими действиямииздействовать。К преимуществам LangChain относятся:
Chains
изв то же время, поддерживает самонаследование BaseChain и реализовать соответствующую логику такжеразличные этапыизcallback handler
ждать;Langchain
Команда работает очень быстро,Быстро используйте новейшие возможности языка модели,В команде также есть langsmith, auto-evaluator и другие отличные проекты, а сообщество открытого исходного кода также пользуется значительной поддержкой.этотдаодин кусочекLangChain
изкомпонентыи架构图(langchain python
иlangchain JS/TS
из Архитектура в принципе та же самая,本文середина以langchain python
завершить соответствующее введение),В принципе полностью описаноLangChain
изкомпонентыиабстрактныйслой(callback
Нетсуществоватьэтот张图середина,существования мы представим его отдельно ниже),а Также между ними существует корреляция.
Во-первых, давайте начнем с самой базовой части. Модель ввода-вывода относится к процессу прямого взаимодействия с LLM.
В процессе ввода-вывода модели есть три основных абстрактных компонента LangChain:
Давайте представим это ниже
⚠️ Примечание:Нижеследующее включает в себяииз Все примеры кодавOPENAI_API_KEY
иOPENAI_BASE_URL
Необходимо настроить заранее,OPENAI_API_KEY
обратитесь кПрокси-сервис OpenAI/OpenAIизAPI Key
,OPENAI_BASE_URL
обратитесь к OpenAI агентское обслуживаниеизBase Url
。
Language Model
да真толькои LLM / ChatModel Интерактивная составляющая, к которой можно относиться напрямую как к обычной openai client использовать,существоватьLangChain
середина,主要использоватьприезжатьиздаLLM
,Chat Model
иEmbedding
三类 Language Model。
LLM: большинство Базаизпроходить“text in ➡️ text out”模式использоватьиз Language Модель же LangChain Он также содержит большое количествоизLLM третьей стороны。
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-ada-001", openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_BASE_URL)
llm("What day comes after Friday?")
# '\n\nSaturday.'
Chat Model: LLM
из Варианты,абстрактный ПонятноChat
этот一场景Внизизшаблон использования,Зависит от“text in ➡️ text out”变成Понятно“chat messages in ➡️ chat message out”,chat message
даобратитесь к**text + message type(System, Human, AI)**。
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
chat = ChatOpenAI(model_name="gpt-4-0613", temperature=1, openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_BASE_URL)
chat(
[
SystemMessage(content="You are an expert on large language models and can answer any questions related to large language models."),
HumanMessage(content="What’s the difference between Generic Language Models, Instruction Tuned Models and Dialog Tuned Models")
]
)
# AIMessage(content='Generic Language Models, Instruction-Tuned Models, and Dialog-Tuned Models are all various types of language models that have been trained according to different datasets and methodologies. They are used in different contexts according to their specific strengths. \n\n1. **Generic Language Models**: These models are trained on a broad range of internet text. They are typically not tuned to specific tasks and thus can be used across a wide variety of applications. GPT-3, used by OpenAI, is an example of a general language model.\n\n2. **Instruction-Tuned Models**: These are language models that are fine-tuned specifically to follow instructions given in a prompt. They are trained using a procedure called Reinforcement Learning from Human Feedback (RLHF), following an initial supervised fine-tuning which consists of human AI trainers providing conversations where they play both the user and an AI assistant. This model often includes comparison data - two or more model responses are ranked by quality.\n\n3. **Dialog-Tuned Models**: Like Instruction-Tuned Models, these models are also trained with reinforcement learning from human feedback, and especially shine in multi-turn conversations. However, these are specifically designed for dialog scenarios, resulting in an ability to maintain more coherent and context-aware conversations. \n\nIn essence, the difference among the three revolves around the breadth of their training and their specific use-cases. Generic Language Models are broad but may lack specificity; Instruction-Tuned Models are better at following specific instructions given in prompts; and Dialog-Tuned Models excel in carrying out more coherent and elongated dialogues.', additional_kwargs={}, example=False)
С другой стороны, Лангчейн Он также содержит большое количествоизМодель стороннего чата
Chat Model
Пример использования:Embedding: Embedding
Воляодиночный персонажвекторизациядляодин定长извектор,Имея представленную извекторизацию текста, мы можем сделать что-то вроде семантического поиска.,Выбор кластера и т. д. для выделения необходимых фрагментов текста.,нравиться Внизда Воляодин embed Пример произвольной строки:
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_BASE_URL)
text_embedding = embeddings.embed_query("To embed text(it can have any length)")
print (f"Your embedding's length: {len(text_embedding)}")
print (f"Here's a sample: {text_embedding[:5]}...")
'''
Your embedding's length: 1536
Here's a sample: [-0.03194352, 0.009228715, 0.00807182, 0.0077545005, 0.008256923]...
'''
Promptобратитесь к用户из一系列обратитесь к令ивходить,да РешатьLanguage Model
Выходной контентиз唯一входить,В основном используется для помогает понять контекст модели и генерировать релевантные и связные результаты, нравиться, отвечает на вопросы и улучшает предложения. итогвопрос。существоватьLangChain
в相关компоненты主要有Prompt Template
иExample selectors
,а такжепозже会提приезжатьиз Вспомогательный/ПополнитьPromptиз Некоторый其它компоненты。
Prompt Template: предопределенныйиз一系列обратитесь к令ивходить参数изprompt
трафарет,Поддержка более гибкого ввода,нравитьсяподдерживать**output инструкция (инструкция формата вывода), partial ввод (заранее укажите некоторые входные параметры), examples(входитьвыход Пример)**ждать;LangChain
поставлять Понятно大量метод来创建Prompt Template
,有Понятноэтот一слойкомпоненты就Можетсуществовать Нет同Language Model
и Нет同Chain
Вниз大量复用Prompt Template
Понятно,Prompt Template
серединатакже会有Вниз面Воля提приезжатьизExample selectors, Output Parser
изучаствовать。
Примеры селекторов: существуют во многих сценариях,простойизinstruction + inputизprompt
Нет足以让LLM
Выполнено качественноизаргументированный ответ,этот时候я们就还нуждатьсядляprompt
Пополнить Некоторый针对具体вопросиз Пример,LangChain Воляэтот一Функцияабстрактныйдля ПонятноExample selectors
этот一компоненты,мы можем на на основе ключевого слова, сходство (в целомиспользоватьMMR/cosine similarity/ngramвычислить сходство, существоватьпозжеизвекторданные Библиотека章节середина会提приезжать)。для Понятно让большинство终изprompt
Нет超过Language Model
из token верхний предел (для каждой модели token 上限见Вниз表),LangChain
还поставлять ПонятноLengthBasedExampleSelector
,ограничено длиной example количества, для более длинных входных данных он выбирает сигналы, которые содержат меньше примеров, а для более коротких входных данных он выбирает сигналы, которые содержат больше примеров.
в целоммы надеемсяLanguage Model
извыходдазафиксированныйиз Формат,чтобы мы могли проанализировать его выходные данные в структурированные данные,LangChain
Воляэтот一诉求所需из Функцияабстрактный成ПонятноOutput Parser
этот一компоненты,ипоставлять Понятно一系列изпредопределенныйOutput Parser
,нравитьсябольшинство Обычно используетсяStructured output parser, List parser,а такжесуществоватьLLM
выход无法解析时发挥作用изAuto-fixing parser и Retry parser。
Output Parser
нуждатьсяиPrompt Template, Chainкомбинацияиспользовать:
Prompt Template
серединапроходитьобратитесь к定partial_variables
дляOutput Parser
из format,Вот и всесуществоватьprompt
середина Пополнить让Модельвыход所需Формат内容изобратитесь к令;Chain
серединаобратитесь к定Output Parser
,ииспользоватьChain
изpredict_and_parse / apply_and_parse
начало методаChain
,Вы можете напрямую вывести проанализированные изданные.нижедаодин完整изкомбинацияPrompt Template, Output Parser и Chainиз Конкретный пример:
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0.5, model_name="gpt-3.5-turbo-16k-0613", openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_BASE_URL)
template = """
## Input
{text}
## Instruction
Please summarize the piece of text in the input part above.
Respond in a manner that a 5 year old would understand.
{format_instructions}
YOUR RESPONSE:
"""
# Создать вывод Парсер, содержит два поля вывода и указывает тип и описание.
output_parser = StructuredOutputParser.from_response_schemas(
[
ResponseSchema(name="keywords", type="list", description="keywords of the text"),
ResponseSchema(name="summary", type="string", description="summary of the text"),
]
)
# CreatePrompt Шаблон и Volyaformat_instructions указываются непосредственно как Выходные данные через частичные_переменные. Парсерformat
prompt = PromptTemplate(
input_variables=["text"],
template=template,
partial_variables={"format_instructions": output_parser.get_format_instructions()},
)
# Создать цепочку и связать подсказку TemplateиOutput Парсер (он Воля автоматически использует Output Парсер анализирует вывод llm)
summarize_chain = LLMChain(llm=llm, verbose=True, prompt=prompt, output_parser=output_parser)
to_summarize_text = 'Abstract. Text-to-SQL aims at generating SQL queries for the given natural language questions and thus helping users to query databases. Prompt learning with large language models (LLMs) has emerged as a recent approach, which designs prompts to lead LLMs to understand the input question and generate the corresponding SQL. However, it faces challenges with strict SQL syntax requirements. Existing work prompts the LLMs with a list of demonstration examples (i.e. question-SQL pairs) to generate SQL, but the fixed prompts can hardly handle the scenario where the semantic gap between the retrieved demonstration and the input question is large.'
output = summarize_chain.predict(text=to_summarize_text)
import json
print (json.dumps(output, indent=4))
Вывод следующий:
{
"keywords": [
"Text-to-SQL",
"SQL queries",
"natural language questions",
"databases",
"prompt learning",
"large language models",
"LLMs",
"SQL syntax requirements",
"demonstration examples",
"semantic gap"
],
"summary": "Text-to-SQL is a method that helps users generate SQL queries for their questions about databases. One approach is to use large language models to understand the question and generate the SQL. However, this approach faces challenges with strict SQL syntax rules. Existing methods use examples to teach the language models, but they struggle when the examples are very different from the question."
}
тольконравитьсяясуществовать Начало статьиизЧто такое Лангчейн?一节середина提приезжатьиз,интегрированный Внешние данные для языковой модели Да LangChain обеспечивает одну из основных компетенций,такжеда На рынке много отличныхизбольшой язык Модель Заявка успешно принятаиз Один из основных(Github Copilot Chat,Помощник в веб-чате,Подвести итог Ассистент диссертации,видео на youtube Подвести итог помощник…),существоватьLangChain
середина,Data connection
этот一слой主要包含ниже四个абстрактныйкомпоненты:
Давайте представим это ниже
чтобы завершить LLM из上Вниз文信息,Дайте ему достаточно подсказок,Нам нужно получать все виды данных из всех источников данных.,этоттакже就даLangChain
абстрактныйизDocument loaders
этот一компонентыиз Функция。
использоватьDocument loaders
Может Воляисточниквданные加载дляDocument
。Document
Зависит от一段文本и Связанные элементыданныекомпозиция。примернравиться,Простота загрузки.txt Файл, используемый для загрузки относительно структурированного markdown Файл, используемый для загрузки любого текстового содержимого веб-страницы, даже для загрузки синтаксического анализа. YouTube Видеоскрипт.
в то же время LangChain 还收录Понятно海量изСторонние загрузчики документов,нижедаодиниспользоватьNotionDBLoader
загрузитьnotion database
вpage
дляDocument
из Пример:
from langchain.document_loaders import NotionDBLoader
from getpass import getpass
# getpass() предлагает пользователю ввести ключ
NOTION_TOKEN = getpass()
DATABASE_ID = getpass()
loader = NotionDBLoader(
integration_token=NOTION_TOKEN,
database_id=DATABASE_ID,
request_timeout_sec=30, # optional, defaults to 10
)
# Подробности запроса см. https://developers.notion.com/reference/post-database-query
docs = loader.load()
docs[0].page_content[:100]
После загрузки документов в память мы обычно также хотим максимально структурировать/блокировать их для более гибких операций.
Самый простой пример: нам часто приходится разбивать длинный документ на более мелкие части, чтобы они поместились в контекстное окно модели LangChain; Есть много встроенныхизDocument transformers(Большинство из нихдаText Spliter
),Может легко разделять, объединять, фильтровать и иным образом манипулировать документами.,Некоторый Обычно используетсяDocument transformersнравиться Вниз:
в то же время LangChain также收录Понятно很多Сторонние преобразователи документов(нравитьсяна основе Распространен среди рептилий из beautiful soup, на основе OpenAI бить metadata tag и т. д.).
Мы упомянули селекторы примеров в предыдущем разделе «Подсказки», так как же нам найти подходящие примеры? Часто ответом является база данных векторов.
Один из наиболее распространенных способов хранения и поиска неструктурированных данныхизда Воля векторизация (встраивание) и сохранение полученного в результате вектора встраивания.,Затемсуществовать При запросевекторизация Неструктурированный поиск и внедрение запросовиз查询большинство相似извектор。Vector storesОтветственный за хранениевекторизацияданныеипоставлятьвектор搜索из Функция,общийизвекторданные Библиотека включает в себя FAISS, Milvus, Pinecone, Weaviate, Chroma и т. д., чаще всего в повседневном использовании используется FAISS。
в то же время LangChain также收录Понятно很多Сторонние векторные магазины,Обеспечивает более мощный векторный поиск и другие функции.
Retrieversда LangChain поставлятьиз ВоляDocument
иLanguage Model
объединитьизкомпоненты。
LangChain Существует много разных типов Ретриверы, но наиболее широко используются VectoreStoreRetriever, мы можем напрямую использовать его как библиотеку данных векторов соединений. Language Model средний слой и VectoreStoreRetriever изиспользоватьтакже很简单,прямойretriever = db.as_retriever()
Вот и все。
Конечно, у нас есть много других Retrievers нравиться Web search Retrievers Подожди, Лангчейн также收录Понятно很多Сторонние ретриверы
Ниже приведен пример приложения контроля качества с использованием базы данных векторов + VectoreStoreRetriever + цепочки контроля качества:
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Инициализировать LLM
llm = ChatOpenAI(temperature=0.5, model_name="gpt-3.5-turbo-16k-0613", openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_PROXY_URL)
# Загрузить документ
loader = TextLoader('path/to/related/document')
doc = loader.load()
print (f"You have {len(doc)} document")
print (f"You have {len(doc[0].page_content)} characters in that document")
# разделить строку
text_splitter = RecursiveCharacterTextSplitter(chunk_size=3000, chunk_overlap=400)
docs = text_splitter.split_documents(doc)
num_total_characters = sum([len(x.page_content) for x in docs])
print (f"Now you have {len(docs)} documents that have an average of {num_total_characters / len(docs):,.0f} characters (smaller pieces)")
# инициализациявекторизация Модель
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_PROXY_URL)
# векторизацию документа и сохранение его в библиотеке векторных данных (вектор привязки соответствует данным элемента документа). Здесь мы выбираем локальный самый обычно. используетсяFAISSданные Библиотека
# Уведомление: При этом генерируется запрос к OpenAI и взимается комиссия.
doc_search = FAISS.from_documents(docs, embeddings)
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=doc_search.as_retriever(), verbose=True)
query = "Specific questions to be asked"
qa.run(query)
После выполнения verbose выход日志нравиться Вниз:
You have 1 document You have 74663 characters in that document Now you have 29 documents that have an average of 2,930 characters (smaller pieces) > Entering new chain... Prompt after formatting: System: Use the following pieces of context to answer the users question. If you don't know the answer, just say that you don't know, don't try to make up an answer. --------------- Human: What does the author describe as good work? The author describes working on things that aren't prestigious as a sign of good work. They believe that working on unprestigious types of work can lead to the discovery of something real and that it indicates having the right kind of motives. The author also mentions that working on things that last, such as paintings, is considered good work.
Следующий главный герой LangChain — Цепочки — это важные компоненты, абстрагированные в LangChain для соединения нескольких взаимодействий с языковой моделью. Он может объединять несколько компонентов для создания единой связной задачи. Вы также можете вкладывать несколько цепочек вместе или объединять их. с другими компонентами для создания более сложных цепочек.
За исключением одиноких Chain Кроме того, несколько часто используемых Chains нравиться Вниз:
В некоторых сценариях нам необходимо / Контекст определяет, какой из них использовать Цепь, хоть какая Prompt,Router Chain 就поставлять Понятно诸нравитьсяMultiPromptChain, LLMRouterChainждать一系列用于决策из Цепочка (это связано с тем, о чем мы упомянем позже) Agent Есть подобные места).
Цепочка маршрутизатора состоит из двух частей:
Как следует из названия, это последовательная цепочка, выполняемая последовательно. Простейшая из них, SimpleSequentialChain, очень проста и груба. Каждая подцепочка SimpleSequentialChain имеет один вход/выход, и выход одного шага является входом следующего. шаг.
SequentialChain более высокого порядка допускает несколько входов и выходов, и мы можем улучшить производительность его рассуждений, добавив память и т. д., о чем будет упомянуто позже.
Map-reduce Chain В основном используется для summary сценарий,для этих очень длинных документов сначала мы используем ранее упомянутый TextSpliter Разделяйте документы на более мелкие по определенным правилам. Чанки (обычно используются RecursiveCharacterTextSplitter,нравитьсяфрукты Document структурирован, рассмотрите возможность использования указанного TextSpliter), затем выполните «цепочку карт» для каждой разделенной части, соберите выходные данные всей «цепочки карт», а затем выполните «цепочку сокращений», чтобы получить окончательный результат. summary выход.
Вот один Router Chain вMultiPromptChainиз具体Пример:
from langchain.chains.router import MultiPromptChain
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
# Определите запросы для маршрутизации
physics_template = """You are a very smart physics professor. \
You are great at answering questions about physics in a concise and easy to understand manner. \
When you don't know the answer to a question you admit that you don't know.
Here is a question:
{input}"""
math_template = """You are a very good mathematician. You are great at answering math questions. \
You are so good because you are able to break down hard problems into their component parts, \
answer the component parts, and then put them together to answer the broader question.
Here is a question:
{input}"""
# Организуйте подсказки, связанные с информацией
prompt_infos = [
{
"name": "physics",
"description": "Good for answering questions about physics",
"prompt_template": physics_template,
},
{
"name": "math",
"description": "Good for answering math questions",
"prompt_template": math_template,
},
]
llm = OpenAI(temperature=0.5, openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_PROXY_URL+"/v1")
destination_chains = {}
for p_info in prompt_infos:
# Создайте для Базы цепочку назначения с каждым приглашением (включите многословие)
name = p_info["name"]
prompt_template = p_info["prompt_template"]
prompt = PromptTemplate(template=prompt_template, input_variables=["input"])
chain = LLMChain(llm=llm, prompt=prompt)
destination_chains[name] = chain
# Создайте цепочку по умолчанию. Если ни одна другая цепочка не соответствует условиям маршрутизации, будет использоваться эта цепочка.
default_chain = ConversationChain(llm=llm, output_key="text")
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)
# Создайте router_prompt на основе отношения отображения Prompt_infos.
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str)
router_prompt = PromptTemplate(
template=router_template,
input_variables=["input"],
output_parser=RouterOutputParser(),
)
# Создайте router_chain (включите подробный)
router_chain = LLMRouterChain(llm_chain=LLMChain(llm=llm, prompt=router_prompt, verbose=True), verbose=True)
# Воляrouter_chainиdestination_chainsа такжеdefault_chain объединяется в MultiPromptChain (включить подробную информацию)
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=destination_chains,
default_chain=default_chain,
verbose=True,
)
# run
chain.run("What is black body radiation?")
После выполнения verbose выход日志нравиться Вниз:
Entering new chain...Prompt after formatting: Given a raw text input to a language model select the model prompt best suited for the input. You will be given the names of the available prompts and a description of what the prompt is best suited for. You may also revise the original input if you think that revising it will ultimately lead to a better response from the language model.
<< FORMATTING >> Return a markdown code snippet with a JSON object formatted to look like:
{
"destination": string \ name of the prompt to use or "DEFAULT"
"next_inputs": string \ a potentially modified version of the original input
}
REMEMBER: "destination" MUST be one of the candidate prompt names specified below OR it can be "DEFAULT" if the input is not well suited for any of the candidate prompts. REMEMBER: "next_inputs" can just be the original input if you don't think any modifications are needed.
<< CANDIDATE PROMPTS >> physics: Good for answering questions about physics math: Good for answering math questions
<< INPUT >> What is black body radiation?
<< OUTPUT >>
Finished chain.
physics: {'input': 'What is black body radiation?'}
> Entering new chain...
Prompt after formatting:
You are a very smart physics professor. You are great at answering questions about physics in a concise and easy to understand manner. When you don't know the answer to a question you admit that you don't know.
Here is a question: What is black body radiation?
> Finished chain.
Memory
Может帮助Language Model
Пополнить历史信息из上Вниз文,LangChain
вMemory
даодин有点模糊изтермин,Это может быть так же просто, как вспомнить сообщения, с которыми вы общались в прошлом.,Вы также можете объединить его с библиотекой векторных данных для более сложного поиска исторической информации.,Даже поддерживать связанные сущности, их отношения и конкретную информацию.,Это зависит от конкретного приложения.
Обычно Память используется для более длинных цепочек, что может в определенной степени улучшить производительность рассуждений модели.
Обычно используется Memory типнравиться Вниз:
buffer memory
иsummary memory
из Стратегия,Некоторые наконециз все равно останутся в памяти после того, как количество чатов, записанных как буфер, и общее количество токенов в буфере достигнет заданного предела.,всем Chat запись Подвести Итог Аннотация как SystemMessage и очистить другую историю Messages;этот种 memory 方案结合Понятноbuffer memory
иsummary memory
изпреимущество,Ни часто. общее суммарное потребление токен не будет разрешен buffer Слишком много информации отсутствует。Вниз面даодинConversation Summary Buffer Memory
существоватьConversationChain
в Пример использования,包含ПонятноВосстановление оперативной памяти при переключении сеансовизметода такжеПользовательская сводная подсказкаизметод:
from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryBufferMemory
from langchain.llms import OpenAI
from langchain.schema import SystemMessage, AIMessage, HumanMessage
from langchain.memory.prompt import SUMMARY_PROMPT
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0.7, openai_api_key=OPENAI_API_KEY, openai_api_base=OPENAI_PROXY_URL+"/v1")
# ConversationSummaryBufferMemory по умолчанию использует langchain.memory.prompt.SUMMARY_PROMPT в качестве сводки изPromptTemplate.
# Если у вас есть особые требования к его резюме по формату/содержанию, вы можете НастроитьPromptTemplate (фактическое тестовое резюме по умолчанию имеет несколько работающих учетных записей)
prompt_template_str = """
## Instruction
Progressively summarize the lines of conversation provided, adding onto the previous summary returning a new concise and detailed summary.
Don't repeat the conversation directly in the summary, extract key information instead.
## EXAMPLE
Current summary:
The human asks what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good.
New lines of conversation:
Human: Why do you think artificial intelligence is a force for good?
AI: Because artificial intelligence will help humans reach their full potential.
New summary:
The human inquires about the AI's opinion on artificial intelligence. The AI believes that it is a force for good as it can help humans reach their full potential.
## Current summary
{summary}
## New lines of conversation
{new_lines}
## New summary
"""
prompt = PromptTemplate(
input_variables=SUMMARY_PROMPT.input_variables, # input_variables имеет значение SUMMARY_PROMPT, а input_variables остается неизменным.
template=prompt_template_str, # шаблон заменен на переписанный выше изprompt_template_str
)
memory = ConversationSummaryBufferMemory(llm=llm, prompt=prompt, max_token_limit=60)
# Добавьте историческую память, в которой первое SystemMessage — это краткое изложение содержания исторического разговора, второе Человеческое сообщение и третье AIMessage — это окончание содержимого исторического разговора.
memory.chat_memory.add_message(SystemMessage(content="The human asks what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential. The human then asks the difference between python and golang in short. The AI responds that python is a high-level interpreted language with an emphasis on readability and code readability, while golang is a statically typed compiled language with a focus on concurrency and performance. Python is typically used for general-purpose programming, while golang is often used for building distributed systems."))
memory.chat_memory.add_user_message("Then if I want to build a distributed system, which language should I choose?")
memory.chat_memory.add_ai_message("If you want to build a distributed system, I would recommend golang as it is a statically typed compiled language that is designed to facilitate concurrency and performance.")
# Вызовите Memory.prune(), чтобы убедиться, что содержимое разговораchat_memory не превышает max_token_limit.
memory.prune()
conversation_with_summary = ConversationChain(
llm=llm,
# We set a very low max_token_limit for the purposes of testing.
memory=memory,
verbose=True,
)
# Memory.prune() будет автоматически выполняться каждый раз, когда вызывается Predict().
conversation_with_summary.predict(input="Is there any well-known distributed system built with golang?")
conversation_with_summary.predict(input="Is there a substitutes for Kubernetes in python?")
После выполнения verbose выход日志нравиться Вниз:
> Entering new chain... Prompt after formatting: 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. Current conversation: System: The human asks the AI about its opinion on artificial intelligence and is told that it is a force for good that can help humans reach their full potential. The human then inquires about the differences between python and golang, with the AI explaining that python is a high-level interpreted language for general-purpose programming, while golang is a statically typed compiled language often used for building distributed systems. Human: Then if I want to build a distributed system, which language should I choose? AI: If you want to build a distributed system, I would recommend golang as it is a statically typed compiled language that is designed to facilitate concurrency and performance. Human: Is there any well-known distributed system built with golang? AI: > Finished chain. > Entering new chain... Prompt after formatting: 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. Current conversation: System: The human asks the AI about its opinion on artificial intelligence and is told that it is a force for good that can help humans reach their full potential. The human then inquires about the differences between python and golang, with the AI explaining that python is a high-level interpreted language for general-purpose programming, while golang is a statically typed compiled language designed to facilitate concurrency and performance, thus better suited for distributed systems. The AI recommends golang for building distributed systems. Human: Is there any well-known distributed system built with golang? AI: Yes, there are several well-known distributed systems built with golang. These include Kubernetes, Docker, and Consul. Human: Is there a substitutes for Kubernetes in python? AI: > Finished chain. 'Yes, there are several substitutes for Kubernetes in python. These include Dask, Apache Mesos and Marathon, and Apache Aurora.’
существовать в некоторых сценариях,я们нуждаться根据用户входить灵活地调用LLM
и Другие инструменты(LangChain
Воляинструментабстрактныйдля Tools этот компонент), Агент Для таких приложений предусмотрена соответствующая поддержка.
Agent
Может访问一套инструмент,и根据用户входить确定要использоватьChain
илидаFunction
,Мы можем просто понять, что он может динамически помогать нам выбирать и вызывать Chain или любые инструменты.
Обычно используетсяAgent
типнравиться Вниз:
Этот тип Агента может решить, использовать ли указанный Инструмент и какой Инструмент использовать, на основе выходных данных Языковой Модели (Инструмент здесь также может быть Цепочкой), а также своевременно дополнять информацию для процесса ввода-вывода Модели.
Похож на диалоговый агент, но позволяет агенту дополнительно извлекать параметры указанного инструмента и т. д. и даже использовать несколько инструментов.
абстрактный Процесс «решения, что делать» агенту называется «планированием». what to do”и“executing the sub tasks”(этот种метод来自"Plan-and-Solve"этот一篇论文),其середина“planning what to шаг «делать» обычно полностью состоит из LLM завершено во время «выполнения the sub задач» обычно состоит из более Tools завершить.
Связывающая пара LLM результат выполнения атрибуции, похожий OpenAI functions Агент предоставляет более явную структуру и методы, поддерживаемые документами.
Агент этого типа будет выполнять дополнительный поиск и самопроверку с помощью LLM Output, называя себя Инструментами, а также LLM для достижения расширенного и оптимизированного вывода.
LangChain в Data Connection Воля LLM Соединяйтесь со всем, дарите LangChain Создавайте приложения, которые открывают безграничные возможности, и Agent Он также обеспечивает ленивый способ «управляемой событиями» разработки, который очень распространен при разработке приложений, и оставляет работу по принятию решений ветке на усмотрение. LLM, который еще больше упрощает работу по разработке приложений в сочетании с; основевысокийабстрактныйиз Model I/O и Memory и другие компоненты, LangChain Позвольте разработчикам реализовывать быстрее, лучше и более гибко. LLM Такие приложения, как помощники и разговорные роботы, значительно сократили LLM порог использования.