我查阅了很多文档,但对检索器部分感到困惑。
所以我正在使用用户的自定义数据构建一个聊天机器人。
现在我正在遵循以下方法
def doc_preprocessing(content):
doc = Document(page_content=content)
text_splitter = CharacterTextSplitter(
chunk_size=1000,
chunk_overlap=0
)
docs_split = text_splitter.split_documents([doc])
return docs_split
def embedding_db(user_id, content):
docs_split = doc_preprocessing(content)
# Extract text from the split documents
texts = [doc.page_content for doc in docs_split]
vectors = embeddings.embed_documents(texts)
# Store vectors with user_id as metadata
for i, vector in enumerate(vectors):
upsert_response = index.upsert(
vectors=[
{
'id': f"{user_id}",
'values': vector,
'metadata': {"user_id": str(user_id)}
}
]
)
这样它应该为给定的数据创建嵌入到松果中。
现在第二部分是与这些数据聊天。对于质量检查,我有以下
def retrieval_answer(user_id, query):
text_field = "text"
vectorstore = Pinecone(
index, embeddings.embed_query, text_field
)
vectorstore.similarity_search(
query,
k=10,
filter={
"user_id": str(user_id)
},
)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type='stuff',
retriever=vectorstore.as_retriever(),
)
result = qa.run(query)
print("Result:", result)
return result
但我不断
Found document with no `text` key. Skipping.
当我进行 QA 时,它不是指存储在松果中的数据。它只是使用普通的 chatgpt。我不确定我在这里缺少什么。
您需要使用模板创建提示,并在链中提及您检索到的文档作为上下文。或者像这样构建你的链:
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
更多详细信息可以在 langchain 文档中找到,访问 文档在这里:
https://python.langchain.com/docs/use_cases/question_answering/quickstart