关于Langchain的常识,之前我现已依据官方文档结合了我的经验和了解写了中文版的Langhain文档,这次吴恩达老师的课程我也再次温习了一下(纯英文无中文翻译真的挺难受的),以下是我的笔记分享:
Model_prompt_parser
一上来便是Langchain的基本语法格式:
import os
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ['OPENAI_API_KEY']
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0,
)
return response.choices[0].message["content"]
## 发问
get_completion("What is 1+1?")
然后介绍了Prompt模板
prompt = f"""Translate the text \
that is delimited by triple backticks
into a style that is {style}.
text: ```{customer_email}```
"""
print(prompt)
为什么咱们需要prompt模板: 由于prompt普遍都是很长而且有许多细节的,咱们应该尽可能重复运用这些好的框架,只需要修正部分必要的细节即可
接着介绍了一下怎么修正Open AI的LLM的几个影响答复的参数:
messages = prompt_template.format_messages(text=customer_review)
chat = ChatOpenAI(temperature=0.0)#这儿的括号里边还可以添加其他修正参数的值
response = chat(messages)
print(response.content)
以及怎么将得到的成果修正为python 的字典结构
Memory
众所不周知,OPEN AI 的API是不具备和chatgpt一样的上下文才能的,也便是咱们通俗意义上了解的“回忆”才能。 但是咱们可以经过Langchain来处理这个问题。
llm = ChatOpenAI(temperature=0.0)
memory = ConversationBufferMemory()#用了一个回忆库来回忆上下文
conversation = ConversationChain(
llm=llm,
memory = memory,
verbose=True
)
当然,不只是一个回忆库可以运用,课程中还介绍了好几种,用法大差不差,不多介绍了。
Chain
很明显,Langchain的chain是故事的主角,这节课首要介绍的便是Chain(链)。 Lanchain的首要思路便是经过链式调用各种API各种库完成为LLM赋能,完成更多的定制化功能。
先看一个简单的比如:
llm = ChatOpenAI(temperature=0.9)
prompt = ChatPromptTemplate.from_template(
"What is the best name to describe \
a company that makes {product}?"
)
chain = LLMChain(llm=llm, prompt=prompt)#这儿便是将LLM和prompt链接起来了
product = "Queen Size Sheet Set"
chain.run(product)
接下来展现屡次链式调用
from langchain.chains import SimpleSequentialChain
llm = ChatOpenAI(temperature=0.9)
# prompt template 1
first_prompt = ChatPromptTemplate.from_template(
"What is the best name to describe \
a company that makes {product}?"
)
# Chain 1
chain_one = LLMChain(llm=llm, prompt=first_prompt)
# prompt template 2
second_prompt = ChatPromptTemplate.from_template(
"Write a 20 words description for the following \
company:{company_name}"
)
# chain 2
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 将两个chain链接在一起
overall_simple_chain = SimpleSequentialChain(chains=[chain_one, chain_two],
verbose=True
)
overall_simple_chain.run(product)
接下来便是次序调用链子 望文生义,便是每条chain之间是有先后次序的 下面是比如和代码(这儿这个比如用来4条chain,先将文本翻译成英文——》将这段英文文本总结成一句话——》判别接下来的文本的特定言语——》将上面的总结翻译成第三步得到的特定的言语):
from langchain.chains import SequentialChain
llm = ChatOpenAI(temperature=0.9)
# prompt template 1: translate to english
first_prompt = ChatPromptTemplate.from_template(
"Translate the following review to english:"
"\n\n{Review}"
)
# chain 1: input= Review and output= English_Review
chain_one = LLMChain(llm=llm, prompt=first_prompt,
output_key="English_Review"
)
second_prompt = ChatPromptTemplate.from_template(
"Can you summarize the following review in 1 sentence:"
"\n\n{English_Review}"
)
# chain 2: input= English_Review and output= summary
chain_two = LLMChain(llm=llm, prompt=second_prompt,
output_key="summary"
)
# prompt template 3: translate to english
third_prompt = ChatPromptTemplate.from_template(
"What language is the following review:\n\n{Review}"
)
# chain 3: input= Review and output= language
chain_three = LLMChain(llm=llm, prompt=third_prompt,
output_key="language"
)
# prompt template 4: follow up message
fourth_prompt = ChatPromptTemplate.from_template(
"Write a follow up response to the following "
"summary in the specified language:"
"\n\nSummary: {summary}\n\nLanguage: {language}"
)
# chain 4: input= summary, language and output= followup_message
chain_four = LLMChain(llm=llm, prompt=fourth_prompt,
output_key="followup_message"
)
# overall_chain: input= Review
# and output= English_Review,summary, followup_message
overall_chain = SequentialChain(
chains=[chain_one, chain_two, chain_three, chain_four],
input_variables=["Review"],
output_variables=["English_Review", "summary","followup_message"],
verbose=True
)
之后还介绍了Router Chain,类似用多个prompt,然后依据input来选择prompt来答复。 代码太多就不展现了。
发问与答复
这节课首要展现的便是怎么经过Langchain让LLM依据特定的内容答复问题。 其实也是chatpdf,chatdoc之类网站的完成原理。 来看下面的比如和代码:
file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file)
# 调用向量索引库来存储文件内容
from langchain.indexes import VectorstoreIndexCreator
index = VectorstoreIndexCreator(
vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])
query ="Please list all your shirts with sun protection \
in a table in markdown and summarize each one."
response = index.query(query)
display(Markdown(response))
这儿解释一下咱们怎么存储内容: 由于LLM模型只能存储很少的信息,所以关于大文件咱们需要用到一个向量索引库来存贮这些文件的内容,然后经过向量相关匹配来找到和发问对应的内容,LLM依据这特定的内容进行答复。
Evaluation
Evaluation是用来检测和评价咱们的chain和agent质量的, 一般来说是比较难以评价的,两个原因:缺乏数据;缺乏目标 不过经过Langchain咱们就可以处理上面的问题。
经过LangChainDataset寻找开源数据或许让LLM依据文件生成相关的数据
不用目标判别而经过人依据感觉剖析或许经过LLM自身评价输出质量
本文的代码量大就不放上来了,有需要到课程网站上查阅。
Agent
我关于Agent的了解便是可以调用其他的API来加强LLM的才能,而且Agents 运用 LLMs 来确认采纳哪些举动以及以何种次序采纳举动。 比如运用谷歌的API完成LLM的上网查阅信息的才能,经过运用计算机API来完成精准的计算。 下面是比如和代码:
llm = ChatOpenAI(temperature=0)
tools = load_tools(["llm-math","wikipedia"], llm=llm)
agent= initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
handle_parsing_errors=True,
verbose = True)
这是运行代码后内部产生的过程:
我的学习后考虑
吴恩达老师课程里边其实是不如Langchain官方文档全面的,包含许多比如也是照搬的。不过好的是提供了一个视频方法,可以让更多人参加进来,而且可以运用在线的notebook编辑也是方便了许多。不过仍是期望下次能尽快把抄本放出来,否则英文听力很累的www 感谢吴恩达老师的无私支付和