我还没有找到有关基于多个文本文件的问答的文档,同时单独引用文本文件。
示例:我已经file1.txt通过了file20.txt。
file1.txt是从 2023 年 4 月开始,file5.txt是从 2023 年 3 月开始。
给定两个文件,我希望 chatGPT 读取这两个文件并回答比较问题,例如:
“从 3 月份的文件到 4 月份的文件,关于 ___ 的情绪有何变化/进展?”
“两个文件在 ___ 的讨论方面有何不同?”
“每个文件中 ___ 被提及多少次?”
这是非工作代码,说明了我想要实现的目标:
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.llms import OpenAI
chain = load_qa_with_sources_chain(OpenAI(temperature=0), chain_type="stuff")
query = "How has sentiment regarding medical devices changed/progressed from March to April?"
docs = [March_file, April_file]
chain({"input_documents": docs, "question": query}, return_only_outputs=True)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题:
分块 - langchain 的 QA 假设将您的所有个人文件分块为许多单独的、但仍然连续的块/ documents。然而,我的任务的性质需要分离文件,因为需要以某种方式通过不同的日期引用它们(并且仍然需要分块,因为文件很大)。
对特定文件的引用 - …
为嵌套 json 定义输出模式的推荐方法是什么,我使用的方法感觉不太理想。
# adding to planner -> from langchain.experimental.plan_and_execute import load_chat_planner
refinement_response_schemas = [
ResponseSchema(name="plan", description="""{'1': {'step': '','tools': [],'data_sources': [],'sub_steps_needed': bool},
'2': {'step': '','tools': [<empty list>],'data_sources': [<>], 'sub_steps_needed': bool},}"""),] #define json schema in description, works but doesn't feel proper
refinement_output_parser = StructuredOutputParser.from_response_schemas(refinement_response_schemas)
refinement_format_instructions = refinement_output_parser.get_format_instructions()
refinement_output_parser.parse(output)
Run Code Online (Sandbox Code Playgroud)
给出:
{'plan': {'1': {'step': 'Identify the top 5 strikers in La Liga',
'tools': [],
'data_sources': ['sports websites', 'official league statistics'],
'sub_steps_needed': False},
'2': {'step': 'Identify the top 5 strikers in the Premier League', …Run Code Online (Sandbox Code Playgroud) 我是 langchain 的新手,所以我猜这是可能的,但这表明我对 langchain 中的组件缺乏充分的了解。我已成功创建并使用 Pandas Dataframe Agent 工具包来分析小型数据框。我还成功地使用 SERPAPI 工具来利用 Google 搜索 API 并从互联网上检索答案。我的目标是将这两件事结合到一个代理中......一个代理可以在数据中存在答案时查询数据以获取答案,而在数据中不存在答案时默认使用互联网。我觉得可能有一种方法可以向现有代理 takeit 添加工具。另一种选择似乎是从头开始创建一个新代理,复制 pandas 数据框代理的功能并添加其他工具......但这超出了我目前的技能范围。
给定一个数据框 sales_df:
from langchain.agents import create_pandas_dataframe_agent
from langchain.llms import OpenAI
question = 'Which itemnumber has the most sales?'
agent = create_pandas_dataframe_agent(OpenAI(temperature=0),
sales_df,
verbose=True,
)
agent.run(question)
Run Code Online (Sandbox Code Playgroud)
此代码成功返回我的 pandas 数据框问题的正确答案。
鉴于上面的项目编号(出于隐私原因,xxx 已被删除):
from langchain.agents import initialize_agent, load_tools, AgentType
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = load_tools(['serpapi'], serpapi_api_key=SERPAPI_API_KEY)
agent = initialize_agent(
tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
agent.run("What is the description of the …Run Code Online (Sandbox Code Playgroud) 我创建了一个检索 QA 链,它使用 chromadb 作为向量 DB 来存储“abc.txt”文件的嵌入。如果我想动态添加更多文档嵌入(比如说另一个文件“def.txt”)怎么办?怎么做?我不想重新加载 abc.txt 嵌入,然后重新加载 def.txt 嵌入,然后将其放入色度数据库实例中。我只想重用相同的色度数据库实例(已经具有 abc.txt 的嵌入)并添加更多 def.txt 的文档嵌入,然后使用相同的内容进行检索。
loader = UnstructuredFileLoader('abc.txt', mode='elements')
documents= loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(texts,embeddings)
chain = RetrievalQA.from_chain_type(llm=OpenAI(temperature=0.0),chain_type="stuff", retriever=vectordb.as_retriever(search_type="mmr"),return_source_documents=True)
Run Code Online (Sandbox Code Playgroud) 我正在尝试修改现有的 Colab 示例以结合 langchain 内存和上下文文档加载。在两个单独的测试中,每个实例都完美运行。现在我想将两者(训练上下文加载和对话记忆)合二为一 - 这样我就可以加载之前训练的数据,并在我的聊天机器人中保存对话历史记录。问题是我不知道如何使用“ConversationChain”来实现这一点,它只需要一个参数,即“输入”。
当我使用“ConversationChain”时,我可以传递以下内容:
query = "What is the title of the document?"
docs = docsearch.similarity_search(query)
chain.run(input_documents=docs, question=query)
有人能指出我正确的方向吗?
我正在使用这里的内存示例:https ://www.pinecone.io/learn/langchain-conversational-memory/
我对 Python 和 langchain 的了解有限。
我试过:
with open('/content/gdrive/My Drive/ai-data/docsearch.pkl', 'rb') as f:
docsearch = pickle.load(f)
model_kwargs = {"model": "text-davinci-003", "temperature": 0.7, "max_tokens": -1, "top_p": 1, "frequency_penalty": 0, "presence_penalty": 0.5, "n": 1, "best_of": 1}
llm = OpenAI(model_kwargs=model_kwargs)
def count_tokens(chain, query):
with get_openai_callback() as cb:
docs = docsearch.similarity_search(query)
# working older version: result = chain.run(query)
result …Run Code Online (Sandbox Code Playgroud) 我收到一个错误说
ValueError: `run` not supported when there is not exactly one output key. Got ['answer', 'sources', 'source_documents'].
Run Code Online (Sandbox Code Playgroud)
这是回溯错误
File "C:\Users\Science-01\anaconda3\envs\gpt-dev\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 565, in _run_script
exec(code, module.__dict__)
File "C:\Users\Science-01\Documents\Working Folder\Chat Bot\Streamlit\alpha-test.py", line 67, in <module>
response = chain.run(prompt, return_only_outputs=True)
File "C:\Users\Science-01\anaconda3\envs\gpt-dev\lib\site-packages\langchain\chains\base.py", line 228, in run
raise ValueError(
Run Code Online (Sandbox Code Playgroud)
我尝试在 Streamlit 上运行 langchain。我使用RetrievalQAWithSourcesChain和ChatPromptTemplate
这是我的代码
import os
import streamlit as st
from apikey import apikey
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings …Run Code Online (Sandbox Code Playgroud) 我不明白 Langchain 递归文本分割器的以下行为。这是我的代码和输出。
from langchain.text_splitter import RecursiveCharacterTextSplitter
r_splitter = RecursiveCharacterTextSplitter(
chunk_size=10,
chunk_overlap=0,
# separators=["\n"]#, "\n", " ", ""]
)
test = """a\nbcefg\nhij\nk"""
print(len(test))
tmp = r_splitter.split_text(test)
print(tmp)
Run Code Online (Sandbox Code Playgroud)
输出
13
['a\nbcefg', 'hij\nk']
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它输出大小为 7 和 5 的块,并且仅在新行字符之一上进行分割。我期望输出为 ['a','bcefg','hij','k']
目前,在 LangChain 中使用时LLMChain,我可以获取使用的模板提示和模型的响应,但是是否可以获取作为查询发送到模型的确切文本消息,而无需手动进行提示模板填充?
一个例子:
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = OpenAI(model_name="gpt-3.5-turbo-0613")
prompt = PromptTemplate(input_variables=["a", "b"], template="Hello {a} and {b}")
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.call({"a": "some text", "b": "some other text"})
Run Code Online (Sandbox Code Playgroud)
chain我无法在或对象中找到我正在寻找的东西result。我尝试了一些选项,例如return_final_only=True和include_run_info=True但它们不包含我正在寻找的内容。
我正在尝试创建(最大)350 个字符长、100 个块重叠的块。
我知道这chunk_size是一个上限,所以我可能会得到比这个更短的块。但为什么我没有得到任何chunk_overlap?
是因为重叠也必须在分隔符之一上分割吗?那么如果separator分割的 100 个字符以内可以分割,那么它就是 100 个字符 chunk_overlap 吗?
from langchain.text_splitter import RecursiveCharacterTextSplitter
some_text = """When writing documents, writers will use document structure to group content. \
This can convey to the reader, which idea's are related. For example, closely related ideas \
are in sentances. Similar ideas are in paragraphs. Paragraphs form a document. \n\n \
Paragraphs are often delimited with a carriage return or two carriage returns. \
Carriage returns …Run Code Online (Sandbox Code Playgroud) 我使用会话代理和一些工具,其中之一是计算器工具(作为示例)。
代理初始化如下:
conversational_agent = initialize_agent(
agent='chat-conversational-react-description',
tools=[CalculatorTool()],
llm=llm_gpt4,
verbose=True,
max_iterations=2,
early_stopping_method="generate",
memory=memory,
# agent_kwargs=dict(output_parser=output_parser),
)
Run Code Online (Sandbox Code Playgroud)
当CalculatorTool激活时,它将返回一个字符串输出,代理获取该输出并进一步处理它以获得“最终答案”,从而更改输出的格式CalculatorTool
例如,对于 input 10*10,工具run()函数将返回100,该函数将被传播回代理,代理将调用self._take_next_step()并继续处理输出。
它将创建类似的最终输出the result of your prompt of 10x10 is 100
我不想要LLM添加的格式,只想要100.
我想在CalculatorTool完成后打破链条,并将其输出按原样返回给客户端。
我还有返回序列化数据的工具,对于图表来说,由代理的下一次迭代重新处理该数据将使其无效。