我目前正在开发一个由大型语言模型 (LLM) 提供支持的聊天机器人,我希望它能够根据我自己的文档提供响应。我知道在我的文档上使用微调模型可能不会产生直接响应,因此我正在探索检索增强生成 (RAG) 的概念以增强其性能。
在我的研究中,我遇到了两种工具,Langchain 和 LlamaIndex,它们似乎有助于 RAG。然而,我很难理解它们之间的主要区别。我注意到一些教程和资源同时使用这两种工具,我很好奇为什么人们会选择使用一种工具而不是另一种工具,或者什么时候一起使用它们才有意义。
有人可以深入了解 Langchain 和 LlamaIndex for RAG 之间的主要区别,以及何时使用一种工具优于另一种工具或在聊天机器人开发中将它们结合起来?
chatbot openai-api llama-index langchain large-language-model
我想在我的项目中使用 langchain。
所以我使用以下命令安装了它:pip install langchain
但是在导入“langchain”时我面临以下错误:
File /usr/lib/python3.8/typing.py:774, in _GenericAlias.__subclasscheck__(self, cls)
772 if self._special:
773 if not isinstance(cls, _GenericAlias):
--> 774 return issubclass(cls, self.__origin__)
775 if cls._special:
776 return issubclass(cls.__origin__, self.__origin__)
TypeError: issubclass() arg 1 must be a class
Run Code Online (Sandbox Code Playgroud)
谁能解决这个错误?
我在他们的官方网站上搜索了所有 langchain 文档,但没有找到如何从 python 中的 str 变量创建 langchain 文档,所以我在他们的 GitHub 代码中搜索,发现了这个:
doc=Document(
page_content="text",
metadata={"source": "local"}
)
Run Code Online (Sandbox Code Playgroud)
PS:我添加了元数据属性
,然后尝试将该文档与我的链一起使用:
内存和链:
memory = ConversationBufferMemory(memory_key="chat_history", input_key="human_input")
chain = load_qa_chain(
llm, chain_type="stuff", memory=memory, prompt=prompt
)
Run Code Online (Sandbox Code Playgroud)
调用方法:
chain({"input_documents": doc, "human_input": query})
Run Code Online (Sandbox Code Playgroud)
提示模板:
template = """You are a senior financial analyst analyzing the below document and having a conversation with a human.
{context}
{chat_history}
Human: {human_input}
senior financial analyst:"""
prompt = PromptTemplate(
input_variables=["chat_history", "human_input", "context"], template=template
)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
AttributeError: 'tuple' object has no attribute 'page_content'
Run Code Online (Sandbox Code Playgroud)
当我在将 …
如何向 RetrievalQA.from_chain_type 添加内存?或者,如何向 ConversationalRetrievalChain 添加自定义提示?
在过去的两周里,我一直在尝试制作一个可以通过文档聊天的聊天机器人(因此不仅仅是语义搜索/质量保证,因此需要记忆),而且还可以使用自定义提示。我已经尝试了所有链的每种组合,到目前为止,我得到的最接近的是 ConversationalRetrievalChain,但没有自定义提示,以及 RetrievalQA.from_chain_type 但没有内存
我正在创建这样的对话:
llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name=OPENAI_DEFAULT_MODEL)
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是能够保存和加载它,ConversationBufferMemory()以便它在会话之间保持不变。似乎没有任何明显的教程,但我注意到“Pydantic”,所以我尝试这样做:
saved_dict = conversation.memory.chat_memory.dict()
cm = ChatMessageHistory(**saved_dict) # or cm = ChatMessageHistory.parse_obj(saved_dict)
Run Code Online (Sandbox Code Playgroud)
但这失败了:
ValidationError: 6 validation errors for ChatMessageHistory
messages -> 0
Can't instantiate abstract class BaseMessage with abstract method type (type=type_error)
Run Code Online (Sandbox Code Playgroud)
想法?我希望有任何类型的指南、存储库、参考资料等的链接。
我已经使用 Chroma DB 编写了 LangChain 代码来矢量存储网站 URL 中的数据。目前,它可以从 URL 获取数据,将其存储到项目文件夹中,然后使用该数据来响应用户提示。我弄清楚了如何使该数据在运行后保留/存储,但我不知道如何加载该数据以供将来提示。目标是接收用户输入,使用 OpenAI LLM 的程序将根据现有数据库文件生成响应,而不是程序需要在每次运行时创建/写入这些数据库文件。如何才能做到这一点?
我应该怎么办?
我尝试了这个,因为这可能是理想的解决方案:
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", vectorstore=vectordb)
Run Code Online (Sandbox Code Playgroud)
但该from_chain_type()函数不接受vectorstore数据库作为输入,因此这不起作用。
我阅读了 LangChain快速入门。
里面有一个demo:
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
llm = OpenAI()
chat_model = ChatOpenAI()
llm.predict("hi!")
>>> "Hi"
chat_model.predict("hi!")
>>> "Hi"
Run Code Online (Sandbox Code Playgroud)
我搜索了文档的其余部分以及在线搜索,但没有找到任何有关 OpenAI 和 ChatOpenAI 之间差异的信息。
基于from langchain.llms import OpenAI,OpenAI 是一个大型语言模型(LLM),也与聊天相关。
那么 OpenAI 是否更通用,而 ChatOpenAI 更专注于聊天呢?
OpenAI浪链中的class和class有什么区别ChatOpenAI?有人可以澄清一下吗?
我正在使用 langchain 来处理 Mongo 数据库中的一大堆文档。
我可以使用 langchain 将所有文档加载到 chromadb 矢量存储中。这里没有什么花哨的事情。这是我的代码:
from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings, persist_directory='db')
db.persist()
Run Code Online (Sandbox Code Playgroud)
现在,存储数据后,我想获取所有带有 id 的文档和嵌入的列表。
这样我就可以将它们存储回 MongoDb 中。
我还想将它们通过 Bertopic 来获取主题类别。
问题1:如何获取刚刚存储在Chroma 数据库中的所有文档?我想要文档和所有元数据。
非常感谢您的帮助!
我正在使用 python 处理 langchain 和 ChromaDb。
现在,我知道如何使用文档加载器。例如,下面将一堆文档加载到 ChromaDb 中:
from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings, persist_directory='db')
db.persist()
Run Code Online (Sandbox Code Playgroud)
但是如果我想一次添加一个文档怎么办?更具体地说,我想在添加文档之前检查该文档是否存在。这样我就不会不断添加重复项。
如果文档不存在,只有那时我才想要获取嵌入并添加它。
我如何使用 langchain 来做到这一点?我想我主要了解 langchain,但不知道如何完成这样看似基本的任务。
langchain 文档包含此示例,用于配置和调用PydanticOutputParser
# Define your desired data structure.
class Joke(BaseModel):
setup: str = Field(description="question to set up a joke")
punchline: str = Field(description="answer to resolve the joke")
# You can add custom validation logic easily with Pydantic.
@validator('setup')
def question_ends_with_question_mark(cls, field):
if field[-1] != '?':
raise ValueError("Badly formed question!")
return field
# And a query intented to prompt a language model to populate the data structure.
joke_query = "Tell me a joke."
# Set up a parser + …Run Code Online (Sandbox Code Playgroud) langchain ×10
python ×6
openai-api ×4
chromadb ×3
py-langchain ×3
chatbot ×2
nlp ×2
chatgpt-api ×1
data-science ×1
llama-index ×1
pydantic ×1