LangChain+LLM实战---LangChain中的6大核心模块

模型(Models)

  • 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))

提示工程(Prompts)

提示模板(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?

链(Chains)

  • 在多步骤的工作流中组合LLM和提示
  • 在LangChain中,链是由链组成的,可以是LLM这样的原始链,也可以是其他链。
  • 最核心的链类型是LLMChain,它由PromptTemplateLLM组成。
  • 接受用户输入,使用 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!'

代理(Agents)

基于用户输入的动态调用链,通常链运行在一个预先确定的顺序,但是代理使用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?")

记忆存储(Memory)

向链和代理添加状态:

  • 通常所有工具和代理都是无状态的。
  • 如果链或代理具有某种“内存”概念,以便它可以记住关于其以前的交互的信息,这样它就可以利用这些消息的上下文来进行更好的对话,这是一种“短期记忆”。
  • 如果链条/代理随着时间的推移记住关键信息,这将是一种形式的“长期记忆”。
  • 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)

索引(Indexes)

  • 索引是指构造文档的方法,以便LLM可以最好地与它们交互。此模块包含用于处理文档的实用工具函数、不同类型的索引,以及在链中使用这些索引的示例。
  • 在链中使用索引的最常见方式是“检索”步骤。接受用户的查询并返回最相关的文档。索引可以用于检索之外的其他事情,检索可以使用索引之外的其他逻辑来查找相关文档。
  • 大多数时候,谈论索引和检索时,谈论的是索引和检索非结构化数据,如文本文档。
  • LangChain支持的主要索引和检索类型目前主要集中在向量数据库上。
  • 文档加载器(Document Loaders),文档加载程序,如何从各种源加载文档。
from langchain.document_loaders.csv_loader import CSVLoader

loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data = loader.load()
  • 文本分割器(Text Splitters),文字分割器,关于分割文本的抽象和实现的概述。
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])
  • 向量存储(Vectorstores),概述Vector Stores和LangChain提供的许多集成。
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)
  • 检索器(Retrievers),检索器概述和LangChain提供的实现。
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")

你可能感兴趣的:(LangChain-LLM,人工智能,算法,langchain)