1、基础示例:
chain=prompt|model|output_parser
符号|:作用是将前一个部件的输出作为下一个部件的输入
以上写法也等同于
chain=LLMChain(prompt=prompt,llm=model,output_parser=output_parser,return_final_only=False)
OpenAI的参数temperature介于0-1,越接近0回答越确定(适合需要准确、文档搜索的场景),越接近1越多样化(模型回答的更飘),默认0.7;
from langchain.llms import OpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.chains.llm import LLMChain
prompt=ChatPromptTemplate.from_template("用中文讲个笑话关于{topic}")
model=OpenAI(model_name="gpt-3.5-turbo"
,temperature=0.5)
output_parser=StrOutputParser()
chain=prompt|model|output_parser
response=chain.invoke({"topic": "椅子"})
print(response)
chain=LLMChain(prompt=prompt,llm=model,output_parser=output_parser,return_final_only=False)
response=chain.invoke({"topic": "椅子"})
print(response)
2、prompt
prompt:提示,接收一个字典并生成PromptValue(一个有完整提示的包装器,可以传给任何一个llm或chatModel)
llm:takes a string as input、chatModel:takes a sequence of messages as input
prompt=ChatPromptTemplate.from_template("用中文讲个笑话关于{topic}")
prompt_value = prompt.invoke({"topic": "椅子"})
print(prompt_value)#messages=[HumanMessage(content='用中文讲个笑话关于椅子')]
print(prompt_value.to_string())#Human: 用中文讲个笑话关于椅子;等同于StrOutputParser
3、model
model.invoke(prompt_value),如果model是chatModel(通过from langchain_openai import ChatOpenAI),输出的是message格式(AIMessage(content="XX")),如果model是LLM(from langchain_openai.llms import OpenAI),输出格式是字符串,可用(from langchain_core.messages import AIMessage)转换为message格式
4、Output parser
输出格式转换器
5、RAG Search Example
RAG:retrieval-augmented generation,召回/检索-增强的生成器,作用是将私有知识库和模型融合
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
通过一个RunnableParallel,在两个实体间并行进行内容抓取和用户问题解析,通过RunnablePassthrough传递信息,提高处理效率
from langchain.llms import OpenAIChat
from langchain_community.embeddings.openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain.llms import OpenAIChat
from langchain_community.embeddings.openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
model=OpenAIChat()
embeddings = OpenAIEmbeddings()
text_splitter = RecursiveCharacterTextSplitter()
docs=["小明是一位科学家", "小明在balala地区工作"]
vector = FAISS.from_texts(docs, embeddings)
retriever = vector.as_retriever()
# ##############官方的示例
prompt = ChatPromptTemplate.from_template(
"""只根据提供的{context}进行回答,如果{question}与提供的内容无关,回答"对不起,我不知道"。""")
output_parser = StrOutputParser()
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
##首先通过一个RunnableParallel,在两个实体间并行进行内容抓取和用户问题解析,通过RunnablePassthrough传递信息
chain = setup_and_retrieval | prompt | model | output_parser
print(chain.invoke("介绍一下小明"))#小明是一位科学家,在balala地区工作。
##############其他示例
prompt1 = ChatPromptTemplate.from_template(
"""
只根据提供的内容进行回答,如果问题与提供的材料无关,请回答"对不起,我不知道"
{context}
{input}
""")
#注意documents_chain的prompt格式要求
document_chain = create_stuff_documents_chain(model, prompt1)
#注意retrieval_chain要求传入input,否则报错KeyError: 'input',retrieval_docs = (lambda x: x["input"]) | retriever
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input": "介绍一下小明"})
print(response)
#{'input': '介绍一下小明',
# 'context': [Document(page_content='小明是一位科学家'),Document(page_content='小明在balala地区工作')],
# 'answer': '小明是一位科学家,他在balala地区工作。'}
response = retrieval_chain.invoke({"input": "中国在哪个大洲"})
print(response['answer'])#'answer': '对不起,我不知道。'