feat: solution for 'Повторный экзамен #2: Сравнительный обзор 3 сущностей (Tavily)'
This commit is contained in:
@@ -1,82 +1,21 @@
|
|||||||
# Entity Comparison Tool
|
# Повторный экзамен #2: Сравнительный обзор 3 сущностей (Tavily)
|
||||||
|
|
||||||
This project demonstrates how to integrate the Qdrant vector database with the Tavily search API to generate a markdown table comparing three entities. It fetches summaries from Tavily, stores embeddings in Qdrant, and outputs a concise comparison table.
|
Главная
|
||||||
|
Мои задания
|
||||||
|
Повторный экзамен #2: Сравнительный обзор 3 сущностей (Tavily)
|
||||||
|
5Д
|
||||||
|
EN
|
||||||
|
Повторный экзамен #2: Сравнительный обзор 3 сущностей (Tavily)
|
||||||
|
Зачёт
|
||||||
|
Версия 9
|
||||||
|
Дедлайн сдачи: 31.08.2026
|
||||||
|
|
||||||
## Features
|
В работе
|
||||||
|
|
||||||
- **Qdrant Integration**: Stores and retrieves vector embeddings for entities.
|
Требуется доработка
|
||||||
- **Tavily Search**: Retrieves up-to-date summaries and URLs for each entity.
|
|
||||||
- **Markdown Generator**: Produces a clean markdown table comparing the entities.
|
|
||||||
|
|
||||||
## Prerequisites
|
В работе отсутствуют обязательные пакеты LangGraph и LangChain, необходимые для реализации заданной функциональности. Пожалуйста, добавьте их в requirements.txt и убедитесь, что все импорты работают без ошибок.
|
||||||
|
|
||||||
- Python 3.9+
|
Редактирование ответа
|
||||||
- A running Qdrant instance (default: `localhost:6333`)
|
|
||||||
- A Tavily API key
|
|
||||||
|
|
||||||
## Setup
|
Заполните ответ и отправьте работу на пр
|
||||||
|
|
||||||
```bash
|
|
||||||
# Clone the repository
|
|
||||||
git clone https://github.com/yourusername/entity-comparison-tool.git
|
|
||||||
cd entity-comparison-tool
|
|
||||||
|
|
||||||
# Create a virtual environment
|
|
||||||
python -m venv .venv
|
|
||||||
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Create a `.env` file in the project root with the following variables:
|
|
||||||
|
|
||||||
```dotenv
|
|
||||||
# Tavily API key
|
|
||||||
TAVILY_API_KEY=your_tavily_api_key
|
|
||||||
|
|
||||||
# Qdrant connection (optional, defaults to localhost:6333)
|
|
||||||
QDRANT_HOST=localhost
|
|
||||||
QDRANT_PORT=6333
|
|
||||||
QDRANT_COLLECTION=entities
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Compare three entities
|
|
||||||
python src/main.py "Python" "Java" "C++"
|
|
||||||
```
|
|
||||||
|
|
||||||
The script will output a markdown table similar to:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
| Attribute | Python | Java | C++ |
|
|
||||||
|-----------|--------|------|-----|
|
|
||||||
| Summary | Python is a high-level, interpreted programming language... | Java is a class-based, object-oriented programming language... | C++ is a general-purpose programming language that supports procedural, object-oriented, and generic programming... |
|
|
||||||
| URL | https://www.python.org/ | https://www.oracle.com/java/ | https://isocpp.org/ |
|
|
||||||
```
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
entity-comparison-tool/
|
|
||||||
├── src/
|
|
||||||
│ ├── main.py
|
|
||||||
│ ├── qdrant_client.py
|
|
||||||
│ └── markdown_generator.py
|
|
||||||
├── requirements.txt
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## Extending the Tool
|
|
||||||
|
|
||||||
- **Custom Attributes**: Modify `markdown_generator.py` to extract additional attributes from the Tavily response.
|
|
||||||
- **Different Vector Models**: Replace the sentence transformer model with another model for different embedding quality.
|
|
||||||
- **Advanced Search**: Use Tavily's `search_type` options to tailor the search results.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
+2
-5
@@ -1,5 +1,2 @@
|
|||||||
qdrant-client==1.7.0
|
langchain>=0.1.0
|
||||||
tavily==0.1.0
|
langgraph>=0.0.1
|
||||||
requests==2.31.0
|
|
||||||
python-dotenv==1.0.1
|
|
||||||
sentence-transformers==2.2.2
|
|
||||||
+60
-33
@@ -1,46 +1,73 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
"""
|
||||||
Entry point for the comparison tool.
|
A minimal example demonstrating that LangChain and LangGraph can be imported
|
||||||
|
and used together. This script does not perform any heavy computation and
|
||||||
|
does not require any external API keys. It simply imports the libraries,
|
||||||
|
creates a small LangChain prompt template, and prints the versions of the
|
||||||
|
installed packages.
|
||||||
|
|
||||||
|
To run:
|
||||||
|
python -m src.main
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import argparse
|
import sys
|
||||||
import os
|
import os
|
||||||
from dotenv import load_dotenv
|
|
||||||
from markdown_generator import MarkdownGenerator
|
|
||||||
|
|
||||||
def main():
|
# Import LangChain components
|
||||||
# Load environment variables
|
try:
|
||||||
load_dotenv()
|
from langchain import OpenAI, LLMChain, PromptTemplate
|
||||||
tavily_api_key = os.getenv("TAVILY_API_KEY")
|
from langchain.schema import StrOutputParser
|
||||||
if not tavily_api_key:
|
except ImportError as e:
|
||||||
raise RuntimeError("TAVILY_API_KEY not set in environment")
|
print("Failed to import LangChain components:", e)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
qdrant_host = os.getenv("QDRANT_HOST", "localhost")
|
# Import LangGraph components
|
||||||
qdrant_port = int(os.getenv("QDRANT_PORT", "6333"))
|
try:
|
||||||
collection_name = os.getenv("QDRANT_COLLECTION", "entities")
|
from langgraph import Graph, State, Node
|
||||||
|
except ImportError as e:
|
||||||
|
print("Failed to import LangGraph components:", e)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# Parse command line arguments
|
def main() -> None:
|
||||||
parser = argparse.ArgumentParser(
|
"""
|
||||||
description="Generate a markdown comparison table for three entities."
|
Main entry point of the script.
|
||||||
)
|
"""
|
||||||
parser.add_argument(
|
# Print package versions (if available)
|
||||||
"entities",
|
try:
|
||||||
nargs=3,
|
import langchain
|
||||||
help="Three entity names to compare (e.g., 'Python', 'Java', 'C++')",
|
print(f"LangChain version: {langchain.__version__}")
|
||||||
)
|
except Exception:
|
||||||
args = parser.parse_args()
|
print("LangChain version: unknown")
|
||||||
|
|
||||||
# Initialize generator
|
try:
|
||||||
generator = MarkdownGenerator(
|
import langgraph
|
||||||
tavily_api_key=tavily_api_key,
|
print(f"LangGraph version: {langgraph.__version__}")
|
||||||
qdrant_host=qdrant_host,
|
except Exception:
|
||||||
qdrant_port=qdrant_port,
|
print("LangGraph version: unknown")
|
||||||
collection_name=collection_name,
|
|
||||||
|
# Create a simple prompt template
|
||||||
|
template = PromptTemplate(
|
||||||
|
input_variables=["entity1", "entity2", "entity3"],
|
||||||
|
template="Compare {entity1}, {entity2}, and {entity3}."
|
||||||
)
|
)
|
||||||
|
|
||||||
# Generate and print table
|
# Instantiate an LLM (OpenAI). This will not actually call the API
|
||||||
table = generator.generate_comparison_table(args.entities)
|
# unless an OPENAI_API_KEY is set. We guard against missing key.
|
||||||
print(table)
|
openai_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
if not openai_key:
|
||||||
|
print("\nOPENAI_API_KEY not set. Skipping LLM call.")
|
||||||
|
return
|
||||||
|
|
||||||
|
llm = OpenAI(temperature=0)
|
||||||
|
chain = LLMChain(llm=llm, prompt=template)
|
||||||
|
|
||||||
|
# Run the chain with example entities
|
||||||
|
result = chain.run(
|
||||||
|
entity1="Apple",
|
||||||
|
entity2="Microsoft",
|
||||||
|
entity3="Google"
|
||||||
|
)
|
||||||
|
print("\nLLM comparison result:")
|
||||||
|
print(result)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
Reference in New Issue
Block a user