.01
.02
输入:用户输入问题或提示,例如“量子计算的最新进展是什么?”。 检索:系统会在一个知识库或文档集合中(通常是向量数据库)进行搜索,通过相似度检索找到相关文档。 返回结果:系统将检索出的最相关的信息片段返回(例如前5或10条最匹配的内容)。
结合信息:将检索到的内容与用户的输入整合,以提供更加全面的上下文。 生成答案:使用生成式模型(如GPT等)基于这些信息生成回答,同时结合模型的已有知识与检索内容。 输出结果:系统返回基于检索信息生成的最终回答,确保其准确性和实时性。
.03
{
"id": 0,
"vector": [0.01, -0.03, 0.15, ..., -0.08],
"payload": {
"company": "Apple Inc.",
"ticker": "AAPL",
"price": 175.50,
"market_cap": "2.8T",
"industry": "Technology",
"pe_ratio": 28.5
}
}
.04
.05
问题:“澳大利亚的首都是哪里?” 错误回答:“澳大利亚的首都是悉尼。”(正确答案应为堪培拉)
.06
数据管理:整理和验证用于检索的数据,确保数据的完整性。 创建并验证向量嵌入:使用语言模型将文本转化为向量嵌入,以便后续的相似性匹配。 应用RAG流程:将用户的查询转换为向量,检索数据库并生成回答。
import pandas as pd
from sentence_transformers import SentenceTransformer
# 加载句子嵌入模型
encoder = SentenceTransformer('all-MiniLM-L6-v2')
# 读取JSON格式的数据
df = pd.read_json('../../stock_data.json')
df = pd.json_normalize(df['stocks'])
df = df[df['company'].notna()]
data = df.to_dict('records')
from qdrant_client import QdrantClient
# 创建内存中的向量数据库
qdrant = QdrantClient(":memory:")
# 创建集合以存储向量数据
qdrant.recreate_collection(
collection_name="top_stocks",
vectors_config=models.VectorParams(
size=encoder.get_sentence_embedding_dimension(),
distance=models.Distance.COSINE
)
)
# 向量化数据并上传至向量数据库
valid_data = [doc for doc in data if isinstance(doc.get("company", ""), str) and doc["company"].strip()]
qdrant.upsert(
collection_name="top_stocks",
points=[
models.PointStruct(
id=idx,
vector=encoder.encode(doc["company"]).tolist(),
payload=doc
) for idx, doc in enumerate(valid_data)
]
)
# 执行查询并获取相似结果
query_prompt = "市值较高的科技公司"
query_vector = encoder.encode(query_prompt).tolist()
search_results = qdrant.search(
collection_name="top_stocks",
query_vector=query_vector,
limit=3,
with_payload=True
)
for result in search_results:
print(f"公司:{result.payload['company']},行业:{result.payload['industry']},市值:{result.payload['market_cap']}")
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="your_api_key")
completion = client.chat.completions.create(
model="LLaMA_CPP",
messages=[
{"role": "system", "content": "你是股票领域的专家,帮助用户选择股票并回答他们的问题。"},
{"role": "user", "content": "NVIDIA的市值和市盈率是多少?"},
{"role": "assistant", "content": str(search_results)}
]
)
print(completion.choices[0].message["content"])
.07
参考:
https://arxiv.org/pdf/2005.11401