- LLMs
大型语言模型,将文本字符串作为输入,并返回文本字符串作为输出。
- 聊天模型
聊天模型通常由语言模型支持,但它们的API更加结构化。这些模型将聊天消息列表作为输入,并返回聊天消息。
- 文本嵌入模型
文本嵌入模型将文本作为输入,并返回一个浮点数列表,常见的嵌入集成:OpenAI。
LLM从语言模型中获取预测,LangChain最基本的构建块是对某些输入调用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))
提示模板(PromptTemplate):管理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?
- 在多步骤的工作流中组合LLM和提示
- 在LangChain中,链是由链组成的,可以是LLM这样的原始链,也可以是其他链。
- 最核心的链类型是
LLMChain
,它由PromptTemplate
和LLM
组成。- 接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化后的响应传递给
LLM
。
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
现在可以创建一个简单的链,它接受用户输入,用它格式化提示符,然后将它发送到 LLM:
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
chain.run("colorful socks")
# -> '\n\nSocktastic!'
基于用户输入的动态调用链,通常链运行在一个预先确定的顺序,但是代理使用LLM来确定要执行哪些操作以及按照什么顺序执行。操作可以使用工具并观察其输出,也可以返回给用户。
代理相关基本概念:
- 工具(tools):执行特定任务的功能。可以是:Google 搜索、数据库查找、Python REPL、其他链等。工具的接口目前是一个函数,预计将有一个字符串作为输入,一个字符串作为输出。
- 大语言模型(LLM):为代理提供动力的语言模型。
- 代理(agents):要使用的代理,是引用支持代理类的字符串。
安装SerpAPI Python包:pip install google-search-results
设置适当的环境变量:import osos.environ["SERPAPI_API_KEY"] = "..."
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
# First, let's load the language model we're going to use to control the agent.
llm = OpenAI(temperature=0)
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# Now let's test it out!
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")
向链和代理添加状态:
- 通常所有工具和代理都是无状态的。
- 如果链或代理具有某种“内存”概念,以便它可以记住关于其以前的交互的信息,这样它就可以利用这些消息的上下文来进行更好的对话,这是一种“短期记忆”。
- 如果链条/代理随着时间的推移记住关键信息,这将是一种形式的“长期记忆”。
- LangChain提供了链(
ConversationChain)
和两种不同类型的内存来完成操作。
默认情况下,ConversationChain
有个简单的内存类型,它记住所有以前的输入/输出,并将它们添加到传递的上下文中,(设置verbose=True,
可以看到提示符)。
from langchain import OpenAI, ConversationChain
llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
output = conversation.predict(input="Hi there!")
print(output)
output = conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
print(output)
- 索引是指构造文档的方法,以便LLM可以最好地与它们交互。此模块包含用于处理文档的实用工具函数、不同类型的索引,以及在链中使用这些索引的示例。
- 在链中使用索引的最常见方式是“检索”步骤。接受用户的查询并返回最相关的文档。索引可以用于检索之外的其他事情,检索可以使用索引之外的其他逻辑来查找相关文档。
- 大多数时候,谈论索引和检索时,谈论的是索引和检索非结构化数据,如文本文档。
- LangChain支持的主要索引和检索类型目前主要集中在向量数据库上。
from langchain.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data = loader.load()
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator = " ",
chunk_size = 1000,
chunk_overlap = 200,
length_function = len,
)
texts = text_splitter.create_documents([state_of_the_union])
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Milvus
from langchain.document_loaders import TextLoader
from langchain.document_loaders import TextLoader
loader = TextLoader('../../../state_of_the_union.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vector_db = Milvus.from_documents(
docs,
embeddings,
connection_args={"host": "127.0.0.1", "port": "19530"},
)
docs = vector_db.similarity_search(query)
from langchain.retrievers import ChatGPTPluginRetriever
retriever = ChatGPTPluginRetriever(url="http://0.0.0.0:8000", bearer_token="foo")
retriever.get_relevant_documents("alice's phone number")